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

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

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

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

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

Основные параметры WP_Query для фильтрации

Перед тем как менять параметры через pre_get_posts, нужно понимать, какие аргументы WP_Query доступны для фильтрации. Среди самых популярных:

  • post_type — тип записей (post, page, custom post type);
  • posts_per_page — количество записей на страницу;
  • category_name или cat — фильтрация по категориям;
  • tag или tag_slug__in — по тегам;
  • meta_query — фильтрация по метаданным;
  • tax_query — фильтрация по таксономиям;
  • orderby и order — сортировка.

Можно комбинировать несколько условий, чтобы получить именно те записи, которые нужны.

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

Допустим, на главной странице сайта нужно показывать только записи из категории с ярлыком novosti. Для этого добавим следующий код в файл functions.php вашей темы:

function wp24_filter_home_category( $query ) {
    if ( ! is_admin() && $query->is_main_query() && $query->is_home() ) {
        $query->set( 'category_name', 'novosti' );
        $query->set( 'posts_per_page', 5 );
    }
}
add_action( 'pre_get_posts', 'wp24_filter_home_category' );

Здесь мы проверяем, что запрос не из админки, основной и для главной страницы, и задаем параметры выборки — категория и количество постов. Это простой и эффективный способ контролировать контент главной страницы.

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

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

function wp24_exclude_posts_from_archive( $query ) {
    if ( ! is_admin() && $query->is_main_query() && $query->is_archive() ) {
        $exclude_ids = array( 10, 25, 36 ); // ID записей для исключения
        $query->set( 'post__not_in', $exclude_ids );
    }
}
add_action( 'pre_get_posts', 'wp24_exclude_posts_from_archive' );

Это позволит убрать нежелательные записи из архивных страниц без удаления их из базы или создания дополнительных фильтров.

Пример 3: Фильтрация записей по метаполю

Если у записей есть пользовательское поле, например, featured со значением yes, можно вывести на главной только такие записи:

function wp24_filter_featured_posts( $query ) {
    if ( ! is_admin() && $query->is_main_query() && $query->is_home() ) {
        $meta_query = array(
            array(
                'key' => 'featured',
                'value' => 'yes',
                'compare' => '=',
            ),
        );
        $query->set( 'meta_query', $meta_query );
    }
}
add_action( 'pre_get_posts', 'wp24_filter_featured_posts' );

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

Советы и лучшие практики при работе с pre_get_posts

1. Всегда проверяйте контекст запроса. Используйте методы is_main_query(), is_home(), is_archive() и другие, чтобы не менять запросы в админке и на сторонних страницах.

2. Не создавайте бесконечные циклы. Избегайте вызова query_posts() внутри функции с pre_get_posts — это может привести к ошибкам.

3. Для сложных фильтров используйте tax_query и meta_query. Они позволяют гибко комбинировать условия.

4. Оптимизируйте запросы. Слишком сложные запросы могут замедлить сайт. Используйте кэширование и минимизируйте количество условий.

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

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

Например:

  • Clearfy Pro — оптимизирует работу сайта и улучшает запросы;
  • WPRemark — добавляет расширенные возможности комментариев и фильтрации;
  • ABC Pagination — улучшает пагинацию и навигацию по записям.

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

Заключение

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

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

Как установить ограничение на регистрацию в WordPress по домену email
10.02.2026
Как добавить уникальные поля в форму регистрации WordPress с проверкой уникальности
24.02.2026
Как удалить пустые категории в WordPress с помощью PHP кода
13.04.2026
Как удалить неиспользуемые метаданные WordPress
23.12.2025
Оптимизация загрузки изображений в WordPress: практические методы и примеры
25.11.2025