
Использование запросов WP_Query в WordPress – часть 6 (аргументы для получения постов, страниц)
Сегодняшний урок практический и служит целью закрепить полученные теоретические знания из предыдущих уроков по запросу WP_Query в ВордПрессе. Используя аргументы мы создадим специальные запросы, позволяющие получить нужные нам публикации, страницы или публикации определенных типов.
Прежде чем перейти к практике, давайте еще раз кратко вспомним, как работают аргументы в WP_Query
. Для построения оптимального WP_Query
запроса (будь то в теме или плагине) мы должны задействовать четыре основных элемента:
- аргументы для запроса (параметры которых являются темой сегодняшнего урока)
- непосредственно сам запрос
- работа с циклом
- закрытие цикла (условных тегов
if
иwhile
); сброс данных публикации (глобального$post
)
На практике это будет выглядеть примерно так:
<?php $args = array( // массив аргументов запроса ); // образец пользовательского запроса // создание нового экземпляра класса – нового объекта $query = new WP_Query( $args ); // проверка на наличие результатов запроса if ( $query->have_posts() ) { // прохождение циклом по результатам запроса while ( $query->have_posts() ) { $query->the_post(); // здесь контент публикации результата } } // обязательное восстановление (сброс) оригинальных данных публикации после запроса // перезагрузка глобальной переменной $post wp_reset_postdata(); ?>
В первом абзаце примера следует массив аргументов, указывающих WordPress, какие данные нам нужно извлечь из базы данных. И в данном уроке мы разберем это более подробно:
<?php $args = array( // массив аргументов запроса ); // ... ?>
Использование аргументов в запросе
Аргументы для запроса указываются в массиве. Схематически их указание может выглядеть следующим образом:
<?php $args = array( 'parameter1' => 'value', 'parameter2' => 'value', 'parameter3' => 'value' ); ?>
Параметры и их значения берутся в одинарные (или двойные) кавычки, между ними указывается знак =>
, а разделяются от других запятыми. Если в этом допустить ошибку, тогда движок WordPress может не правильно обработать ваш запрос или даже привести к «белому экрану смерти».
Запрос, который вернет отдельную публикацию (типа пост)
Это самый простой сценарий. Чтобы извлечь из базы данных одну определенную публикацию, можно пойти двумя путями:
- Использовать идентификатор публикации:
p
(int) - Использовать слаг (часть URL) поста:
name
(string) (! это не заголовок поста)
Эти два параметра можно использовать для получения любых типов публикаций, включая посты, страницы, вложения и специальные типы публикаций (CPT — custom post type). По умолчанию WordPress отправляет запрос на тип публикации post
, но это решается дополнительным аргументом, как вы увидите дальше.
Итак, чтобы вернуть конкретную публикацию, вы можете построить запрос следующим образом:
<?php $args = array( 'p' => 125 // ID поста ); ?>
или так:
<?php $args = array( 'name' => 'ispolzovaniye-zaprosov-wp-query-v-wordpress' // слаг поста ); ?>
Использование параметра name
содержит риски, если кто-то его изменит в будущем, поэтому использование идентификатора публикации безопаснее, поскольку его нельзя изменить.
Запрос, который вернет отдельную публикацию (типа страница)
Чтобы получить одну конкретную страницу вы тоже сможете использовать 2 разных варианта:
- Использовать идентификатор страницы:
page_id
(int) - Использовать слаг (часть URL) страницы:
pagename
(string) (! это не заголовок страницы)
Для того, чтобы получить только одну конкретную страницу из базы данных, используйте одно из следующих:
<?php $args = array( 'page_id' => '25' // ID страницы // или же так // 'pagename' => 'chast-url-adresa-stranitsy' // слаг страницы ); ?>
Запрос, который вернет отдельную публикацию (другого типа)
Если вам нужно получить публикации другого типа (не пост и не страница), включая нестандартный тип публикации (CPT), тогда используйте параметр post_type
. Например, если вам нужен один товар (публикация с типом product
), запрос может выглядеть так:
<?php $args = array( 'p' => '1907', 'post_type' => 'product' ); ?>
или если вам нужно вложение (тип attachment
— прикрепленное изображение):
<?php $args = array( 'p' => '1155', 'post_type' => 'attachment' ); ?>
Какие типы публикаций можно указывать в запросе
В некоторых из предыдущих примеров я использовал параметр post_type
, который указывается для идентификации публикаций определенного типа. Давайте рассмотрим основные типы публикаций в WordPress:
post
: публикация с типом пост, сообщение и т.д. Это значение по умолчанию!page
: публикация с типом страницаrevision
: публикация с типом редакция (ревизия, архивная копия, автосохранение поста и т.д.)attachment
: публикация с типом вложение (миниатюры постов)nav_menu_item
: отдельный тип для пункта навигационного менюany
: для публикаций с любым типом (кроме ревизий и если тип установлен для'exclude_from_search'
в значениеtrue
)- CPT (Custom Post Types – специальные типы публикаций (например,
product
, или любой тип, созданный вами функциейregister_post_type()
)
Запрос на дочерние страницы
Часто бывает, что программистам сайта на ВордПресс нужно получить все страницы, которые являются дочерними для текущей страницы (кроме публикаций с типом post
— они не иерархичны). Тогда стоит воспользоваться чем-нибудь из этих трех аргументов:
- Использовать идентификатор страницы для возврата только ее дочерних страниц:
post_parent
(int). Установка0
будет возвращать только записи верхнего уровня (все родительские публикации). - Использовать массив «вхождения» идентификаторов публикаций:
post_parent__in
(array): - Использовать «обратный» массив идентификаторов публикаций:
post_parent__not_in
(array).
Давайте рассмотрим каждый из этих вариантов на практике:
<?php $args = array( 'post_type' => 'page', // обязательно указывать, если это не post 'post_parent' => '18' // ID текущей страницы // чтобы найти все страницы, которые являются дочерними для данной страницы (с ID 18) ); ?>
Чтобы добавить динамики в запрос и автоматически получать ID
текущей страницы, а не записывать его «жестко», вот как это можно оформить:
<?php $current_page_id = get_the_ID(); // получить ID текущей страницы $args = array( 'post_type' => 'page', 'post_parent' => $current_page_id // динамически подставлять ID на текущей странице ); ?>
Запрос, работающий с массивом публикаций
Для таких запросов можно использовать один из двух аргументов (их нельзя использовать одновременно):
- Использование массива идентификаторов публикаций (входящих в массив):
post__in
(array) - Использование массива идентификаторов публикаций (не входящих в массив):
post__not_in
(array)
Вариант первого использования:
<?php $args = array( // перечисляем ID нужных публикаций 'post__in' => array( '177', '94', '58' ), 'post_status' => 'any', // чтобы включить публикации со всеми статусами 'ignore_sticky_posts' => 'true' // чтобы исключить "прикрепленные" публикации, ведь они всегда входят в запрос ); ?>
Другой аргумент – post__not_in
— работает подобным образом, но он выведет все публикации, кроме перечисленных в запросе. Иногда это действительно бывает полезным:
<?php $args = array( 'post_type' => 'product', // если нам нужны товары, и кроме указанных ниже // перечисляем ID товаров для исключения 'post__not_in' => array( '127', '391', '559' ) ); ?>
На сегодняшний день все. В данном уроке мы рассмотрели использование WP_Query
для создания специальных запросов на получение разнообразных публикаций. Вот какие вопросы мы рассмотрели:
- Аргументы для разных типов публикаций
- Использование запроса для получения страниц верхнего уровня
- Использование запроса для получения публикаций определенного типа
- Использование запроса для получения всех публикаций, кроме указанных
- Использование запроса для получения всех дочерних элементов текущей страницы
Кроме этого, существует еще много других аргументов запроса, которые мы будем рассматривать в будущих уроках. Следующий практический урок серии будет посвящен рассмотрению аргументов, которые можно использовать для запроса категорий и тегов в ВордПресс.