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

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

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

Хук pre_get_posts вызывается сразу после инициализации главного объекта запроса WP_Query, но до выполнения самого запроса к базе данных. Это значит, что можно внести изменения в параметры запроса — например, изменить количество постов на странице, типы записей, порядок сортировки, условия выборки и многое другое.

Использование этого хука позволяет:

  • Создавать фильтры с выборкой записей по произвольным условиям
  • Изменять запросы в админке и на фронтенде
  • Оптимизировать выборку для улучшения производительности
  • Устранять дублирование или выводить записи из нескольких типов одновременно

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

Основные параметры и проверка запроса

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

function wpturbo_pre_get_posts_filter( $query ) {
    // Не изменяем запрос в админке и если не главный запрос
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }

    // Пример: изменить количество постов на главной
    if ( $query->is_home() ) {
        $query->set( 'posts_per_page', 5 );
    }
}
add_action( 'pre_get_posts', 'wpturbo_pre_get_posts_filter' );

В этом примере мы меняем количество записей на главной странице на 5. Проверки is_admin() и $query->is_main_query() предотвращают нежелательные изменения.

Создание кастомного фильтра по произвольному полю (метаполю)

Очень частая задача — вывести записи, у которых значение метаполя соответствует определённому условию. Например, показать статьи с рейтингом более 4.

function wpturbo_filter_posts_by_meta( $query ) {
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }

    if ( is_post_type_archive( 'post' ) || is_home() ) {
        $meta_query = array(
            array(
                'key'     => 'rating',
                'value'   => 4,
                'type'    => 'NUMERIC',
                'compare' => '>='
            )
        );
        $query->set( 'meta_query', $meta_query );
    }
}
add_action( 'pre_get_posts', 'wpturbo_filter_posts_by_meta' );

Здесь мы добавляем условие, что метаполе rating должно быть больше или равно 4 для вывода в архиве постов и на главной.

Вывод записей нескольких типов с сортировкой

Если нужно вывести на одной странице посты разных типов — например, post и product (кастомный тип записей), то тоже можно применить pre_get_posts:

function wpturbo_multi_post_type_query( $query ) {
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }

    if ( is_home() ) {
        $query->set( 'post_type', array( 'post', 'product' ) );
        $query->set( 'posts_per_page', 10 );
        $query->set( 'orderby', 'date' );
        $query->set( 'order', 'DESC' );
    }
}
add_action( 'pre_get_posts', 'wpturbo_multi_post_type_query' );

Такой код позволит на главной странице вывести 10 последних записей как из блога, так и из каталога продуктов.

Фильтр записей по таксономиям и нескольким условиям

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

function wpturbo_filter_by_taxonomies( $query ) {
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }

    if ( is_archive() ) {
        $tax_query = array(
            'relation' => 'AND',
            array(
                'taxonomy' => 'category',
                'field'    => 'slug',
                'terms'    => array( 'news', 'updates' ),
            ),
            array(
                'taxonomy' => 'post_tag',
                'field'    => 'slug',
                'terms'    => 'featured',
            ),
        );
        $query->set( 'tax_query', $tax_query );
    }
}
add_action( 'pre_get_posts', 'wpturbo_filter_by_taxonomies' );

Этот код выводит на архивных страницах записи, которые принадлежат категориям news или updates и имеют тег featured.

Практические советы и рекомендации

  • Всегда проверяйте, что ваш код не влияет на админку, иначе можно нарушить работу панели управления.
  • Используйте is_main_query() для ограничения действия только на главный запрос.
  • Для сложных фильтров лучше создавать отдельные функции и подключать их через хуки, а не писать все в одном месте.
  • Тестируйте изменения на тестовом сервере, чтобы не сломать вывод страниц.
  • Для удобства можно использовать плагин Clearfy Pro, который оптимизирует работу сайта и помогает управлять запросами.

Интеграция с плагином Clearfy Pro для оптимизации запросов

Плагин Clearfy Pro позволяет легко отключать лишние запросы и оптимизировать выборку записей, что хорошо дополняет наши кастомные фильтры. Например, с его помощью можно убрать запросы на ненужные таксономии, уменьшить нагрузку на сервер и повысить скорость.

Заключение

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

Удаление неиспользуемых вариаций товаров в WooCommerce без плагинов
09.05.2026
WooCommerce: как автоматически удалять неиспользуемые вариации товаров через код
30.05.2026
Настройка отправки сообщений из WPForms через SMTP SendGrid
11.02.2026
Как создать сниппеты для оптимизации WordPress
26.01.2026
Автоматическое удаление неиспользуемых вариаций товаров в WooCommerce через код
23.05.2026