Использование запросов WP_Query в WordPress в теории и примерах — часть 1 (введение)

Класс WP_Query — это мощный инструмент, с помощью которого можно максимально контролировать отправку запросов к базе данных в сайтах на CMS WordPress. Он является одним из самых мощных API, которым владеет этот популярный двигатель.

Поскольку данная тема очень большая и объемная, ее рассмотрение будет разделено на несколько отдельных подтем в серии. А в сегодняшнем уроке мы приступим к обзору запросов WP_Query в WordPress и проведем вводное ознакомление с этим инструментом.

 

Начало освоения запросов WP_Query у ВордПресс

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

По умолчанию WordPress «в фоновом режиме» уже выполняет такие запросы на каждой текущей странице — с учетом используемого типа публикации и/или ее иерархии. К примеру, если просматривается статическая страница (тип page), WordPress запускает запрос для отображения страницы с соответствующим ID (идентификатором), а если просматривается архивная страница (категория, теги, по дате и т.д.) результатом запроса будут все публикации данного типа архивов.

Но если мне как программисту не нужен дефолтный запрос, а нужно что-то более уникальное? Например, чтобы выбрать из базы данных 5 последних записей определенной категории? Краткий ответ – это не проблема с использованием класса WP_Query и его огромным количеством параметров! С его помощью вы можете показывать именно тот контент, который вам нужен!

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

 

Что такое WP_Query?

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

Класс WP_Query состоит из четырех основных компонентов:

  1. аргументы для запроса с использованием параметров
  2. непосредственно сам запрос
  3. работа с результирующим циклом (заголовки, даты, контент и т.д.)
  4. завершение запроса и сброс данных публикации (глобального $post)

 

На практике примерный вид запроса может выглядеть приблизительно так:

<?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(); — это очень важно, поскольку запрос должен возвращаться в первоначальное состояние (основной запрос, выполняемый на этой странице). Это условие возникает вследствие того, что на одной странице может быть множество запросов, и поэтому они могут конфликтовать, а вы получите совсем не те результаты, которых ожидали.

 

Зачем использовать WP_Query, если есть другие методы?

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

Чтобы создать собственный запрос к базе данных, в вашем распоряжении есть не только WP_Query, ведь это не единственный метод и есть еще четыре:

  1. pre_get_posts – очень эффективный хук, если вам нужно изменить (модифицировать) основной запрос. Должен быть в самом начале вашего запроса. Нельзя использовать для создания абсолютно нового запроса.
  2. get_posts() — этот тег в шаблонах фактически использует класс WP_Query, но является промежуточным дополнительным звеном, чтобы делать запрос постов.
  3. get_pages() — также, как и предыдущий тэг, дополнительно вызывает класс WP_Query для запроса страниц вместо того, чтобы делать это напрямую.
  4. query_posts() — изменяет основной запрос, отбрасывая его и начиная с самого начала (что может отрицательно влиять на время загрузки страницы). При необходимости в изменении основного запроса лучше использовать вместо него pre_get_posts. А если есть необходимость в совершенно новом запросе, тогда лучше всего использовать непосредственно WP_Query.

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

 

Ниже можно графически представить себе работу класса WP_Query по запросу в базу данных. Данная инфографика навеяна работой Андрея «Rarst» Савченко.

Схематическая работа функций запросов к базе данных в CMS WordPress:

 

Когда использовать WP_Query?

Перечислить все варианты использования WP_Query невозможно, но к основным способам можно отнести следующее:

  • для более настраиваемого получения перечня последних сообщений в сайдбаре (или футере), в отличие от тематического виджета «Последние публикации»
  • если вам нужно привести список связанных публикаций под текущей публикацией (например, из той же категории)
  • если вам нужно использовать более одного запроса на странице (например, отдельные списки постов вверху и внизу сайта, в сайдбаре и т.д.)
  • если вам нужно создать специальные запросы с использованием нескольких таксономий (категории, теги, меню и т.д.)
  • если дефолтный запрос вас не удовлетворяет (например, если вам нужны специфические типы публикаций, таких как вложения — attachment и т.д.)

 

Потенциальные подводные камни, некоторые оговорки, о чем следует знать

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

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

 

 

Вместо краткого вывода

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

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

 

Recent Posts

Как добавить свой текстовый блок перед формой комментариев в WordPress

Блок комментирования в сайтах CMS WordPress можно отнести к одной из важнейших составляющих ресурса. Комментарии…

8 часов ago

Билл Гейтс

Люди всегда переоценивают изменения за неделю, и недооценивают возможные достижения за год Билл Гейтс  

4 дня ago

Как исключить страницы из результатов поиска WordPress

Одной из замечательных особенностей платформы WordPress есть внутренний поиск. Однако функция поиска в CMS ВордПресс…

6 дней ago

Основные задачи болотного экскаватора: где и для чего он используется

Болотный экскаватор – это специализированная техника, предназначенная для работы в условиях повышенной влажности, на болотистых…

2 недели ago

Почему пластинчатые теплообменники являются оптимальным выбором для промышленности

Промышленные системы теплопередачи нуждаются в эффективных, надежных и экономичных решениях. Одним из наиболее распространенных и…

2 недели ago

Зигмунд Фрейд

Когда ты умер, ты об этом не знаешь. Только другим тяжело. То же самое, когда…

2 недели ago