Диагностика задачи: зачем исключать категорию из главной ленты
Часто в проектах на 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 категории в параметре
cat—catпринимает только 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, если можно сделать проще; - Обновляйте кеш после внесения изменений;
- Храните кастомный код в дочерней теме или в отдельном плагине, чтобы не потерять при обновлении.