Как использовать pre_get_posts для исключения категории из главной ленты WordPress

Диагностика задачи: зачем исключать категорию из главной ленты

Часто в проектах на WordPress возникает необходимость не показывать определённые категории записей на главной странице сайта. Например, для скрытия служебных новостей, тестовых публикаций или материалов, предназначенных только зарегистрированным пользователям. Стандартными средствами WordPress это сделать нельзя без плагинов или кода.

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

Что такое pre_get_posts и как он работает

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

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

Пример базового использования для исключения категории

function exclude_category_from_home( $query ) {
    if ( ! is_admin() && $query->is_main_query() && $query->is_home() ) {
        // ID категории, которую нужно исключить
        $excluded_cat_id = 10;
        $query->set( 'cat', '-' . $excluded_cat_id );
    }
}
add_action( 'pre_get_posts', 'exclude_category_from_home' );

В данном примере мы проверяем, что запрос не админский, что это основной запрос и что это главная страница (лента блога). Затем с помощью параметра cat с минусом исключаем категорию с ID 10.

Пошаговое решение: как настроить исключение категории

1. Найдите ID категории для исключения

Перейдите в админку WordPress → Записи → Рубрики. Наведите на нужную категорию и посмотрите ID в URL браузера, например tag_ID=10.

2. Вставьте код в functions.php вашей темы или в плагин для кастомных функций

function exclude_category_from_home( $query ) {
    if ( ! is_admin() && $query->is_main_query() && $query->is_home() ) {
        $excluded_cat_id = 10; // замените на ваш ID
        $query->set( 'cat', '-' . $excluded_cat_id );
    }
}
add_action( 'pre_get_posts', 'exclude_category_from_home' );

3. Очистите кеш сайта и браузера

Если используете кеширующие плагины (например, WP Rocket, W3 Total Cache), обязательно сделайте сброс кеша, иначе изменения не отобразятся.

4. Проверьте работу на главной странице

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

Как проверить, что исключение работает

  • Откройте главную страницу сайта в режиме инкогнито;
  • Убедитесь, что записи из исключённой категории отсутствуют;
  • Временно отключите код и проверьте, что записи снова появляются;
  • Используйте отладчик Query Monitor (плагин) для просмотра параметров основного запроса;
  • Проверьте, что другие страницы (например, архивы категорий) не затронуты.

Частые ошибки при использовании pre_get_posts

  • Отсутствие проверки is_main_query() — код меняет все запросы, включая админку, что приводит к ошибкам;
  • Неправильное условие для главной страницы — вместо is_home() используют is_front_page(), что может быть неверно в настройках сайта;
  • Забывают ставить минус перед ID категории — без минуса будет фильтрация только по этой категории, а не исключение;
  • Кеширование мешает видеть изменения — изменения не применяются из-за кеша;
  • Использование slug категории в параметре catcat принимает только ID, для slug нужен параметр category_name с отрицанием не работает.

Расширенные варианты: исключение нескольких категорий и исключение на страницах архива

Для исключения нескольких категорий передайте строку с минусами и ID через запятую:

$query->set( 'cat', '-10,-15,-20' );

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

if ( ! is_admin() && $query->is_main_query() && ( $query->is_home() || $query->is_archive() ) ) {
    $query->set( 'cat', '-10,-15' );
}

Сравнение подходов для исключения категорий

МетодПлюсыМинусы
pre_get_posts (код)Лёгкий, быстрый, без плагинов, гибкийТребует навыков, можно ошибиться с условиями
Плагин типа Ultimate Category ExcluderПростой интерфейс, для новичковДополнительный плагин, возможен конфликт, нагрузка
Редактирование шаблона (например, WP_Query)Полный контроль над выводомБолее громоздко, требует изменения темы

Практические советы по безопасности и производительности

  • Используйте is_main_query() и ! is_admin() для предотвращения побочных эффектов;
  • Проверяйте производительность запросов после изменений с помощью Query Monitor;
  • Избегайте сложных условий в pre_get_posts, если можно сделать проще;
  • Обновляйте кеш после внесения изменений;
  • Храните кастомный код в дочерней теме или в отдельном плагине, чтобы не потерять при обновлении.

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

⭐⭐⭐⭐⭐
Как создать автоматический импорт пользователей в WordPress с помощью CSV
04.02.2026
Как использовать pre_get_posts для изменения запросов в WordPress без плагинов
19.04.2026
Как решить проблему конфликта JavaScript в WordPress
05.12.2025
Как использовать WP хуки для автоматического изменения цен в WooCommerce
12.05.2026
Как автоматически отключать плагины в WordPress по расписанию
12.03.2026
×

AI-плагин

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

SEO и мета-теги

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

Изображения

Комментарии

Подробнее