Да, Код который Вы показали, и выводит Вам винегрет. И в этот винегрет входят все категории, к которым подключен Ваш пост (товар).
Я думаю, что для получения структуры Вам необходимо выстроить иерархию для каждой категории. Причем, может случиться так, что Ваш товар включен в родительскую категорию, в категорию потомка(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);
Теперь имея родословную и список всех категорий можно составить необходимую Вам структуру