Как использовать 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
01.02.2026
Как использовать REST API в WordPress для создания простого плагина
08.11.2025
Автоматическое удаление товаров WooCommerce после первого заказа: практическое руководство
29.05.2026
Как создать автоматический импорт постов из внешнего JSON в WordPress
01.04.2026
Как отключить автопроигрывание видео в WordPress: практические методы
29.01.2026
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше