Руководство: изменение глобального запроса WordPress
В некоторых случаях вам может понадобиться изменить глобальный почтовый запрос, который WordPress выполняет на любой странице, которую вы посещаете — как в админке, так и во внешнем интерфейсе. В этом руководстве мы рассмотрим, какой хук использовать и как изменить аргументы запроса по своему вкусу.
Какой крючок использовать
Сначала вам нужно знать, к какому хуку добавить ваш код. Нам нужен хук, который происходит сразу после того, как WordPress установит все аргументы, но до фактического выполнения запроса. Для этого используем действие pre_get_posts
.
В этом хуке вы получаете один параметр; который является WP_Query
объектом, с которым WordPress позже выполнит запрос. Вы вносите изменения в объект, но вам не нужно возвращать его, так как WordPress выполнит запрос с измененным объектом.
add_action('pre_get_posts', function($query) {
// Add your code here
});
Изменение запроса, скорее всего, потребует от вас использования некоторых условных тегов для указания тех случаев, когда вы хотите его изменить. Например, вы можете настроить таргетинг запроса только в результатах поиска или представлениях категорий.
Условные теги
В WordPress есть множество условных тегов, которые вы можете использовать, чтобы указать, в каких случаях вы хотите добавить свой код. Условный тег — это просто функция, которая возвращает true или false в зависимости от того, в каком состоянии находится WordPress. Примеры общих условных тегов предназначены is_admin()
для проверки того, находимся ли мы в настоящее время в админке или во внешнем интерфейсе, is_singular()
находимся ли мы на одном посте или странице во внешнем интерфейсе, и is_search()
если мы находимся на странице результатов поиска.
Имейте в виду, что хук pre_get_posts
запускается как для администратора, так и для внешнего интерфейса. Если вы хотите повлиять только на глобальный запрос во внешнем интерфейсе, вам нужно обернуть свой код внутри if-check для условного тега is_admin()
.
Примечание об условных тегах вpre_get_posts
Условные теги хороши и все такое, но есть некоторые вещи, о которых следует помнить при их использовании внутри pre_get_posts
.
Во-первых, вам нужно ознакомиться с тегом is_main_query()
. Действие pre_get_posts
фактически запускается несколько раз для каждой загрузки страницы. Например pre_get_posts
запускается при генерации каждого меню (в том числе и в виджетах). Чтобы изменить фактический глобальный запрос, например сообщения для архива категорий или результатов поиска, вам необходимо настроить таргетинг на «основной запрос» с помощью is_main_query()
.
Во-вторых, вам нужно знать о случаях, когда вам нужно проверять условные теги на предоставленный объект, а не вызывать функцию «самостоятельно». Обычно, когда вы используете условные теги, вы пишете это так:
if (is_main_query()) {
// Do stuff
}
Однако при использовании pre_get_posts
есть некоторые условные теги, которые необходимо применить к объекту. Например:
Вы всегда должны проверять is_main_query()
объект, указанный в pre_get_posts
. Прочтите документацию для pre_get_posts для получения дополнительной информации.
Это пример проверки, находимся ли мы не в админке, и находимся ли мы в основном посте запроса:
Изменение или добавление аргументов
Поскольку мы работаем с WP_Query
объектом, вы можете обратиться к документации WP_Query, чтобы узнать, как создать свои аргументы для настройки запроса сообщений. Имейте в виду, что аргументы уже заполнены. В этом случае вам необходимо добавить или изменить существующие значения. Или удалите те, которые хотите удалить.
Вы используете set()
функцию для WP_Query
объекта, чтобы установить аргументы. Метод принимает два аргумента: ключ аргумента и, во-вторых, значение. Например, установка posts_per_page
аргумента будет выполнена следующим образом:
В тех случаях, когда вы хотите добавить или изменить уже существующий аргумент, вы обычно делаете это, сначала сохраняя существующий аргумент в переменной. Для этого можно использовать метод get()
. Затем вы изменяете переменную, добавляя или объединяя массивы или еще что-то. И, наконец, вы используете set()
, чтобы заменить измененную переменную обратно на объект запроса. Я рекомендую использовать var_dump()
на объекте, чтобы увидеть, что он содержит, и это также хороший способ проверить правильность ваших условных тегов.
Вот краткий пример использования get()
(просто проверьте, пусто ли оно), и если да, добавьте свои собственные аргументы с помощью set()
.
Примечание о tax_query
WordPress имеет отдельные подклассы для обработки части таксономии (WP_Tax_Query
) внутри WP_Query
. Если вам нужно внести более сложные изменения в запрос таксономии, pre_get_posts
действие может быть преждевременным. Некоторые значения могут быть пустыми, поскольку они заполняются позже. В этом случае вам может быть лучше использовать действие parse_tax_query
вместо pre_get_posts
. Прочтите документацию по этому хуку, чтобы понять, подходит ли он вам.
Вывод
Аргументы, которые вы добавляете или изменяете, полностью зависят от того, что вы хотите сделать, но теперь у вас должно быть некоторое представление о стратегиях получения доступа к глобальному запросу. Если вам нужно получить некоторое представление об WP_Query
объекте и о том, как использовать его аргументы, может быть интересна моя статья о том, как запрашивать сообщения .