Сегодняшний урок практический и служит целью закрепить полученные теоретические знания из предыдущих уроков по запросу 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)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)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
)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
для создания специальных запросов на получение разнообразных публикаций. Вот какие вопросы мы рассмотрели:
Кроме этого, существует еще много других аргументов запроса, которые мы будем рассматривать в будущих уроках. Следующий практический урок серии будет посвящен рассмотрению аргументов, которые можно использовать для запроса категорий и тегов в ВордПресс.
Этот практический урок будет посвящен рассмотрению аргументов, которые можно использовать для получения публикаций определенных категорий…
Продолжаем серию уроков по работе с запросами в базу данных WP_Query в ВордПресс. Сегодняшний урок…
Этим уроком мы продолжаем серию уроков по работе с запросами в базу данных WP_Query в…
В современном цифровом мире вопрос безопасности, анонимности и быстрого доступа к интернет-ресурсам становится все более…
Этот урок является продолжением серии о работе с запросами в базу данных WP_Query в ВордПресс.…