Как изменить цикл для jQuery-слайдера (слайды)

7 мар. 2012 г., 10:30:12
Просмотры: 2.15K
Голосов: 2

Я пытаюсь сделать слайдер, который берет миниатюры из определенного типа записей и отображает по четыре из них на каждом "слайде". Сам слайдер и миниатюры работают как надо, но я не уверен, как изменить цикл, чтобы он отображал 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!

1
Комментарии

Поскольку вы уже знаете, как запрашивать свои записи и как возвращать их миниатюры, остаётся лишь вопрос PHP, а не WordPress.

Chip Bennett Chip Bennett
7 мар. 2012 г. 14:38:52
Все ответы на вопрос 2
17

Попробовал очень простую математику. <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 -->

Дайте знать, как получилось. Спасибо!

7 мар. 2012 г. 10:45:39
Комментарии

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

Johan Dahl Johan Dahl
7 мар. 2012 г. 11:07:51

@JohanDahl: в моем коде была ошибка. Исправил. Попробуй теперь.

Sisir Sisir
7 мар. 2012 г. 11:15:28

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

Johan Dahl Johan Dahl
7 мар. 2012 г. 11:20:18

@JohanDahl Типа как сейчас?

kaiser kaiser
7 мар. 2012 г. 11:22:39

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

http://pastebin.com/WbERsyUH

Johan Dahl Johan Dahl
7 мар. 2012 г. 11:33:01

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

Sisir Sisir
7 мар. 2012 г. 11:36:52

@Sisir: Я не знаю, как это сделать. Что именно я должен ввести?

Вероятно, что-то не так в коде, он не генерирует div'ы как должен. Взгляните на это: http://i.imgur.com/avdcs.png

Johan Dahl Johan Dahl
7 мар. 2012 г. 11:58:22

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

Sisir Sisir
7 мар. 2012 г. 12:12:19

Где я должен вывести это? Где-то внутри цикла? Если я выведу это значение перед endwhile, я получу: Значение $i: 0 Значение $i: 1 Значение $i: 2

Слайд-шоу работает как задумано, если я заменю часть цикла wordpress на статический html. Это заставляет меня думать, что проблема всё ещё в цикле.

Johan Dahl Johan Dahl
7 мар. 2012 г. 12:23:35

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

Sisir Sisir
7 мар. 2012 г. 12:44:09

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

Johan Dahl Johan Dahl
7 мар. 2012 г. 13:01:08

Теперь можешь! ;)

Sisir Sisir
7 мар. 2012 г. 13:07:00

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

Sisir Sisir
7 мар. 2012 г. 13:08:47

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

Johan Dahl Johan Dahl
8 мар. 2012 г. 13:22:20

@johanDahl: пожалуйста, попробуйте сейчас.

Sisir Sisir
8 мар. 2012 г. 20:29:33

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

Johan Dahl Johan Dahl
14 мар. 2012 г. 14:56:48

рад, что сработало!

Sisir Sisir
14 мар. 2012 г. 18:21:08
Показать остальные 12 комментариев
0

Почти правильно. Единственная проблема заключалась в том, что на самом деле не нужно выводить и открывающий, и закрывающий тег на одном и том же индексе. Следующий код работает у меня в похожей ситуации. Единственное реальное изменение — $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 -->
7 мар. 2012 г. 16:07:09