Веб

Рубрики WordPress: вывести только дочерние без постов

Как в родительской рубрике WordPress вывести только дочерние рубрики без постов. Пошаговые инструкции: шаблон category.php, pre_get_posts, шорткод для Elementor, плагин рубрики WordPress. SEO-советы и код.

Как в WordPress вывести в родительской рубрике только дочерние рубрики без постов? В основной рубрике ‘Блог’ должны отображаться только ссылки на подрубрики, а список постов — внутри дочерних рубрик. Какие плагины или настройки использовать?

Чтобы в родительской рубрике «Блог» отображались только ссылки на подрубрики без самих постов, в рубриках WordPress это обычно делается двумя способами: вывести дочерние рубрики в шаблоне (get_categories / get_terms) или отфильтровать основной запрос через хук pre_get_posts — плагин рубрики WordPress чаще не требуется. Ниже — пошагово: готовые сниппеты для category.php, фильтр в functions.php, шорткод для Elementor и рекомендации по плагинам и SEO.


Содержание


Как это работает — поведение WordPress по умолчанию

По умолчанию архив рубрики в WordPress показывает записи не только самой категории, но и записи из её дочерних рубрик. То есть, если у вас есть родительская рубрика «Блог» и в ней подрубрики, то в архиве «Блог» увидите все записи, привязанные к «Блогу» и к его детям. Это поведение описано и показано в примерах с фильтрацией запросов — см. пример с pre_get_posts на wphook: https://www.wphook.ru/cats/only-parent-category.html.

Если цель — чтобы на странице «Блог» были только ссылки на подрубрики (а сами посты показывались только при переходе в каждую подрубрику), у вас есть два рабочих пути: выводить в шаблоне только список подрубриков и пропускать Loop, либо изменить основной WP_Query, чтобы исключить из страницы родителя записи дочерних рубрик.


Вариант 1 — Шаблон: вывести список подрубриков в category.php

Это самый прямой и простой путь. Вы правите шаблон category.php (лучше в дочерней теме) и добавляете условие для рубрики ‘blog’ — выводите список дочерних рубрик и не запускаете стандартный цикл постов.

Пример кода (вставьте в начале category.php, перед Loop):

php
<?php
get_header();

$term = get_queried_object(); // текущая рубрика
if ( $term && $term->slug === 'blog' ) { // или проверка по ID: $term->term_id == 123
 // Получить только прямых детей:
 $children = get_terms( array(
 'taxonomy' => 'category',
 'parent' => $term->term_id,
 'hide_empty' => false, // true — скрыть пустые
 'orderby' => 'name',
 'order' => 'ASC',
 ) );

 if ( ! empty( $children ) ) {
 echo '<ul class="blog-subcats">';
 foreach ( $children as $child ) {
 printf(
 '<li><a href="%s">%s</a></li>',
 esc_url( get_category_link( $child->term_id ) ),
 esc_html( $child->name )
 );
 }
 echo '</ul>';

 // Не выводим Loop — страница родителя показывает только ссылки на подрубрики
 get_footer();
 exit; // или return, в зависимости от структуры темы
 }
}

// Дальше обычный Loop для других рубрик
if ( have_posts() ) : 
 while ( have_posts() ) : the_post();
 get_template_part( 'template-parts/content', get_post_format() );
 endwhile;
endif;

get_footer();

Пояснения:

  • Для получения подрубриков используйте parent (только прямые дети) или child_of (включая вложенные уровни). Подробнее о параметрах функции get_categories / get_terms — см. разбор на wp-kama: https://wp-kama.ru/function/get_categories и примеры на StackOverflow: https://ru.stackoverflow.com/questions/737863/Вывести-список-дочерних-рубрик-wordpress.
  • Параметр hide_empty управляет показом пустых рубрик.
  • Используйте exit или return аккуратно: в некоторых темах лучше закрывать вывод через условие else и не ломать структуру.

Вариант 2 — Исключение постов дочерних рубрик через pre_get_posts

Если вы хотите оставить шаблон без правок и управлять выводом через фильтрацию запроса, используйте pre_get_posts в functions.php. Этот метод изменяет главный запрос: для страницы родительской рубрики он оставит только записи, напрямую привязанные к самой родительской рубрике (исключит записи, которые принадлежат только дочерним рубрикам).

Пример простого фильтра:

php
function na_exclude_child_posts( $query ) {
 if ( ! is_admin() && $query->is_main_query() && $query->is_category() ) {
 $cat = $query->get_queried_object();
 if ( $cat && $cat->parent == 0 ) { // только для родительских рубрик
 // Вернуть только записи, прямо привязанные к этой категории (без дочерних)
 $query->set( 'cat', $cat->term_id );
 }
 }
}
add_action( 'pre_get_posts', 'na_exclude_child_posts' );

Комментарий:

  • Этот подход взят и адаптирован из примеров на wphook и других сообществах: https://www.wphook.ru/cats/only-parent-category.html и https://qna.habr.com/q/496009.
  • Если у поста стоит и родительская, и дочерняя рубрика — он останется в выдаче, потому что привязан прямо к родителю. Если хотите исключить и такие записи, нужно дополнительно получать список ID постов дочерних рубрик и добавлять их в post__not_in — но это более тяжёлый по производительности путь и требует кеширования.

Пример исключения всех постов, которые принадлежат дочерним рубрикам (внимание: heavy!):

php
function na_exclude_child_posts_heavy( $query ) {
 if ( ! is_admin() && $query->is_main_query() && $query->is_category() ) {
 $cat = $query->get_queried_object();
 if ( $cat && $cat->parent == 0 ) {
 $children = get_terms( array(
 'taxonomy' => 'category',
 'parent' => $cat->term_id,
 'fields' => 'ids',
 'hide_empty' => false,
 ) );
 if ( $children ) {
 $child_posts = get_posts( array(
 'category__in' => $children,
 'fields' => 'ids',
 'numberposts' => -1,
 ) );
 if ( $child_posts ) {
 $query->set( 'post__not_in', $child_posts );
 }
 }
 }
 }
}
add_action( 'pre_get_posts', 'na_exclude_child_posts_heavy' );

Рекомендация: при большом количестве записей и рубрик такой код замедлит сайт — используйте transient/кеширование списка ID или предпочитайте шаблонный вариант.


Шорткод для Elementor: вывести подрубрики без правки темы

Elementor (и другие конструктора) не выполняет PHP в виджетах, но поддерживает шорткоды. Поэтому можно добавить шорткод в functions.php и вставить его в Elementor через виджет «Shortcode».

Пример шорткода:

php
function na_subcats_shortcode( $atts ) {
 $atts = shortcode_atts( array(
 'parent' => '',
 'hide_empty' => '0',
 ), $atts, 'subcats' );

 $parent = $atts['parent'];
 if ( ! $parent ) return '';

 $parent_id = is_numeric( $parent ) ? intval( $parent ) : get_cat_ID( $parent );
 if ( ! $parent_id ) return '';

 $children = get_terms( array(
 'taxonomy' => 'category',
 'parent' => $parent_id,
 'hide_empty' => (bool) $atts['hide_empty'],
 ) );

 if ( empty( $children ) ) return '';

 $out = '<ul class="subcats">';
 foreach ( $children as $c ) {
 $out .= sprintf( '<li><a href="%s">%s</a></li>',
 esc_url( get_category_link( $c->term_id ) ),
 esc_html( $c->name )
 );
 }
 $out .= '</ul>';
 return $out;
}
add_shortcode( 'subcats', 'na_subcats_shortcode' );

Использование в Elementor: вставьте виджет Shortcode и укажите, например, [subcats parent="blog" hide_empty="0"] или [subcats parent="123"] (ID рубрики).


Плагины и настройки (плагин рубрики wordpress)

Нередко плагины не нужны — два предыдущих метода решают задачу. Но если вы не хотите трогать код, рассмотрите варианты:

  • Использовать шорткод-генератор (как показано выше) и поместить его через Elementor — безопасно и гибко.
  • Плагины, которые помогают управлять видимостью категорий или выводом списков: ищите в репозитории плагины по ключевым словам «list categories», «category exclude», «category shortcode». Конкретные решения (без ссылки): плагины для вывода списков рубрик и плагины для исключения категорий из архивов/лент облегчают задачу для не‑разработчиков.
  • Если нужен контроль над выдачей (исключать категории из главной, из архивов), есть плагины-исключатели — но учтите: они обычно манипулируют запросом, то есть решают ту же задачу, что и pre_get_posts.

Если выбираете плагин, проверяйте совместимость, рейтинг и обновления, и всё равно тестируйте на тестовой копии сайта.


Практические советы, SEO и частые ошибки (вывод рубрики wordpress)

  • Как выбрать parent vs child_of: используйте parent для прямых подрубрик, child_of — если нужны все вложенные уровни. Подробнее о параметрах — см. https://wp-kama.ru/function/get_categories.
  • Что если на странице родителя пусто? — добавьте объясняющий текст/лидер и список подрубриков; это лучше для UX и SEO, чем полностью пустая страница.
  • SEO: страница родителя с одними ссылками — допустима, но если она не несёт ценности, можно рассмотреть noindex или добавить описание рубрики, чтобы страница имела смысл для поисковиков.
  • Кэш и производительность: при использовании post__not_in или выборки всех ID постов дочерних категорий используйте транзиенты, чтобы не нагружать БД на больших сайтах.
  • Тестирование: очистите кеш плагинов и браузера после правок; проверьте мобильную и десктопную версию.
  • Частая ошибка: править родную тему вместо дочерней — создайте дочернюю тему или используйте плагин для пользовательских сниппетов.

Источники


Заключение

Коротко: для задачи «в родительской рубрике ‘Блог’ показывать только ссылки на подрубрики» в большинстве случаев достаточно простого шаблонного решения — вывести дочерние рубрики через get_terms/get_categories и пропустить Loop. Если править тему неудобно, используйте фильтр pre_get_posts, чтобы исключить записи дочерних рубрик из основного запроса. Плагин рубрики WordPress нужен редко; чаще удобнее сделать шорткод и вставить его в Elementor. В итоге вы получите чистую страницу рубрики «Блог» с навигацией по подрубрикам и списком постов только внутри самих подрубрик — именно так организуют рубрики WordPress для улучшения навигации и UX.

Авторы
Проверено модерацией
Модерация
Рубрики WordPress: вывести только дочерние без постов