Работа с WP_Query: Использование цикла

Как было сказано в вступительной статье, мы начинаем разбор класса WP_Query. Напомним, что работу с данным классом можно разделить на четыре этапа:

  • передача аргументов запроса
  • выполнение запроса
  • прохождение по результату в цикле
  • завершение: сброс данных постов

В этом уроке мы рассмотрим несколько способов использования циклов, для прохождения по результатам запроса WP_Query.

Циклы

Без цикла невозможно отобразить контент страницы.

Итак, цикл состоит из следующих этапов:

  • if( $query->have_posts() ) проверяет наличие результата.
  • while( $query->have_posts() ) выполняет внутренний код для каждого поста, полученного в результате выполнения запроса.
  • $query->the_post() осуществляет доступ к посту.

Пример рабочего цикла с использованием класса WP_Query:

<?php

$args = array(
    // аргументы
);

// Собственный запрос
$query = new WP_Query( $args );

// Проверка на наличие результата
if ( $query->have_posts() ) {

    // Прохождение по результатам в цикле
    while ( $query->have_posts() ) {

        $query->the_post();

    }

}

// Восстановление оригинальных данных запроса
wp_reset_postdata();

?>

После цикла следует вызвать функцию wp_reset_postdata().

Структура цикла

Структура цикла напрямую зависит от данных, которые вы хотите вывести. Вот пример вывода названия постов, изображения и выдержки.

<?php

$args = array(
    // аргументы.
);

// Собственный запрос.
$query = new WP_Query( $args );

// Проверка на наличие результата.
if ( $query->have_posts() ) {

    // Прохождение по результатам в цикле.
    while ( $query->have_posts() ) {

        $query->the_post();

        ?>

        <article id="post-<?php the_ID(); ?>" <?php post_class( 'left' ); ?>>
            <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                <?php post_thumbnail( 'thumbnail' );?>
            </a>
            <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                <?php the_title(); ?>
            </a>
            <?php the_excerpt(); ?>
        </article>

        <?php

    }

}

// Восстановление оригинальных данных запроса.
wp_reset_postdata();

?>

Детали: проверка наличия контента

Теперь мы хотим вывести заголовок перед списком постов или обернуть их в какой-то отдельный html элемент. Если мы просто выведем этот код перед циклом, то он будет отображён в любом случае: есть посты или нет.

Чтобы этого избежать, можем осуществить проверку, воспользовавшись условным выражением if:

<?php

$args = array(
    // аргументы.
);

// Собственный запрос.
$query = new WP_Query( $args );

// Проверка на наличие результата.
if ( $query->have_posts() ) {


    echo '<section class="clear">';
        echo '<h2>' . __( 'Heading', 'tutsplus' ) . '</h2>';

        // Прохождение по результатам в цикле.
        while ( $query->have_posts() ) {

            $query->the_post();

            ?>

            <article id="post-<?php the_ID(); ?>" <?php post_class( 'left' ); ?>>
                <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                    <?php post_thumbnail( 'thumbnail' );?>
                </a>
                <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                    <?php the_title(); ?>
                </a>
                <?php the_excerpt(); ?>
            </article>

            <?php

        }

    echo '</section>';

}

// Восстановление оригинальных данных запроса.
wp_reset_postdata();

?>

Сначала мы проверяем наличие постов, выводим заголовок, а затем и сами посты.

Эта техника может пригодиться если мы хотим вывести список постов какой-то категории. Элемент ul будет располагаться перед циклом, но после проверки на наличие результатов запроса:

<?php

$args = array(
    'category_name' => 'category-slug',
    'post_type' => 'post'
);

// Собственный запрос.
$query = new WP_Query( $args );

// Проверка на наличие результата.
if ( $query->have_posts() ) {

    echo '<ul class="category posts">';

        // Прохождение по результатам в цикле.
        while ( $query->have_posts() ) {

            $query->the_post();

            ?>

            <li <?php post_class( 'left' ); ?>>
                <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                    <?php the_title(); ?>
                </a>
            </li>

            <?php

        }

    echo '</ul>';

}

// Восстановление оригинальных данных запроса.
wp_reset_postdata();

?>

Запуск дополнительных запросов

Важно знать, что для многократного использования класса WP_Query на одной и той же странице, после каждого запроса следует запускать очистку. Затем для последующих запросов необходимо создать отдельный объект WP_Query.

В данном примере мы выводим изображение только для первого поста, а для всех последующих только название:

<?php

// Параметры первого запроса.
$args1 = array(
    'post_type' => 'post',
    'posts_per_page' => '1'
);

// Выполнение первого запроса.
$query1 = new WP_Query( $args1 );

// Проверка наличия постов.
if ( $query1->have_posts() ) {

    // Цикл по результату.
    while ( $query1->have_posts() ) {

        $query1->the_post();

        ?>

        <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
            <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                <?php post_thumbnail( 'thumbnail' );?>
            </a>
            <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                <?php the_title(); ?>
            </a>
            <?php the_excerpt(); ?>
        </article>

        <?php

    }

}

// Очистка данных.
wp_reset_postdata();

// Параметры второго запроса.
$args2 = array(
    'offset' => '1',
    'post_type' => 'post'
);

// Выполнение второго запроса.
$query2 = new WP_Query( $args2 );

// Проверка наличия результата.
if ( $query2->have_posts() ) {

    echo '<ul class="more-posts">';

        // Цикл по результату.
        while ( $query2->have_posts() ) {

            $query2->the_post();

            ?>

            <li <?php post_class(); ?>>
                <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                    <?php the_title(); ?>
                </a>
            </li>

            <?php

        }

    echo '</ul>';

}

// Очистака данных.
wp_reset_postdata();

?>

В этом примере использовались запросы с следующими параметрами:

  • 'posts_per_page' => '1', в первом запросе, вывод самого свежего поста.
  • 'offset' = '1', во втором запросе, смещение на один запрос, который уже был извлечён на первом шаге.

Как видно из листинга запросы очень схожи, только в первом случаем мы извлекаем не только заголовок, но и краткое описание с изображением, а во втором только заголовки, помещённые в элемент списка ul и li.

Прошу заметить, что после каждого запроса я вызывал функцию wp_reset_postdata(). Если этого не сделать, то в результат второго запросы был бы идентичен результату первого запроса.

Заключение

Без цикла, WP_Query абсолютно бесполезен. В цикле как раз и происходит вывод данных, которые мы хотим видеть на странице.

В этом уроке мы рассмотрели несколько примеров использования цикла: простой вывод данных; вывод, используя связку if( $query->have_posts() ) и while( $query->have_posts() ). Так же нами был рассмотрен пример отправки запросов с параметрами.

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: http://code.tutsplus.com/tutorials/mastering-wp_query-using-the-loop--cms-23031
Перевел: Станислав Протасевич
Урок создан: 6 Октября 2015
Просмотров: 5967
Правила перепечатки


5 последних уроков рубрики "Wordpress"

^ Наверх ^