Коварная война россии против Украины. Ориентировочные потери врага
(по состоянию на 05.02.2025)
844070
солдат
369
самолетов
331
вертолетов
9947
танков
20721
ББМ
22707
артиллерия
1053
ПВО
1269
РСЗО
36078
машин
28
корабли и катера
Использование запросов WP_Query в WordPress – часть 2 (обзор цикла)
Опубликовано

Использование запросов WP_Query в WordPress – часть 2 (обзор цикла)

 

 

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

 

Что такое цикл и зачем он нужен?

Без цикла на странице сайта ничего не будет показываться (из результатов запроса). После того, как WordPress выполнит запрос, необходимо явно указать, что нужно показывать из тех данных, которые он получил в этом запросе. И именно здесь на сцену выходит цикл.

Цикл связан с вашим запросом и для своей работы опирается на три основных момента:

  1. условная проверка if( $query->have_posts() ) проверяет, есть ли в результате запроса какие-либо публикации (посты, страницы и т.д.). Она берет значение свойства post_count по нашему запросу и сравнивает со значением условия current_post + 1.
  2. цикл while( $query->have_posts() ) проходит циклом по каждой публикации, имеющейся в массиве полученных результатов запроса. В этом методе автоматически идет перемотка цикла, опираясь на переменные и свойства, указанные в предыдущем пункте. Это без лишних шагов с нашей стороны (как программистов) позволяет нам обнаруживать наличие публикаций в цикле.
  3. конструкция $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.

 

К каким данным публикации у меня есть доступ внутри цикла?

Существует много функций с доступом к данным публикации, которые можно вызвать внутри цикла, включительно с дефолтными данными, а также кастомными метаданными (добавленными вами мета-полями к постам). Таких функций много, но давайте рассмотрим наиболее часто используемые:

  1. Имя публикации (ее название). Есть три основные функции, с помощью которых вы можете получить название публикации: the_title(), get_the_title() и the_title_attribute(). Функция get_the_title() просто получает название публикации без дополнительных параметров, в то время как the_title() может отображать дополнительную разметку вместе с заголовком. Функция the_title_attribute() производит дополнительно «html-очистку» заголовка перед его показом.
  2. Отрывок контента (краткое содержание). Для этого существует специальная функция the_excerpt(). Она «фильтрует» контент, чтобы он правильно отображался читателям. Дополнительно, поскольку не каждая публикация владеет отдельно определенным автором отрывком, функция сама создаст сокращенную версию контента публикации перед ее показом. Чтобы отобразить весь контент публикации, воспользуйтесь функцией the_content().
  3. Таксономия публикации (например, ее категории, теги или другие метаданные). Публикации могут иметь одну или несколько категорий, тегов и т.д. Используйте функции the_category(), чтобы отобразить список категорий публикации и the_tags() для тегов. Функция the_author() покажет автора текущей публикации в цикле. Чтобы получить (сделать echo) идентификатор публикации, используйте функцию the_ID().
  4. Получить дату и время публикации. Движок CMS WordPress обладает специальными функциями, которые вы можете использовать в цикле для отображения даты публикации (the_date()) и времени (the_time()) публикации.
  5. Миниатюра публикации. Для вывода полного тега картинки (<img …>), которая «приклеена» к текущему посту в цикле, используйте функцию the_post_thumbnail().

 

 

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

 

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *


Быстрый доступ по сайту SebWeo
Угости меня кофе