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

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

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

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

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

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

  • Что такое WP_Query?
  • Выгоды от использования WP_Query?
  • Потенциальные проблемы / пути их решения.

Что такое WP_Query?

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

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

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

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

На практике это будет выглядеть примерно так:

<?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

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: Вступление-2

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

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

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

Предостережения

Класс WP_Query безусловно крут. В моей практике он используется практически везде и всегда. Однако и у него есть свои минусы. Следует знать:

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

Заключение

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

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

Источник урока: http://code.tutsplus.com/tutorials/mastering-wp_query-an-introduction--cms-23023
Перевел: Станислав Протасевич, источник статьи

 

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


Защитный код
Обновить