Рубрики
WordPress

Как исключить нужные рубрики с главной страницы блога или сайта WordPress?

Есть несколько способов — от простого кода до плагинов. Разберём каждый способ исключить нужные рубрики с главной страницы блога или сайта подробно.

Способ 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:

  1. Установи плагин
  2. Перейди в настройки рубрики
  3. Поставь галочку «Исключить с главной»

Именно этот вариант выбрал я. Это самый простой, быстрый и безопасный способ.

Частые ошибки

ОшибкаПочему возникаетРешение
Код не работаетРедактировали 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 темы, потому что код сохранится при смене темы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *