Рубрики 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 по умолчанию
- Вариант 1 — Шаблон: вывести подрубрики в category.php
- Вариант 2 — Исключение постов дочерних рубрик через pre_get_posts
- Шорткод для Elementor: вывести подрубрики без правки темы
- Плагины и настройки (плагин рубрики wordpress)
- Практические советы, SEO и частые ошибки (вывод рубрики wordpress)
- Источники
- Заключение
Как это работает — поведение 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
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. Этот метод изменяет главный запрос: для страницы родительской рубрики он оставит только записи, напрямую привязанные к самой родительской рубрике (исключит записи, которые принадлежат только дочерним рубрикам).
Пример простого фильтра:
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!):
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».
Пример шорткода:
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_categories / примеры параметров: https://wp-kama.ru/function/get_categories
- Пример с pre_get_posts и исключением постов дочерних рубрик: https://www.wphook.ru/cats/only-parent-category.html
- Пример вывода дочерних рубрик и get_terms (StackOverflow на русском): https://ru.stackoverflow.com/questions/737863/Вывести-список-дочерних-рубрик-wordpress
- Как выводить только дочернюю рубрику в шаблоне (англ.): https://www.wpbeginner.com/wp-themes/how-to-display-only-child-category-in-your-wordpress-post-loop/
- Общая справка по рубрикам WordPress: https://hostiq.ua/wiki/wordpress-categories/
- Дополнительные обсуждения/примеры в русскоязычных сообществах: https://qna.habr.com/q/496009 и https://www.cyberforum.ru/wordpress/thread1647080.html
Заключение
Коротко: для задачи «в родительской рубрике ‘Блог’ показывать только ссылки на подрубрики» в большинстве случаев достаточно простого шаблонного решения — вывести дочерние рубрики через get_terms/get_categories и пропустить Loop. Если править тему неудобно, используйте фильтр pre_get_posts, чтобы исключить записи дочерних рубрик из основного запроса. Плагин рубрики WordPress нужен редко; чаще удобнее сделать шорткод и вставить его в Elementor. В итоге вы получите чистую страницу рубрики «Блог» с навигацией по подрубрикам и списком постов только внутри самих подрубрик — именно так организуют рубрики WordPress для улучшения навигации и UX.