WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

Нужно получить список категорий таксономии соблюдая иерархию

Имеется таксономия -> education_category, мне нужно вывести иерархию категорий данной таксономии. У меня есть код который выводит все категории таксономии но без соблюдения списка иерархии, к тому же когда находимся на текущей категории, нужно добавлять класс current-cat. Буду благодарен за помощь!

Код который выводит все категории таксономии но без соблюдения списка иерархии:

<?php
   $taxonomy_name = "education_category";
   $parent_terms = get_the_terms($post->ID, 'education_category');
   foreach ($parent_terms as $pterm) {
	   $terms = get_terms($taxonomy_name, array('parent' => $pterm->term_id, 'orderby' => 'slug', 'hide_empty' => false));
	   foreach ($terms as $term) {
		   echo '<li><a href="' . get_term_link($term) . '" class="toggle-posts">' . $term->name . '</a></li>';
	   }
   }
?>

Сейчас мой код отображает следующее:

  • Категория таксономии
  • Саб категория таксономии
  • Категория таксономии
  • Категория таксономии
  • Саб категория таксономии
  • Саб категория таксономии 2

В результате я хочу получить:

  • Категория таксономии
    • Саб категория таксономии
  • Категория таксономии
  • Категория таксономии
    • Саб категория таксономии
    • Саб категория таксономии 2
0
emalomuzh
7.3 года назад
  • 0
    Kama9616

    Вот функцию нашел в сети, которая собирает массив терминов с учетом вложенности:

    /**
     * Recursively sort an array of taxonomy terms hierarchically. Child categories will be
     * placed under a 'children' member of their parent term.
     * @param Array   $cats     taxonomy term objects to sort
     * @param Array   $into     result array to put them in
     * @param integer $parentId the current parent ID to put them in
     */
    function sort_terms_hierarchicaly( & $cats, & $into, $parentId = 0 ){
    	foreach( $cats as $i => $cat ){
    		if( $cat->parent == $parentId ){
    			$into[ $cat->term_id ] = $cat;
    			unset( $cats[$i] );
    		}
    	}
    
    	foreach( $into as $top_cat ){
    		$top_cat->children = array();
    		sort_terms_hierarchicaly( $cats, $top_cat->children, $top_cat->term_id );
    	}
    }

    Используем так:

    $categories = get_terms('category', array('hide_empty' => false));
    $cat_hierarchy = array();
    sort_terms_hierarchicaly( $categories, $cat_hierarchy );
    
    print_r( $cat_hierarchy );

    Получим массив:

    Array
    (
    	[1] => WP_Term Object
    		(
    			[term_id] => 1
    			[name] => Не WordPress
    			[slug] => raznoe
    			[term_group] => 0
    			[term_taxonomy_id] => 1
    			[taxonomy] => category
    			[description] => 
    			[parent] => 0
    			[count] => 8
    			[filter] => raw
    			[term_order] => 1
    			[children] => Array
    				(
    					[33] => WP_Term Object
    						(
    							[term_id] => 33
    							[name] => Полезные мелочи
    							[slug] => poleznyie-melochi
    							[term_group] => 0
    							[term_taxonomy_id] => 33
    							[taxonomy] => category
    							[description] => 
    							[parent] => 1
    							[count] => 9
    							[filter] => raw
    							[term_order] => 1
    							[children] => Array
    								(
    								)
    
    						)
    
    				)
    
    		)
    
    	[3] => WP_Term Object
    		(
    			[term_id] => 3
    			[name] => WordPress
    			[slug] => wordpress
    			[term_group] => 0
    			[term_taxonomy_id] => 3
    			[taxonomy] => category
    			[description] => 
    			[parent] => 0
    			[count] => 0
    			[filter] => raw
    			[term_order] => 2
    			[children] => Array
    				(
    					[1037] => WP_Term Object
    						(
    							[term_id] => 1037
    							[name] => Темы WordPress
    							[slug] => temy-wordpress
    							[term_group] => 0
    							[term_taxonomy_id] => 1045
    							[taxonomy] => category
    							[description] => 
    							[parent] => 3
    							[count] => 3
    							[filter] => raw
    							[term_order] => 0
    							[children] => Array
    								(
    								)
    
    						)
    
    					[5] => WP_Term Object
    						(
    							[term_id] => 5
    							[name] => Авторские Функции
    							[slug] => functions
    							[term_group] => 0
    							[term_taxonomy_id] => 5
    							[taxonomy] => category
    							[description] => 
    							[parent] => 3
    							[count] => 15
    							[filter] => raw
    							[term_order] => 1
    							[children] => Array
    								(
    								)
    
    						)
    
    				)
    
    		)
    
    )

    Остается его обработать и вывести что нужно... Больше не подскажу, сорри...

    emalomuzh 7.3 года назад

    Что если использовать wp_list_category?

    Вот код:

    $args = array(
    					'taxonomy'     => 'education_category',
    					'orderby'      => 'name',
    					'hide_empty'   => 0,
    					'title_li'     => '',
    					'hierarchical' => 1,
    					'child_of'     => 51,
    				);
    				wp_list_categories( $args );

    Как нам получать child_of так, чтобы мы могли находится как на вложенной категории так и на странице поста, и слева выводился список с учетом моего условия?

    Первая категория (не показываем)

    • Вложенная категория 1
    • Вложенная категория 2
      • Вложенная категория второй категории
      • Вложенная категория второй категории
    • Вложенная категория 3

    Вторая категория (не показываем)

    По логике вещей я должен передавать в child_of ID родительской категории...

    Kama 7.3 года назад

    Я должен передавать в child_of ID родительской категории...

    Да так и есть!

    Рубрики записи получаются с помощью get_the_terms()
    Текущую рубрику на странице рубрики можно получить с помощью get_queried_object()

    Там везде есть в примерах как получить нужный ID...

    emalomuzh 7.3 года назад

    Я использую get_queried_object_id
    Да, на странице родительской категории я получаю то что нужно, большое спасибо, это помогает! Но на странице поста получаю сообщение о том что категории отсутствуют...
    Но как я могу использовать get_queried_object в моем случае?

    Вот скриншоты:

    http://joxi.ru/YmEY64OUYey0m6
    http://joxi.ru/vAWMNk5tZa0xmW

    Осталось получать список как на первом скриншоте на странице поста, я буду очень благодарен Вам!

    emalomuzh 7.3 года назад

    Когда я использую:
    get_queried_object()->term_id

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

    Комментировать
  • 0

    http://wp-kama.ru/function/wp_list_categories
    https://wp-kama.ru/function/wp_nav_menu#primer-ispolzovaniya-parametra-walker

    emalomuzh 7.3 года назад
    <?php
       $taxonomy_name = "education_category";
       $parent_terms = get_the_terms($post->ID, 'education_category');
       foreach ($parent_terms as $pterm) {
    	   $terms = get_terms($taxonomy_name, array('parent' => $pterm->term_id, 'orderby' => 'slug', 'hide_empty' => false));
    	   foreach ($terms as $term) {
    		   echo '<li><a href="' . get_term_link($term) . '" class="toggle-posts">' . $term->name . '</a></li>';
    	   }
       }
    ?>

    Я уже перебробовал множество вариантов, могли бы вы взглянуть на мой код?

    emalomuzh 7.3 года назад

    Вот логика, предполагаем что мы находимся на странице первой категории:

    • Первая категория (не показываем)
      • Вложенная категория 1
      • Вложенная категория 2
        • Вложенная категория второй категории
        • Вложенная категория второй категории
      • Вложенная категория 3
    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация