WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

Вывод категорий со списком подкатегорий (если это подкатегория, то вывод списка постов подкатегории)

Дано:
Файл category.php
Созданы рубрики вот по такой схеме:

  1. Библиотека
    1.1. Руководящие документы
    1.1.1. Конвенции резолюции кодексы
    1.1.2. Информация по безопасности
    1.2. Справочные материалы
    1.2.1. Медицина
    1.2.2. Техника безопасности
    1.2.3. Ответственность и право
  2. Софт
    2.1. Программы по навигации
    2.2. Метеорология
    2.3. Работа с документами

Как это должно выглядеть:

Задача:

  1. Проверить, есть ли у данной категории дочерние категории.
    Если есть дочерние категории имеются, то выводим ссылку на них, если дочерних категорий нет - то мы выводим список постов.
  2. Может нужно как-то решать задачу не только через файл category.php?

Вот что получилось:
В файле category.php я вывожу список постов (2 часть условия после else) и проблем с этим нет, но с первой частью там где (echo 'есть подкатегория'wink проблема - не выводится название категории и не могу получить список ее дочерних категорий:

<?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 'есть подкатегория'), какая это категория и как получить список ее дочерних категорий.

Возможно я неправильно вообще начал делать, до этого писал только лендинги, а сейчас стоит задача сделать "блоговидный" сайт, и я сильно потерялся в том как нужно правильно это дело реализовать.
Еще я сомневаюсь в оптимизации данного кода, мне кажется его можно сделать более красивым и компактным.
Если кто поможет написать правильный код или поможет с реализацией подобного вывода буду очень признателен, ну и конечно с меня пивко, много пивка smile.

Заметки к вопросу:
DTropinin месяц назад

Вот получается если опустить всю воду что я написал, то мне нужно сделать вывод названия текущей категории и списка ее дочерних категорий, но то что я делаю не работает (

<?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
	}
}?>
0
DTropinin
месяц назад
  • 0
    stepan1798 www.weblancer.net/users/stepanko/?affili...

    Если кто поможет написать правильный код или поможет с реализацией подобного вывода буду очень признателен, ну и конечно с меня пивко, много пивка smile.

    Попробуйте обратитесь на биржу фриланса.
    Вам помогу с логикой. До 5$ уверен что справятся с задачей.
    В вашу задачу не вникал - но нужно время.
    Если за неделю не сможете решить - отпишитесь здесь.

    stepan 29 дней назад

    Вопрос решен? логику смогли прописать?

    DTropinin 27 дней назад

    Сложно назвать это правильным решением, но заказчик смирился с тем, что так как планировалось изначально не получится.
    Решил сделать через 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>
    
    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация