Есть несколько способов — от простого кода до плагинов. Разберём каждый способ исключить нужные рубрики с главной страницы блога или сайта подробно.
Способ 1: Через functions.php (самый надёжный)
Это самый правильный подход — изменить основной запрос до того, как WordPress его выполнит.
function exclude_categories_from_home( $query ) {
// Работаем только на главной странице и только для основного запроса
if ( $query->is_home() && $query->is_main_query() ) {
// Укажи ID рубрик через запятую (знак минус = исключить)
$query->set( 'cat', '-5,-12,-34' );
}
}
add_action( 'pre_get_posts', 'exclude_categories_from_home' );
Где найти ID рубрики: Перейди в Записи → Рубрики, наведи на нужную рубрику и посмотри в строке браузера — там будет tag_ID=5. Это и есть ID.
Способ 2: Исключить рубрики по slug (если ID неизвестны)
function exclude_categories_by_slug( $query ) {
if ( $query->is_home() && $query->is_main_query() ) {
// Получаем объекты рубрик по slug
$excluded = array( 'news', 'announcements', 'videos' );
$ids = array();
foreach ( $excluded as $slug ) {
$cat = get_category_by_slug( $slug );
if ( $cat ) {
$ids[] = -$cat->term_id; // Минус = исключить
}
}
if ( ! empty( $ids ) ) {
$query->set( 'cat', implode( ',', $ids ) );
}
}
}
add_action( 'pre_get_posts', 'exclude_categories_by_slug' );
Способ 3: Через tax_query (более гибкий вариант)
Подходит, если нужно исключить рубрики с дочерними подрубриками:
function exclude_categories_tax_query( $query ) {
if ( $query->is_home() && $query->is_main_query() ) {
$query->set( 'tax_query', array(
array(
'taxonomy' => 'category',
'field' => 'term_id',
'terms' => array( 5, 12, 34 ), // ID рубрик без минуса
'operator' => 'NOT IN',
),
));
}
}
add_action( 'pre_get_posts', 'exclude_categories_tax_query' );
⚠️ Важно: метод через
catс минусом не всегда исключает дочерние рубрики, аtax_queryсNOT INделает это корректно.
Способ 4: Если главная — статическая страница
Если в настройках (Настройки → Чтение) установлена статическая главная страница, а записи выводятся на отдельной странице блога — условие is_home() сработает именно для страницы блога. Тогда код остаётся тем же, он корректно определит нужный запрос.
Но если ты выводишь записи вручную через WP_Query в шаблоне, нужно другое решение:
$args = array(
'post_type' => 'post',
'posts_per_page' => 10,
'category__not_in' => array( 5, 12, 34 ), // ID рубрик для исключения
);
$my_query = new WP_Query( $args );
Способ 5: Через плагин без кода
Если не хочется трогать код — используй плагин Taxonomy Terms Order или более простой WPFront Category Post.
Но самый популярный для этой задачи — Category Excluder:
- Установи плагин
- Перейди в настройки рубрики
- Поставь галочку «Исключить с главной»
Именно этот вариант выбрал я. Это самый простой, быстрый и безопасный способ.
Частые ошибки
| Ошибка | Почему возникает | Решение |
|---|---|---|
| Код не работает | Редактировали query_posts() вместо pre_get_posts | Использовать только pre_get_posts |
| Дочерние рубрики всё равно показываются | Использован метод cat с минусом | Заменить на tax_query с NOT IN |
| Изменения не применяются | Активен кэш страниц | Очистить кэш плагина кэширования |
Код добавлен в functions.php дочерней темы, но не работает | Дочерняя тема не активирована | Проверить активную тему |
Куда добавлять код
Лучший способ — создать небольшой плагин в папке /wp-content/plugins/my-custom/my-custom.php:
<?php
/**
* Plugin Name: My Category Exclude
* Description: Исключает рубрики с главной страницы
*/
function exclude_categories_from_home( $query ) {
if ( $query->is_home() && $query->is_main_query() ) {
$query->set( 'cat', '-5,-12' );
}
}
add_action( 'pre_get_posts', 'exclude_categories_from_home' );
Это лучше, чем добавлять в functions.php темы, потому что код сохранится при смене темы.