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

В WordPress хук pre_get_posts является мощным инструментом для изменения основного запроса WP_Query до выполнения запроса к базе данных. Это позволяет разработчикам гибко фильтровать и модифицировать выборку постов без необходимости создавать свои собственные запросы с нуля.

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

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

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

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

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

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

function wpid_filter_home_posts_by_category( $query ) {
    if ( !is_admin() && $query->is_main_query() && $query->is_home() ) {
        $query->set( 'cat', 5 );
    }
}
add_action( 'pre_get_posts', 'wpid_filter_home_posts_by_category' );

Разбираем по шагам:

  • !is_admin() — исключаем административную панель;
  • $query->is_main_query() — проверяем, что это основной запрос WordPress;
  • $query->is_home() — условие для главной страницы;
  • $query->set('cat', 5) — задаем фильтр по категории с ID 5.

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

Пример 2: Исключение определенных постов из архива

Предположим, нужно исключить из архива с типом записи post несколько постов по ID, например, 12, 34 и 56. Сделаем это так:

function wpid_exclude_posts_from_archive( $query ) {
    if ( !is_admin() && $query->is_main_query() && $query->is_archive() && $query->get('post_type') === 'post' ) {
        $query->set( 'post__not_in', array( 12, 34, 56 ) );
    }
}
add_action( 'pre_get_posts', 'wpid_exclude_posts_from_archive' );

Объяснение:

  • Проверяем, что запрос на фронтенде, основной и относится к архиву;
  • Дополнительно убеждаемся, что тип записей — стандартные посты;
  • С помощью post__not_in исключаем указанные ID из выборки.

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

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

function wpid_customize_category_query( $query ) {
    if ( !is_admin() && $query->is_main_query() && $query->is_category() ) {
        $query->set( 'posts_per_page', 10 );
        $query->set( 'order', 'DESC' );
        $query->set( 'orderby', 'date' );
    }
}
add_action( 'pre_get_posts', 'wpid_customize_category_query' );

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

Советы по безопасности и производительности при работе с pre_get_posts

Несмотря на мощь хука, есть несколько важных моментов:

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

Пример расширенного фильтра с учетом пользовательских типов записей

Если на сайте есть кастомные типы записей, например product, можно изменить запрос архива этого типа:

function wpid_filter_custom_post_type_archive( $query ) {
    if ( !is_admin() && $query->is_main_query() && $query->is_post_type_archive( 'product' ) ) {
        $query->set( 'meta_key', 'wpid_product_price' );
        $query->set( 'orderby', 'meta_value_num' );
        $query->set( 'order', 'ASC' );
        $query->set( 'posts_per_page', 20 );
    }
}
add_action( 'pre_get_posts', 'wpid_filter_custom_post_type_archive' );

В данном случае мы сортируем товары по цене, которая хранится в произвольном поле wpid_product_price, и ограничиваем вывод 20 элементами на страницу.

Заключение

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

Для удобства работы с фильтрацией и оптимизации запросов рекомендуем обратить внимание на плагины, которые помогают управлять запросами и кэшированием, например, Clearfy Pro. Он позволит облегчить настройку и повысить производительность сайта.

Как отключить визуальные рендеры в WordPress для ускорения сайта
12.04.2026
Автоматическое удаление спам комментариев в WordPress
21.01.2026
Использование хука pre_get_posts для фильтрации постов в WordPress
18.01.2026
Как исключить определённые плагины из автообновлений в WordPress
25.04.2026
Как использовать WPCommunity для создания форума в WordPress
21.03.2026