В этой статье подробно разберём, как с помощью хука pre_get_posts в WordPress эффективно фильтровать записи в запросах на страницах сайта. Этот хук часто недооценивают, хотя он даёт мощные возможности для изменения стандартных запросов без создания дополнительных WP_Query. Подойдёт для решения задач, связанных с выводом записей в категориях, на главной странице, в архиве и других местах.
Что такое хук pre_get_posts и где он применяется
Хук pre_get_posts — это один из action-хуков WordPress, который срабатывает перед выполнением основного запроса на выборку записей. Он передаёт объект WP_Query, которым можно изменять параметры запроса до его выполнения. Благодаря этому мы можем динамически менять, какие записи и в каком количестве будут выведены на странице.
Этот хук полезен, когда нужно изменить выборку записей без создания нового запроса, например, для главной страницы, архивов, поисковых результатов. Особенно часто он применяется для исключения определённых категорий, вывода записей только с нужными метками, изменения количества постов на странице и т.п.
Важно помнить, что pre_get_posts срабатывает для всех запросов — глобального и дополнительных. Чтобы не нарушить работу админки или виджетов, всегда нужно проверять, с каким запросом мы работаем.
Основные параметры WP_Query, которые можно изменить через pre_get_posts
Через объект WP_Query, переданный в коллбек pre_get_posts, доступны все стандартные параметры запроса. Вот самые часто используемые для фильтрации:
post_type— тип записей (post, page, custom post type);posts_per_page— количество записей на странице;cat,category__in,category__not_in— категории;tag__in,tag__not_in— метки;meta_query— фильтрация по метаполям;tax_query— фильтрация по таксономиям;orderbyиorder— сортировка;author— фильтрация по автору;- и другие.
Управляя этими параметрами, можно гибко менять содержимое страниц без дублирования кода.
Пример 1: Исключаем определённые категории с главной страницы
Допустим, нужно убрать из ленты новостей на главной записи из категорий с ID 5 и 8. Для этого используем такой код:
function wpurok_pre_get_posts_exclude_categories( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_home() ) {
$query->set( 'category__not_in', array( 5, 8 ) );
}
}
add_action( 'pre_get_posts', 'wpurok_pre_get_posts_exclude_categories' );Здесь мы проверяем, что запрос не в админке (! is_admin()), что это главный запрос на странице (is_main_query()) и что мы на главной (is_home()). После этого с помощью set меняем параметр запроса, исключая категории.
Пример 2: Вывод записей определённого типа и метаполя на архиве
Если в вашем сайте есть кастомный тип записей product, и нужно выводить на архиве только продукты со значением метаполя in_stock, равным 1, используйте такой код:
function wpurok_pre_get_posts_filter_products_in_stock( $query ) {
if ( ! is_admin() && $query->is_main_query() && is_post_type_archive( 'product' ) ) {
$meta_query = array(
array(
'key' => 'in_stock',
'value' => '1',
'compare' => '='
)
);
$query->set( 'meta_query', $meta_query );
$query->set( 'posts_per_page', 20 );
}
}
add_action( 'pre_get_posts', 'wpurok_pre_get_posts_filter_products_in_stock' );Так мы ограничим вывод продуктов только теми, что есть в наличии, и установим количество на страницу.
Как использовать tax_query для сложной фильтрации по таксономиям
Иногда нужно фильтровать записи по нескольким таксономиям одновременно. Для этого применяется параметр tax_query, который принимает массив условий.
Например, вывести записи с таксономией genre равной fiction и с таксономией writer равной tolkien:
function wpurok_pre_get_posts_tax_query_example( $query ) {
if ( ! is_admin() && $query->is_main_query() && is_archive() ) {
$tax_query = array(
'relation' => 'AND',
array(
'taxonomy' => 'genre',
'field' => 'slug',
'terms' => 'fiction',
),
array(
'taxonomy' => 'writer',
'field' => 'slug',
'terms' => 'tolkien',
),
);
$query->set( 'tax_query', $tax_query );
}
}
add_action( 'pre_get_posts', 'wpurok_pre_get_posts_tax_query_example' );Здесь relation задаёт логику объединения условий (AND, OR), а каждый вложенный массив описывает отдельную таксономию и её значение.
Практические советы и подводные камни
1. Всегда проверяйте is_main_query() и ! is_admin(), чтобы не сломать админку и виджеты.
2. Для кастомных запросов, создаваемых вручную, pre_get_posts не всегда подходит — там лучше использовать WP_Query напрямую.
3. При изменении параметров запроса не забывайте о пагинации — если меняете posts_per_page, учтите, что пагинация должна корректно работать.
4. Для сложных условий используйте meta_query и tax_query — они позволяют строить гибкие фильтры.
Инструменты и плагины для упрощения работы с запросами
Для упрощения управления запросами можно использовать плагины, которые позволяют визуально настраивать фильтры:
- Clearfy Pro — плагин с расширенными настройками оптимизации и управления запросами.
- WPRemark — удобный инструмент для управления комментариями и их фильтрации.
Хотя для большинства задач достаточно написания своего кода через pre_get_posts, эти плагины помогут при комплексных изменениях.