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

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

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

pre_get_posts — это action-хук, который вызывается перед тем, как WP_Query получит и сформирует выборку записей из базы данных. С помощью этого хука мы можем изменить любые параметры запроса: типы записей, таксономии, мета-запросы, порядок сортировки и другие.

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

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

Основные принципы работы с pre_get_posts

При использовании хука нужно придерживаться нескольких правил:

  • Проверять, что вы изменяете именно нужный запрос. Чаще всего это основная петля WordPress (main query), доступная через метод $query->is_main_query().
  • Ограничивать изменения только для фронтенда с помощью !is_admin(), чтобы не влиять на запросы админки.
  • Выбирать конкретные типы страниц или условий (например, is_archive(), is_post_type_archive('product'), is_search()) для более точечной фильтрации.
  • Использовать методы и свойства объекта $query для настройки параметров запроса.

Пример: фильтрация по мета-полям и таксономиям

Рассмотрим реальный пример, когда нужно на странице архива кастомного типа записей event вывести только те события, которые находятся в определённом городе (таксономия city) и имеют дату проведения в будущем (мета-поле event_date больше текущей).

add_action('pre_get_posts', 'wpteam_pre_get_posts_filter_events');
function wpteam_pre_get_posts_filter_events( $query ) {
    if( !is_admin() && $query->is_main_query() && $query->is_post_type_archive('event') ) {
        $meta_query = array(
            array(
                'key' => 'event_date',
                'value' => date('Ymd'),
                'compare' => '>=',
                'type' => 'NUMERIC'
            )
        );

        $tax_query = array(
            array(
                'taxonomy' => 'city',
                'field' => 'slug',
                'terms' => 'moscow',
            )
        );

        $query->set('meta_query', $meta_query);
        $query->set('tax_query', $tax_query);
        $query->set('orderby', 'meta_value_num');
        $query->set('meta_key', 'event_date');
        $query->set('order', 'ASC');
    }
}

В этом коде мы добавляем два условия: по дате и по таксономии. Сортируем события по дате проведения в возрастающем порядке. Благодаря is_main_query() изменения не затронут другие запросы.

Добавление дополнительных параметров фильтра через форму на фронтенде

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

Для примера, добавим фильтрацию по минимальной цене для товаров WooCommerce. Предположим, что на странице архива товаров есть форма с параметром min_price в URL.

add_action('pre_get_posts', 'wpteam_pre_get_posts_filter_min_price');
function wpteam_pre_get_posts_filter_min_price( $query ) {
    if ( !is_admin() && $query->is_main_query() && is_post_type_archive('product') ) {
        if ( isset($_GET['min_price']) && is_numeric($_GET['min_price']) ) {
            $min_price = intval($_GET['min_price']);

            $meta_query = $query->get('meta_query');
            if ( !is_array($meta_query) ) {
                $meta_query = array();
            }

            $meta_query[] = array(
                'key' => '_price',
                'value' => $min_price,
                'compare' => '>=',
                'type' => 'NUMERIC'
            );

            $query->set('meta_query', $meta_query);
        }
    }
}

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

Рекомендации по работе с мета-запросами

  • Всегда проверяйте, что meta_query — массив, чтобы не потерять существующие условия.
  • Используйте правильные типы данных (например, NUMERIC для чисел).
  • Если комбинируете несколько условий, можно использовать параметр relation (AND/OR) в meta_query и tax_query.

Оптимизация запросов с pre_get_posts и кеширование

При использовании сложных условий запросы могут стать ресурсоёмкими. Чтобы улучшить производительность, рекомендуется:

  • Минимизировать количество используемых мета-запросов.
  • Использовать индексы в базе данных для мета- и таксономий, если возможно.
  • Применять Transients API для кеширования результатов сложных запросов, особенно если данные обновляются нечасто.
  • Ограничивать количество постов на страницу через параметр posts_per_page.

Пример кеширования результатов в Transient при фильтрации можно реализовать отдельно, учитывая параметры запроса.

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

Плагин Clearfy Pro предлагает множество настроек, которые помогают оптимизировать запросы, отключать ненужные запросы и контролировать работу WordPress. В связке с pre_get_posts можно добиться максимальной скорости и релевантности вывода контента.

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

Заключение

Хук pre_get_posts — ключевой инструмент для тонкой настройки выборки контента в WordPress. Он позволяет реализовать сложную фильтрацию, учитывающую мета-поля, таксономии, параметры из URL и любые другие условия. Главное — помнить о правильном фильтре по контексту и оптимизации запросов. Используйте примеры из статьи, адаптируйте под свои задачи и комбинируйте с плагинами оптимизации, например, Clearfy Pro, чтобы получить быстрый и функциональный сайт на WordPress.

WooCommerce: автоматическое отключение платежных методов при отказанном заказе
16.06.2026
Как создать собственный шорткод в WordPress для удобного вывода контента
02.11.2025
Как сделать автоматический импорт постов в WordPress из RSS
27.02.2026
Как создать собственный плагин в WordPress
10.11.2025
Создать и использовать динамические корзинные элементы в WooCommerce с AJAX
17.02.2026