Вывод категорий со списком подкатегорий (если это подкатегория, то вывод списка постов подкатегории)
Дано:
Файл category.php
Созданы рубрики вот по такой схеме:
- Библиотека
1.1. Руководящие документы
1.1.1. Конвенции резолюции кодексы
1.1.2. Информация по безопасности
1.2. Справочные материалы
1.2.1. Медицина
1.2.2. Техника безопасности
1.2.3. Ответственность и право - Софт
2.1. Программы по навигации
2.2. Метеорология
2.3. Работа с документами
Как это должно выглядеть:
Задача:
- Проверить, есть ли у данной категории дочерние категории.
Если есть дочерние категории имеются, то выводим ссылку на них, если дочерних категорий нет - то мы выводим список постов. - Может нужно как-то решать задачу не только через файл category.php?
Вот что получилось:
В файле category.php я вывожу список постов (2 часть условия после else) и проблем с этим нет, но с первой частью там где (echo 'есть подкатегория';) проблема - не выводится название категории и не могу получить список ее дочерних категорий:
<?php
function check_if_category_has_child () {
$term = get_queried_object();
$children = get_terms( $term->taxonomy, array(
'parent' => $term->term_id,
'hide_empty' => false
) );
return $children;
}
if ( is_category() and check_if_category_has_child() ) {
echo 'есть подкатегория';
// Вот здесь нужно вывести название категории где сейчас пользователь и список ее дочерних категорий
}
//Если дочерних категорий нет то выводится код ниже и он работает как нужно
else {
$category = get_queried_object();
global $post;
$postslist = get_posts( [
'category' => $category->term_id,
'orderby' => 'title'
] );
foreach( $postslist as $post ){
setup_postdata($post);
?>
<h2 class="wrapper-news_title">Список постов</h2>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
<?php
}
wp_reset_postdata();
}
?>
Со списком постов проблемы нет, если я нахожусь в категории у которой дочерних категорий нет то список постов выводится.
Но я не могу никак вывести в первой части кода где условие проходит проверку (echo 'есть подкатегория'), какая это категория и как получить список ее дочерних категорий.
Возможно я неправильно вообще начал делать, до этого писал только лендинги, а сейчас стоит задача сделать "блоговидный" сайт, и я сильно потерялся в том как нужно правильно это дело реализовать.
Еще я сомневаюсь в оптимизации данного кода, мне кажется его можно сделать более красивым и компактным.
Если кто поможет написать правильный код или поможет с реализацией подобного вывода буду очень признателен, ну и конечно с меня пивко, много пивка
.
Вот получается если опустить всю воду что я написал, то мне нужно сделать вывод названия текущей категории и списка ее дочерних категорий, но то что я делаю не работает (
<?php
$current_cat_id = get_queried_object()->term_id;
$args = array(
'child_of' => $current_cat_id,
'orderby' => 'name',
'order' => 'ASC',
'hide_empty' => 1,
'hierarchical' => 1,
'number' => 0, // сколько выводить?
);
$categories = get_categories( $args );
if( $categories ){
foreach( $categories as $cat ){ ?>
<h2 class="wrapper-news_title">2<?php $current_cat_id->name ?></h2>
<a href="<?php $cat->slug ?>"><?php $cat->name ?></a>
<?php
}
}?> 
Попробуйте обратитесь на биржу фриланса.
Вам помогу с логикой. До 5$ уверен что справятся с задачей.
В вашу задачу не вникал - но нужно время.
Если за неделю не сможете решить - отпишитесь здесь.
Вопрос решен? логику смогли прописать?
Сложно назвать это правильным решением, но заказчик смирился с тем, что так как планировалось изначально не получится.
Решил сделать через wp_list_categories();
И настроил вывод по фильтру: проверка (имеется дочерняя категория) -> значит выводим список категорий, (дочерних категорий нет) -> выводим список постов.
Получилось топорно, но работает.
1й вариант (страница категории имеет дочерние категории)
2й Вариант (не нашли в текущей категории дочерних)

Код всей секции который используется для вывода (может кому пригодится, но честно, собран из нескольких готовых вариантов и не факт что оптимизирован):
<section class="main-wrapper"> <!-- ХЛЕБНЫЕ КРОШКИ --> <div class="container-fluid"> <div class="row"> <div class="col-md-12"> <div class="breadcrumbs-wrapper"> <div class="breadcrumbs"> <?php if( function_exists( 'aioseo_breadcrumbs' ) ) aioseo_breadcrumbs(); ?> </div> </div> </div> </div> </div> <!-- /ХЛЕБНЫЕ КРОШКИ --> <!-- ЗАГОЛОВОК И ОПИСАНИЕ КАТЕГОРИИ --> <div class="container-fluid"> <div class="row"> <div class="col-md-12"> <div class="cat-title"> <h1><?php single_cat_title();?></h1> </div> <?php if ( category_description() ) : ?> <div class="cat-descript"> <?php echo category_description(); ?> </div> <?php endif; ?> </div> </div> </div> <!-- /ЗАГОЛОВОК И ОПИСАНИЕ КАТЕГОРИИ --> <!-- ГЕНИРИРУЕМ ВЫВОД КАТЕГОРИЙ ИЛИ ПОСТОВ --> <div class="container-fluid"> <div class="row"> <div class="col-md-8"> <!-- Функция проверки на наличие дочерней категории --> <?php function check_if_category_has_child () { $term = get_queried_object(); $children = get_terms( $term->taxonomy, array( 'parent' => $term->term_id, 'hide_empty' => false ) ); return $children; } <!-- Выводим блок если дочерняя категория true --> if ( is_category() and check_if_category_has_child() ) { $this_category = get_category($cat); //echo $this_category->cat_ID; $parent_term_id =$this_category->cat_ID; // term id of parent term if (is_category()) { if (count(get_categories('child_of='.$parent_term_id))) { echo '<div class="wrapper-news__border cat-wrapper">'; $current_cat=get_query_var('cat'); $cat_args = array( 'show_option_none' => __('No categories'), 'orderby' => 'name', 'order' => 'ASC', 'style' => 'list', 'hide_empty' => 1, 'use_desc_for_title' => 1, 'child_of' => $current_cat, 'hierarchical' => true, 'title_li' => 0, 'number' => NULL, 'echo' => 1, 'depth' => 0, 'current_category' => 0, 'pad_counts' => 0, 'taxonomy' => 'category', 'walker' => 'Walker_Category', 'hide_title_if_empty' => false, 'separator' => '<br />', 'hierarchical' => 1, ); echo '<h2 class="wrapper-news_title">Категории:</h2>'; wp_list_categories( $cat_args ); echo '</div>'; <!-- Выводим блок если дочерняя категория false --> <!-- Выводим список постов --> } else { $category = get_queried_object(); global $post; $postslist = get_posts( [ 'posts_per_page' => 10, 'category' => $category->term_id, 'orderby' => 'title' ] ); ?> <div class="wrapper-news__border cat-wrapper"> <h2 class="wrapper-news_title">Список постов</h2> <?php foreach( $postslist as $post ){ setup_postdata($post); ?> <div class="post-link__wrapper"> <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a> <div class="post-link__snippets"> <div class="post-link__item date__publication"> <svg class="svg-icon"><path></path> </svg> <?php the_date(); ?> </div> <div class="post-link__item post-link__comments"> <svg class="svg-icon"><path></path> <?php comments_number(); ?> </div> </div> </div> <?php } wp_reset_postdata(); } ?> </div> </div> <!-- Выводим сайтбар --> <div class="col-md-4"> <?php get_sidebar(); ?> </div> </div> </div> </section>