Как вывести название категорий в карточке товара структурно?

По дефолту в карточке выводятся категории через запятую.
Категории : Дом, Компьютер, Работа , Кот
В виде винегрета. Уже давно ищу ответ как вывести структурно
Работа >> Компьютер
Дом>>Кот
У меня много одинаковых категорий по имени
и когда это в виде винегрета не понятно куда я именно перехожу.

Сейчас имею вот такой вот код вывода (это в content-product.php)

<?php
				$product_categories = get_the_terms( $post->ID, 'product_cat' );
				if (!empty($product_categories)) :
					foreach ($product_categories as $key=>$product_category) :
						?>
					<a href="<?php echo get_term_link($product_category); ?>">
                                         <?php echo esc_attr($product_category->name); ?></a>
						<?php if ($key+1 < count($product_categories)) echo ',';?>
					<?php endforeach; ?>
				<?php endif; ?>


То есть цикл есть но я так понял в него входят все категории и субкатегории и разделятся запятыми.
Долго мурыжил основы вывода собственных функций и аргументов ,но так к ни чему и не пришёл толком.
Может кто знает от такой реализации? Такой вывод же гораздо удобней.
Заранее спасибо.
  • Вопрос задан
  • 1349 просмотров
Пригласить эксперта
Ответы на вопрос 1
Да, Код который Вы показали, и выводит Вам винегрет. И в этот винегрет входят все категории, к которым подключен Ваш пост (товар).
Я думаю, что для получения структуры Вам необходимо выстроить иерархию для каждой категории. Причем, может случиться так, что Ваш товар включен в родительскую категорию, в категорию потомка(3е колено), а в дочернюю не включен. Тогда получается нужно исключать отсутствующую дочернюю категорию из структуры.

Например собрать иерархию можно так
/**
* Собирает родословную в строку [предок-родитель-потомок] или
* в массив ([0]=>предок,[1]=>родитель,[2]=>потомок) проверяя наличие id
* @param array $ids - массив типа id=>parent_id, на основании которого
* 						собирается родословная
* @param number $id - для кого строится родостловная, он же потомок
* @param string $divider - символ разделитель, если пусто cобирать в массив
* @return
*/
function create_hierarchical_path($ids, $id, $divider = ''){
	if ('' !== $divider){	//собираем строку
		$result = $id;
		while(isset($ids[$id]) && $ids[$id] != 0){
			$result = $ids[$id].$divider.$result;
			$id = $ids[$id];
		}
	}
	else {					// собираем массив
		$result = array();
		array_push ($result, $id);
		while(isset($ids[$id]) && $ids[$id] != 0){
			$id = $ids[$id];
			array_push ($result, $id);
		}
		$result = array_reverse($result);
	}
	return $result;
}
Получить список всех категорий можно так
$args = array(
		'taxonomy'=>'product_cat',
		'hide_empty'=>0,
		'fields'=>'id=>parent'	);
	// получаем список всех категорий
	$ids = get_terms('product_cat', $args);

Теперь имея родословную и список всех категорий можно составить необходимую Вам структуру
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы