Для разработчиков WordPress очень важно уметь гибко управлять запросами к базе данных, чтобы выводить именно те записи, которые нужны на конкретной странице сайта. Один из самых мощных и часто используемых инструментов для этого — хук pre_get_posts. В этой статье разберём, как правильно использовать этот хук для тонкой настройки запросов, рассмотрим практические примеры, а также распространённые ошибки и способы их избежать.
Что такое хук pre_get_posts и зачем он нужен
Хук pre_get_posts срабатывает в WordPress перед выполнением основного запроса (main query) и любых дополнительных запросов WP_Query. Он позволяет изменять параметры запроса, например, менять типы записей, таксономии, порядок и количество выводимых постов, без необходимости писать отдельные запросы к базе данных.
Это удобно, когда нужно изменить, какие записи выводятся на главной странице, в архиве, на странице поиска или в любом другом месте, где используется WP_Query.
Важно понимать, что pre_get_posts работает с объектом запроса WP_Query, и изменения нужно делать через методы и свойства этого объекта.
Как правильно использовать хук pre_get_posts: базовый пример
Добавим функцию, которая изменит количество записей на главной странице — увеличим его до 10:
function wpexamples_pre_get_posts(\WP_Query $query) {
if ( ! is_admin() && $query->is_main_query() && $query->is_home() ) {
$query->set('posts_per_page', 10);
}
}
add_action('pre_get_posts', 'wpexamples_pre_get_posts');Объяснение кода:
! is_admin()— чтобы не менять запросы в админке.$query->is_main_query()— чтобы изменить только основной запрос страницы, а не дополнительные WP_Query.$query->is_home()— чтобы применить изменение только к главной странице блога.
Это базовый пример, но он показывает главный принцип: проверять контекст и изменять параметры запроса через метод set.
Фильтрация записей по пользовательскому полю (meta_query)
Частая задача — вывести записи, у которых есть определённое значение в метаполе. Например, вывести только посты, у которых метаполе featured равно true.
function wpexamples_filter_featured_posts(\WP_Query $query) {
if ( ! is_admin() && $query->is_main_query() && $query->is_home() ) {
$meta_query = array(
array(
'key' => 'featured',
'value' => 'true',
'compare' => '='
)
);
$query->set('meta_query', $meta_query);
}
}
add_action('pre_get_posts', 'wpexamples_filter_featured_posts');Такой подход позволяет очень гибко настроить выборку, используя любые произвольные поля, созданные через ACF, Carbon Fields и другие плагины или вручную.
Изменение типа постов и сортировки в архиве таксономии
Допустим, у вас есть кастомный тип записи product и таксономия product_cat, и вы хотите, чтобы на странице архива категории выводились только продукты, отсортированные по цене.
function wpexamples_modify_product_cat_archive(\WP_Query $query) {
if ( ! is_admin() && $query->is_main_query() && is_tax('product_cat') ) {
$query->set('post_type', 'product');
$query->set('orderby', 'meta_value_num');
$query->set('meta_key', 'price');
$query->set('order', 'ASC');
}
}
add_action('pre_get_posts', 'wpexamples_modify_product_cat_archive');Здесь важно задать meta_key и указать сортировку по числовому значению meta_value_num. Такой приём позволит выводить продукты в нужном порядке.
Как избежать распространённых ошибок при использовании pre_get_posts
1. Не использовать изменения без проверки контекста. Если не фильтровать запросы, изменения могут применяться в админке, на AJAX запросах и в других местах, что приведёт к ошибкам.
2. Проверять, что изменяется основной запрос через $query->is_main_query(), чтобы не ломать сторонние WP_Query.
3. Избегать конфликтов с другими плагинами и кодом. Иногда изменения параметров могут конфликтовать, поэтому рекомендуется использовать префиксы в названиях функций и тщательно тестировать.
Использование плагина Clearfy Pro для оптимизации запросов
Плагин Clearfy Pro помогает оптимизировать работу WordPress, в том числе за счёт контроля запросов и отключения лишних функций. Он может быть полезен, если вы хотите дополнительно управлять запросами без глубокого программирования.
Однако для тонкой настройки, особенно под свои задачи, хук pre_get_posts остаётся самым надёжным и гибким инструментом.
Пример комплексного кода для фильтрации записей по нескольким параметрам
Допустим, нужно вывести на странице блога только записи из категорий news и events, которые опубликованы за последние 30 дней, и отсортировать их по дате публикации в порядке убывания:
function wpexamples_complex_filter(\WP_Query $query) {
if ( ! is_admin() && $query->is_main_query() && $query->is_home() ) {
$query->set('category_name', 'news,events');
$date_query = array(
array(
'after' => '30 days ago'
)
);
$query->set('date_query', $date_query);
$query->set('orderby', 'date');
$query->set('order', 'DESC');
}
}
add_action('pre_get_posts', 'wpexamples_complex_filter');Такой код позволит без дополнительного SQL создавать сложные фильтры с использованием встроенных параметров WP_Query.
Итоги и рекомендации по использованию pre_get_posts
Хук pre_get_posts — это мощный инструмент для разработки на WordPress, который позволяет управлять выборкой записей на уровне ядра без дублирования запросов и сложных обходных путей.
Всегда:
- Проверяйте контекст вызова (админка, основной запрос, тип страницы).
- Используйте метод
setдля изменения параметров запроса. - Тестируйте изменения на разных страницах и условиях.
Для более комплексных задач, связанных с оптимизацией и безопасностью, можно рассмотреть интеграцию с плагинами, например, Clearfy Pro, но для кастомных решений работа с pre_get_posts — это золотой стандарт.