Изучаем WP_Query: Введение

По умолчанию, WordPress делает запросы (query) на каждой странице, отображаемой на вашем сайте, и запросы эти отличаются в зависимости от типа страниц. Если в данный момент просматривается статичная страница, то выполняется запрос для отображения страницы с соответствующим ID. Но если пользователь открыл страницу архива, то будет послан запрос на извлечение всех записей из этого архива.

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

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

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

  • Что такое WP_Query;
  • Для чего нужен этот класс;
  • Потенциальные проблемы, о которых следует знать.

Что такое WP_Query?

WP_Query – это класс в WordPress, что позволяет использовать его для быстрого доступа к переменным и функциям ядра WordPress, без необходимости писать код вручную.

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

WP_Query состоит из 4 основных элементов:

  • Аргументы для запроса, использующие параметры, о которых мы поговорим более детально в последующих статьях из этой серии;
  • Сам запрос;
  • Цикл, который выводит содержимое записи, заголовки или все то, что вам нужно вывести на экран;
  • Заключительная секция: здесь закрываются теги if и while, а также сбрасываются данные записи.

На практике это выглядит следующим образом:

<?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() после каждого запроса. Это важно, так как сбрасывает запрос до исходного состояния.

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

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

Для чего нужен WP_Query?

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

Почему WP_Query, а не другие доступные методы?

WP_Query – это не единственный метод создания произвольных запросов. Есть еще как минимум 4 метода:

  • pre_get_posts;
  • get_posts();
  • get_pages();
  • query_posts().

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

  • pre_get_posts – это хук, который изменяет основной запрос. Его можно использовать с условным тегом для проверки на предмет просмотра определенного типа страниц (например, главной страницы), а затем использовать его для запуска запроса, который, в свою очередь, запускает скрипт удаления трех последних записей (для примера). Это эффективный способ изменения основного запроса, и его следует использовать, если вам требуется реализовать нечто подобное. Но его нельзя применять для создания полностью нового запроса;
  • get_posts() и get_pages() — похожи, но отличаются не только названием, но и предназначением. Эти теги шаблонов также используют класс WP_Query, так что это лишь дополнительный способ реализации. Но при их использовании нам придется делать на одно действие больше, так как они запускают класс WP_Query, а вы можете сделать это напрямую. Их можно использовать для создания запроса к записям или страницам, а WP_Query является более мощным средством, и позволяет вытащить из базы данных практически что угодно;
  • query_posts() также изменяет основной запрос, но я не рекомендую вам его использовать в плагинах или темах оформления. Он просто выкидывает основной запрос, заменяя его новым. Это способствует появлению ошибок, особенно в пагинации. Также он отрицательно сказывается на скорости загрузки страниц. Если вам нужно изменить основной запрос, лучше используйте pre_get_posts, для создания нового — WP_Query.

Эта диаграмма отображает все вышесказанное:

query_functions

Когда нам можем понадобиться WP_Query

Есть множество сценариев, когда нам может пригодиться WP_Query:

  • При добавлении списка рекомендованных записей под текущей записью. Например, список записей из этой же категории;
  • Для создания двух циклов на одной и той же странице;
  • Для создания произвольного списка свежих записей в боковой панели или подвале страницы, когда стандартный виджет не отвечает вашим требованиям;
  • При создании произвольных запросов для таксономий с использованием более одной таксономии для определения того, что было отображено.;
  • При запросе типа записи (post type), который невозможно извлечь при помощи стандартного запроса. Например, загруженные файлы;
  • Для создания произвольных страниц с несколькими запросами для разных типов контента.

Некоторые предостережения

Что следует учитывать при использовании WP_Query:

  • Если вам нужно лишь изменить отображение записей в рамках конкретного типа контента или архива, то я не рекомендую использовать WP_Query. Вместо этого лучше создайте файл шаблона для этого архива или типа контента, и поработайте над циклом в этом файле;
  • Если вам нужно показать больше или, наоборот, меньше записей на странице архива (например, избавиться от определенной категории), то не используйте WP_Query для создания новых запросов. Лучше воспользуйтесь pre_get_posts для изменения основного запроса, а также условными тегами для вывода;
  • Старайтесь не запускать несколько запросов на одной странице. Теоретически вы можете создать страницу с сотнями произвольных запросов, но подумайте о нагрузке на сервер. Если вам необходимо использовать более 4-5 запросов на одной странице, то лучше создать несколько страниц.

В завершение

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

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

Перевод статьи “Mastering WP_Query: An Introduction” был подготовлен дружной командой проекта Сайтостроение от А до Я.