Как изменить цикл для jQuery-слайдера (слайды)
Я пытаюсь сделать слайдер, который берет миниатюры из определенного типа записей и отображает по четыре из них на каждом "слайде". Сам слайдер и миниатюры работают как надо, но я не уверен, как изменить цикл, чтобы он отображал 4 поста в одном контейнере, затем следующие 4 поста и так далее.
Мой цикл выглядит так:
<div id="slides">
<div class="slides_container">
<?php $loop = new WP_Query(array('post_type' => 'fastighet', 'posts_per_page' => -1, 'orderby'=> 'ASC')); ?>
<?php while ( $loop->have_posts() ) : $loop->the_post(); ?>
<div class="slide">
<?php $url = get_post_meta($post->ID, "url", true);
if($url!='') {
echo '<a href="'.$url.'">';
echo the_post_thumbnail('admin-list-thumb');
echo '</a>';
} else {
echo the_post_thumbnail('admin-list-thumb');
} ?>
<div class="caption">
<h5><?php the_title(); ?></h5>
</div>
</div>
<?php endwhile; ?>
<?php wp_reset_query(); ?>
</div> <!-- конец .slides_container -->
<a href="#" class="prev">пред</a>
<a href="#" class="next">след</a>
</div> <!-- конец .slides -->
Каждый div с классом slide становится слайдом, как видно. Но как сделать так, чтобы в каждый такой слайд помещалось 4 поста, затем следующие 4 поста в другой слайд и так далее.
Любая помощь или советы будут очень appreciated!
Попробовал очень простую математику. <div class="slide">
будет выводиться после каждых 4 постов. Так что условие с классической логикой $i%4 == 0
<div class="slides_container">
<?php
$args = array(
'post_type' => 'fastighet',
'numberposts' => -1,
'orderby' => 'ASC'
);
$posts = get_posts($args);
?>
<?php $i = 0; foreach($posts as $post): ?>
<?php if($i%4 == 0): ?>
<div class="slide">
<?php endif;
$url = get_post_meta($post->ID, "url", true);
if($url) {
echo '<a href="'.$url.'">';
echo the_post_thumbnail('admin-list-thumb');
echo '</a>';
} else {
echo the_post_thumbnail('admin-list-thumb');
} ?>
<div class="caption">
<h5><?php the_title(); ?></h5>
</div>
<?php if($i%4 == 3): ?></div> <!--конец .slide--><?php endif; ?>
<?php $i++; endforeach; ?>
</div> <!-- конец .slides_container -->
Дайте знать, как получилось. Спасибо!

Кажется, я по-прежнему получаю только одно изображение на слайд по какой-то причине. Также миниатюры никуда не ведут, хотя должны ссылаться на каждый пост.

Да, я заметил пропущенный <?php и добавил его. Но ничего не изменилось. По-прежнему только один слайд на изображение :/

Я обновил свой код, чтобы некоторые другие вещи заработали. Но по-прежнему получаю только одно миниатюрное изображение на слайд.

Попробуй вывести $i
, чтобы проверить, увеличивается ли значение. Сколько результатов ты получаешь? У тебя есть несколько записей для отображения, верно?

@Sisir: Я не знаю, как это сделать. Что именно я должен ввести?
Вероятно, что-то не так в коде, он не генерирует div'ы как должен. Взгляните на это: http://i.imgur.com/avdcs.png

Добавьте echo 'Значение $i: '.$i
перед $i++
, вы должны увидеть увеличивающееся значение $i
. И попробуйте отключить javascript и посмотреть, не изменяет ли javascript div.

Где я должен вывести это? Где-то внутри цикла? Если я выведу это значение перед endwhile, я получу: Значение $i: 0 Значение $i: 1 Значение $i: 2
Слайд-шоу работает как задумано, если я заменю часть цикла wordpress на статический html. Это заставляет меня думать, что проблема всё ещё в цикле.

$i
инкрементится нормально. Я изменил код. Теперь использовал get_posts()
. Проверь, повезёт ли нам на этот раз :) Если не сработает - заходи в чат "Stoppress" http://chat.stackexchange.com/rooms/6/stoppress

Кажется, я не могу писать в чате. Нужно 20 репутации. Когда-нибудь! :D Есть ли другой способ написать вам на этом сайте? Я не могу найти.

давайте продолжим это обсуждение в чате

Проблема с кодом, похоже, в том, что вместо того, чтобы размещать 4 элемента в слайде, затем создавать новый слайд и т.д... код приводит к тому, что каждый четвертый элемент оказывается в слайде.

Ваш текущий код с небольшими корректировками дал мне именно то, что я хотел. Спасибо!

Почти правильно. Единственная проблема заключалась в том, что на самом деле не нужно выводить и открывающий, и закрывающий тег на одном и том же индексе. Следующий код работает у меня в похожей ситуации. Единственное реальное изменение — $i начинается с 1, и теги открытия и закрытия слайдов выводятся на разных счетах.
Также позволил себе немного очистить код.
<div id="slides">
<div class="slides_container">
<?php
$loop = new WP_Query( array(
'post_type' => 'fastighet', // Тип записи - недвижимость
'posts_per_page' => -1 // Получить все записи
) );
$i = 1; // Начинаем счет с 1
while ( $loop->have_posts() ) :
$loop->the_post();
if( $i % 4 == 1 ) : // Если остаток от деления на 4 равен 1 (1,5,9...)
?>
<div class="slide"> // Открываем новый слайд
<?php
endif;
?>
<div class="fastighet-slider-entry">
<a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_post_thumbnail(); ?></a>
<div class="caption">
<h5><?php the_title(); ?></h5>
</div>
</div> <!-- конец .fastighet-slider-entry -->
<?php
if( $i % 4 == 0 ) : // Если остаток от деления на 4 равен 0 (4,8,12...)
?>
</div> // Закрываем слайд
<?php
endif;
++$i; // Увеличиваем счетчик
endwhile;
wp_reset_query(); // Сбрасываем запрос
?>
</div> <!-- конец .slides_container -->
<a href="#" class="prev">назад</a>
<a href="#" class="next">вперед</a>
</div> <!-- конец .slides -->
