Все статьи данной серии нацелены на изучение специфики использования WP_Query для создания пользовательских запросов.

В большинстве случаев, мы используем WP_Query с новыми аргументами, отделенными от основного запроса. Но что, если вы хотите включить в свои аргументы основной запрос?

Такая необходимость может возникнуть в следующих случаях:

  • На странице категории или таксономии, где отображаются записи только одного типа;
  • На странице категории, где отображаются записи текущей категории и еще одной категории, либо записи с меткой или термином таксономии;
  • На странице типа записи, где отображаются записи с конкретными метаданными.

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

Как это работает на практике мы рассмотрим на трех примерах. Первый будет достаточно простым: здесь будет задействован всего лишь один цикл; во втором мы воспользуемся оператором foreach для вывода нескольких циклов, по одному для каждого типа записи; а в третьем мы выведем два типа записи в архиве категории с помощью двух отдельных запросов.

Получение переменной основного запроса

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

И сделать это нужно до определения аргументов WP_Query:


$mainquery = get_queried_object();

Функция get_queried_object() возвращает текущий объект запроса в любом его виде. Если речь идет об отдельной странице, то возвращается объект записи; если об архиве, то возвращается категория, метка, объект термина и т.д. Функция возвращает ID запрашиваемого объекта.

Переменную $mainquery можно использовать в аргументах WP_Query. Теперь посмотрим на примеры, о которых мы упоминали выше.

Выводим записи только одного типа на странице категории

Предположим, у вас есть пользовательский тип записи и к нему вы подключили категории. При этом вы не хотите выводить записи из каждой категории архива. Вам нужно вывести записи нового типа, назовем его product.

Ваш запрос будет выглядеть таким образом:


?php

$mainquery = get_queried_object();
$args = array (
   'category_name' => $mainquery->slug,
   'post_type' => 'product'
);

// Модифицированный запрос.
$query = new WP_Query( $args );

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

   // Запуск цикла по результатам запроса.
   while ( $query->have_posts() ) {

      $query->the_post();
      // вывод содержимого.

   }
}

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

?>

Поскольку параметр category_name, использованный выше, принимает слаг категории в качестве ее аргумента, нужно добавить ->slug после переменной для того, чтобы получить слаг категории.
Это позволит создать запрос, который извлекает записи типа product из текущей категории. Его можно использовать в шаблоне страницы category.php.

Примечание: аналогичный результат можно получить, используя хук pre_get_posts для изменения основного запроса и условную функцию для проверки архивов категорий.

Совмещаем основной запрос с WP_Query и оператором foreach для вывода множественных циклов

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

Это значит, что типы записи с помощью CSS можно рассортировать на странице по блокам либо столбцам, или же просто разбить их на несколько списков.

Для этого используйте следующий код:


<?php 
$mainquery = get_queried_object(); 
$post_types = get_post_types(); 
foreach ($post_types as $post_type ) { 
   $args = array( 
      'category_name' => $mainquery->slug,
      'post_type' => $post_type
);

// Модифицированный запрос.
$query = new WP_Query( $args );

// Проверка наличие результатов запроса.
if ( $query->have_posts() ) 
   {
   // Запуск цикла по результатам запроса.
   while ( $query->have_posts() ) 
      {
      $query->the_post();
      // вывод содержимого.
      }

   }

// Восстановление оригинального запроса.
wp_reset_postdata();
}
?>

Здесь мы снова используем переменную $mainquery, но при этом добавляем переменную $post_types для хранения всех типов записи, зарегистрированных на сайте, и переменную $post_type для хранения каждого отдельного типа записи.

Используем два отдельных цикла для двух типов записи

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

Допустим, на вашем сайте зарегистрирован тип записи product с несколькими категориями и есть блог с записями с такими же категориями. На каждой странице архива категории мы выведем последние 10 записей, а затем список всех товаров из одной и той же категории.

Для этого вам понадобится следующий код:


<?php $mainquery = get_queried_object(); 
// Параметры первого запроса. 
$args = array ( 
'category_name' => $mainquery->slug,
'post_type' => 'post',
'posts_per_page' => '10'
);

// Модифицированный запрос.
$query = new WP_Query( $args );

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

   // Запуск цикла по результатам запроса.
   while ( $query->have_posts() ) {
      $query->the_post();
      // вывод содержимого.
}
}

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

// Параметры второго запроса.
$args = array (
   'category_name' => $mainquery->slug,
   'post_type' => 'product',
   'posts_per_page' => '-1'
);
// Модифицированный запрос.
$query = new WP_Query( $args );
// Проверка наличие результатов запроса.
if ( $query->have_posts() ) {
   // Запуск цикла по результатам запроса.
   while ( $query->have_posts() ) {
      $query->the_post();
      // вывод содержимого.
}
}

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

Для каждого типа записи мы используем отдельный цикл.

Заключение

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

Эти же фрагменты кода можно использовать и для других типов архива: архивов таксономии, авторов, дат и т.д.

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.