Этот урок является продолжением серии о работе с запросами к базе данных WP_Query в ВордПресс. В нем мы сосредоточимся на использовании и правильном подходе к циклам в запросе: в частности, рассмотрим важность цикла, основные способы работы с ним, использование нескольких циклов, а также посмотрим на наиболее популярные функции получения данных внутри цикла.
Без цикла на странице сайта ничего не будет показываться (из результатов запроса). После того, как WordPress выполнит запрос, необходимо явно указать, что нужно показывать из тех данных, которые он получил в этом запросе. И именно здесь на сцену выходит цикл.
Цикл связан с вашим запросом и для своей работы опирается на три основных момента:
if( $query->have_posts() )
проверяет, есть ли в результате запроса какие-либо публикации (посты, страницы и т.д.). Она берет значение свойства post_count
по нашему запросу и сравнивает со значением условия current_post + 1
.while( $query->have_posts() )
проходит циклом по каждой публикации, имеющейся в массиве полученных результатов запроса. В этом методе автоматически идет перемотка цикла, опираясь на переменные и свойства, указанные в предыдущем пункте. Это без лишних шагов с нашей стороны (как программистов) позволяет нам обнаруживать наличие публикаций в цикле.$query->the_post()
получает доступ к конкретной публикации в массиве. Вдобавок она работает со счетчиком в массиве, а также настраивает глобальные данные публикации.Заметьте, что вы должны вызывать метод have_posts()
только внутри цикла, в противном случае вы застрянете в бесконечном цикле!
Вот как выглядит применение класса WP_Query
в сочетании с циклом:
<?php $args = array( // массив аргументов для запроса ); // создание нового экземпляра класса – нового объекта, запроса $query = new WP_Query( $args ); // проверка на наличие результатов для этого запроса if ( $query->have_posts() ) { // прохождение циклом по результатам запроса while ( $query->have_posts() ) { $query->the_post(); // здесь контент публикации результата } } // обязательное восстановление (сброс) глобальной переменной $post wp_reset_postdata(); ?>
После обработки цикла остается только навести порядок с помощью wp_reset_postdata()
.
Цикл можно структурировать разными способами, что зависит в основном от того, какие данные публикации вам нужно показывать. Ниже представлен практический пример цикла, с помощью которого мы можем показать название публикации (ее заголовок), прикрепленное изображение (featured image, thumbnail, мини-изображение поста) и краткое описание (отрывок, excerpt) в виде макета card из фреймворка Bootstrap. Такой цикл можно было бы использовать на архивной странице определенных публикаций:
<?php $args = array( // массив аргументов для запроса ); // создание нового экземпляра класса – нового объекта, запроса $query = new WP_Query( $args ); ?> <div class="row row-cols-1 row-cols-md-3 g-4"> <?php // проверка на наличие результатов для этого запроса if ( $query->have_posts() ) { // прохождение циклом по результатам запроса while ( $query->have_posts() ) { $query->the_post(); // далее следует показ контента каждой отдельной публикации ?> <div id="post-<?php the_ID(); ?>" <?php post_class('card'); ?>> <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"> <?php the_post_thumbnail('thumbnail', array('class' => 'card-img-top'))); ?> <div class="card-body"> <h3 class="card-title"><?php the_title(); ?></h3> <div class="card-text"><?php the_excerpt(); ?></div> </div> </a> </div> <?php } } ?> </div> <?php // восстановление данных глобальной переменной $post wp_reset_postdata(); ?>
Пример такого цикла отражает именно то, о чем сказано выше: мини-картинку публикации, заголовок и отрывок в формате контейнера карточки (card), стилизованной фреймворком Bootstrap.
Как следует из предыдущего примера, мы проверяем только условие наличия публикаций в результате запроса. Но внутри цикла мы не проверяем данные. Для этого примера можно было бы добавить отдельную проверку, имеет ли публикация «приклеенное изображение» (featured image), поскольку такие ситуации очень часты. Для этого достаточно обернуть элемент картинки в тег if
, например:
<?php … // проверяем, назначена ли публикации картинка миниатюра // если да – тогда показываем ее, иначе – ничего не показывать if ( has_post_thumbnail() ) { the_post_thumbnail('thumbnail', array('class' => 'card-img-top'))); } … ?>
Обратите внимание, что вы можете использовать запрос WP_Query
многократно, но для этого вам нужно сбрасывать глобальные данные и запускать каждый раз новый отдельный экземпляр класса WP_Query
.
Ниже показан пример использования нескольких запросов к базе данных WP_Query
на одной странице: сначала получаем одну публикацию с типом post
(запись), а во втором запросе показываем список ul
с постами кроме первого:
<?php // аргументы первого запроса $args1 = array( 'post_type' => 'post', 'posts_per_page' => '1' ); // первый запрос $query1 = новый WP_Query( $args1 ); // проверка на наличие результатов для этого запроса if ( $query1->have_posts() ) { // прохождение по циклу результатов while ( $query1->have_posts() ) { $query1->the_post(); ?> <div id="post-<?php the_ID(); ?>" <?php post_class('card'); ?>> <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"> <?php the_post_thumbnail('thumbnail', array('class' => 'card-img-top'))); ?> <div class="card-body"> <h3 class="card-title"><?php the_title(); ?></h3> <div class="card-text"><?php the_excerpt(); ?></div> </div> </a> </div> <?php } } // восстановление данных глобальной переменной $post wp_reset_postdata(); ///////////////////////////////////////////////////////////////////////////// // аргументы второго запроса $args2 = array( 'offset' => '1', 'post_type' => 'post' ); // второй запрос $query2 = новый 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>'; } // восстановление данных глобальной переменной $post wp_reset_postdata(); ?>
Обратите внимание на два аргумента в запросах:
'posts_per_page' => '1'
в первом запросе обозначает показ только одного результата и дефолтно свежей публикации (последней в базе данных).'offset' => '1'
во втором запросе показывает количество публикаций, которое указано в настройках сайта и пропускает первую публикацию (которую мы уже получили с первым запросом).
Подобным образом вы можете создать на странице столько запросов с классом WP_Query
, сколько вам потребуется. Но заметьте, что слишком много запросов – это не слишком хорошая идея. Вместо этого лучше создать для этого отдельные страницы, о чем я писал в предыдущем вступительном уроке серии о запросах WP_Query.
Существует много функций с доступом к данным публикации, которые можно вызвать внутри цикла, включительно с дефолтными данными, а также кастомными метаданными (добавленными вами мета-полями к постам). Таких функций много, но давайте рассмотрим наиболее часто используемые:
the_title()
, get_the_title()
и the_title_attribute()
. Функция get_the_title()
просто получает название публикации без дополнительных параметров, в то время как the_title()
может отображать дополнительную разметку вместе с заголовком. Функция the_title_attribute()
производит дополнительно «html-очистку» заголовка перед его показом.the_excerpt()
. Она «фильтрует» контент, чтобы он правильно отображался читателям. Дополнительно, поскольку не каждая публикация владеет отдельно определенным автором отрывком, функция сама создаст сокращенную версию контента публикации перед ее показом. Чтобы отобразить весь контент публикации, воспользуйтесь функцией the_content()
.the_category()
, чтобы отобразить список категорий публикации и the_tags()
для тегов. Функция the_author()
покажет автора текущей публикации в цикле. Чтобы получить (сделать echo
) идентификатор публикации, используйте функцию the_ID()
.the_date()
) и времени (the_time()
) публикации.<img …>
), которая «приклеена» к текущему посту в цикле, используйте функцию the_post_thumbnail()
.
Сегодня мы рассмотрели несколько практических примеров работы с циклами, которые пригодятся вам при построении запросов в базу данных. В дальнейшем мы продолжим исследование запросов классом WP_Query
в ВордПресс.
Класс WP_Query — это мощный инструмент, с помощью которого можно максимально контролировать отправку запросов к…
Алмазная мозаика https://artstreet.com.ua/catalog/almaznaya-mozaika требует бережного обращения как в процессе её создания, так и после завершения…
Семена чиа – это маленькие зернышки, которые включают в себя большое количество полезных веществ. Они…
Вы никогда не пересечете океан, если не наберетесь мужества оставить берег позади Христофор Колумб