Работа с WP_Query: Вступление

29 Мая 2022г. в 04:33

По умолчанию, каждый раз когда вы открываете страницу, WordPress запускает запрос, который вернёт нужное содержание. В случае просмотра статической страницы, контент будет извлечён согласно ID; если же вы открываете страницу архива, то будут затронуты все записи, связанные с данным архивом.

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

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

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

В этом вступительном уроке мы разберём:

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

Если хотите взглянуть на сам код WP_Query, то его можно найти, открыв файл includes/query.php.

Работа с WP_Query будет осуществляться в четыре этапа:

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

01
<?php
02

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

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

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

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

16
$query->the_post();
17

18
}
19

20
}
21

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

25
?>
Аргументы можно передать непосредственно при создании класса, но я предпочитаю разделять эти вещи.

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

К примеру, если вы используете WP_Query в сайдбаре, то вызов wp_reset_postdata(), условно говоря, сообщит WordPress что для вывода контента страницы должен быть использован запрос по умолчанию.

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

Выгоды от использования WP_Query?
Если вы до сих пор не работали с классом WP_Query, то наверняка хотите знать по каким причинам стоит начать это делать. Я бы хотел остановиться на двух аспектах: почему для выполнения запросов стоит использоваться WP_Query и в каких случаях это может пригодиться.

Преимущество класса WP_Query
WP_Query это не единственный инструмент с помощью которого можно опросить базу данных на наличие тех или иных постов. Есть ещё:

pre_get_posts
get_posts()
get_pages()
query_posts()
Я не буду углубляться в подробности, но в общих чертах:

pre_get_posts - это хук, который модифицирует основной запрос. Вы можете использовать его с условным тегом для проверки отображения какого-то конкретного типа страницы (к примеру, главной), а затем преобразовать содержимое (к примеру удалить ссылки на связные посты). Минус в том, что вы не можете создать гибкий запрос по нужным вам критериям.
get_posts() и get_pages() очень похожи; различие видно из названия. Эти шаблонные теги используют класс WP_Query, точнее говоря, осуществляют вызов за вас. В результате вы можете вывести только страницы или посты, в то время как WP_Query позволяет осуществить доступ ко всей базе.
query_posts() модифицирует основной запрос, но его не стоит использовать в плагинах и темах. Причин несколько: замена основного запроса, возможные ошибки, в частности с разбиением информации по страницам, негативное влияние на скорость загрузки страницы. Если вам нужно преобразовать основной запрос, то для этого лучше воспользоваться методом pre_get_posts, а для создания абсолютно нового запроса воспользоваться классом WP_Query.
Для наглядности процессов, используемых в Wordpress, можете взглянуть на диаграмму:



Когда следует использовать WP_Query
Существует множество ситуаций, когда вам может пригодиться класс WP_Query:

Для добавления списка всех связных постов — к примеру все посты данной категории.
Для создания двух циклов на одной и той же странице: к примеру вывода заголовков ЧАВО и ответов в другой части страницы.
Для вывода свежих постов в сайдбаре или футере.
Для вывода таксономии Wordpress по заданным параметрам.
Для извлечения типов постов, которые не выводятся по умолчанию, такие как вложения.
Для создания страниц с постами из определённого набора категорий.
Предостережения
Класс WP_Query безусловно крут. В моей практике он используется практически везде и всегда. Однако и у него есть свои минусы. Следует знать:

Если вы хотите просто изменить порядок отображения постов, то использовать WP_Query не нужно. Вместо этого создайте шаблон для нужного вам архива или типа контента, и измените цикл вывода информации.
Если вы хотите преобразовать количество материалов, которые выводятся на страницу, то тоже не следует использовать WP_Query. Вместо этого лучше воспользоваться pre_get_posts для преобразования основного запроса.
Теоретически вы можете создать хоть сотни запросов, но не забывайте, что это негативно отразится на скорости загрузки страницы.
Заключение
Класс WP_Query - это прекрасный инструмент, которым вы можете воспользоваться для отображения информации именно в том виде, в котором необходимо. В то же время нами были рассмотрены ситуации, когда можно воспользоваться и другими методами.

В последующих частях разберём различные детали, связанные с классом WP_Query.