Как использовать хук pre_get_posts для фильтрации запросов в WordPress

В WordPress хук pre_get_posts является мощным инструментом для изменения параметров запросов перед их выполнением. Он позволяет разработчикам гибко управлять выборкой записей без необходимости писать сложные SQL-запросы. В этой статье подробно разберём, как правильно использовать pre_get_posts, чтобы фильтровать главные и дополнительные запросы, а также рассмотрим примеры с пользовательскими типами записей и таксономиями.

Что такое хук pre_get_posts и зачем он нужен

Хук pre_get_posts запускается непосредственно перед выполнением WP_Query — основного класса WordPress для выборки постов. С его помощью можно изменить параметры запроса, например, фильтровать посты по категориям, тегам, метаданным, изменять количество постов на странице и многое другое.

Основное преимущество этого хука в том, что изменения применяются глобально и автоматически, без необходимости создавать собственные запросы или шаблоны. Это упрощает кастомизацию сайта и повышает производительность, так как не нужно дублировать логику выборки.

Важно понимать, что pre_get_posts срабатывает для всех WP_Query, включая запросы в админке, поэтому нужно правильно фильтровать, к каким именно запросам применять изменения.

Основные рекомендации по использованию pre_get_posts

Чтобы избежать нежелательных изменений, при работе с хуком следует всегда проверять контекст запроса. Как минимум, стоит фильтровать запросы на фронтенде, игнорируя админку, и различать главный запрос (main query) от дополнительных.

Пример базовой проверки:

function wparticles_pre_get_posts_filter( $query ) {
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }
    // Ваши изменения параметров запроса
}
add_action( 'pre_get_posts', 'wparticles_pre_get_posts_filter' );

Такая конструкция гарантирует, что изменения применятся только к главному запросу на фронтенде.

Пример 1: Фильтрация главной страницы по категории

Допустим, нужно на главной странице сайта показывать только записи из категории "Новости". Для этого в хуке меняем параметр cat:

function wparticles_filter_home_category( $query ) {
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }
    if ( is_home() ) {
        // ID категории "Новости"
        $news_cat_id = 5;
        $query->set( 'cat', $news_cat_id );
    }
}
add_action( 'pre_get_posts', 'wparticles_filter_home_category' );

Теперь на главной странице будут отображаться только записи указанной категории.

Пример 2: Фильтрация пользовательского типа записей по таксономии

Если на сайте есть кастомный тип поста wparticles_article с таксономией wparticles_topic, можно выбрать только записи с нужным термином таксономии:

function wparticles_filter_custom_post_type( $query ) {
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }
    if ( is_post_type_archive( 'wparticles_article' ) ) {
        $tax_query = array(
            array(
                'taxonomy' => 'wparticles_topic',
                'field'    => 'slug',
                'terms'    => 'wordpress-tips',
            ),
        );
        $query->set( 'tax_query', $tax_query );
    }
}
add_action( 'pre_get_posts', 'wparticles_filter_custom_post_type' );

В результате на архиве типа wparticles_article будут показываться только статьи с темой wordpress-tips.

Пример 3: Исключение определённых записей из главного запроса

Иногда нужно скрыть из главного потока записи с определёнными ID. Для этого можно использовать параметр post__not_in:

function wparticles_exclude_posts_from_main_query( $query ) {
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }
    $exclude_ids = array( 12, 34, 56 );
    $query->set( 'post__not_in', $exclude_ids );
}
add_action( 'pre_get_posts', 'wparticles_exclude_posts_from_main_query' );

Теперь записи с ID 12, 34 и 56 не будут выводиться на сайте в главном запросе.

Практические советы и подводные камни при работе с pre_get_posts

1. Проверяйте контекст запроса. Обязательно исключайте админку через is_admin(), чтобы не ломать запросы в панели управления.

2. Используйте is_main_query()

3. Не забывайте про пагинацию. Если меняете параметры, проверьте, что пагинация работает корректно, и параметр paged передаётся.

4. Для сложных условий формируйте массивы tax_query, meta_query и другие параметры, чтобы добиться точной фильтрации.

5. Тестируйте изменения тщательно, особенно если на сайте много кастомных типов, таксономий и плагинов, которые могут влиять на запросы.

Использование плагинов для упрощения работы с запросами

Если хочется визуально управлять фильтрацией запросов, можно обратить внимание на плагины, которые помогают создавать условия без программирования. Например:

  • Clearfy Pro — оптимизация и расширение возможностей WordPress, включая управление запросами.
  • WPRemark — оценка и улучшение контента с возможностью фильтрации и анализа.

Хотя эти плагины не заменят кастомный код, они могут помочь в комплексной работе с контентом и запросами.

Выводы

Хук pre_get_posts — это незаменимый инструмент для разработчика WordPress, позволяющий гибко управлять выборкой записей без изменения ядра и шаблонов. Правильное использование этого хука поможет создавать более динамичные и адаптированные под задачи сайта страницы. Внимательное тестирование и соблюдение рекомендаций обеспечат стабильную работу и удобство поддержки.

Как удалить метабоксы в WordPress без плагинов
25.02.2026
Как отключить автопробег (auto increment) в WordPress без плагинов
09.04.2026
Хук WooCommerce 'woocommerce_order_status_changed': практическое применение для автоматизации
11.05.2026
Как использовать WPRemark для автоматической оценки контента в WordPress
28.01.2026
Как добавить пользовательские поля в WordPress без плагинов
10.01.2026

Ниже мы подобрали самые актуальные материалы по Вордпресс