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

Для разработчиков 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 — это золотой стандарт.

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
WooCommerce: как добавить поле срока годности в корзину и оформить заказ
24.06.2026
Как отключить AJAX в WooCommerce при массовом обновлении заказов
18.05.2026
Как создать автоматические редиректы в WordPress для исправления ошибок 404
13.01.2026
WooCommerce: как избежать сбоев при массовом обновлении товаров
06.05.2026
Автопостинг в WordPress: как автоматизировать публикации
18.11.2025
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее