Как перечислить 2 термина таксономии для должности на основе их иерархии


Я использую get_the_terms для отображения 2 терминов в сообщении, связанных с таксономией "местоположение". Условия - это пригород и город. Таксономия местоположения является иерархической, поэтому пригород является дочерним городом.

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

Моя проблема в том, что когда термины выводятся на в сообщении они перечислены в алфавитном порядке, и в некоторых случаях город будет указан первым:

Alpha (City), Beta (Suburb) 

Мне нужно, чтобы они отражали свою иерархию, чтобы они всегда перечислялись сначала по пригородам, а затем по городам.

Beta (Suburb), Alpha, (City)

Вот мой код.

<?php
$terms = get_the_terms ($post->id, 'location');

if ( !is_wp_error($terms)) : ?>

<li id="location">

<?php unset($locations);
foreach ($terms as $term) {
    $locations[] = $term->name;
    }

$location = join(", ", $locations);
?>

<?php echo $location; ?>

</li>
<?php endif ?>

Будет ли это лучше достигнуто с помощью wp_list_categories каким-либо образом? Кажется, есть опция "иерархическая", но не уверен в том, как ее использовать, поэтому она просто использует термины поста, а не все

Author: Andrew, 2011-07-12

2 answers

Мне удалось взломать это вместе, используя wp_get_object_terms. 'orderby' => 'term_id' был очень полезен. Вероятно, это не лучший метод, но, похоже, он работает нормально. Поскольку дочерние термины (пригороды) всегда создаются после родительских терминов (городов), они всегда будут иметь более высокий идентификатор.

<?php 
$terms = wp_get_object_terms($post->ID, 'location', array('orderby' => 'term_id', 'order' => 'DESC') );

if ( !empty( $terms ) ) :

    $location = array();
    foreach ( $terms as $term ) {
         $location[] = $term->name;
    }
    echo implode(', ', $location);  

endif; 
?>
 2
Author: Andrew, 2011-07-12 12:21:36

Я думаю, что самый простой способ сделать это в вашем случае - перевернуть массив.

foreach ($terms as $term) {
    $locations[] = $term->name;
}
$locations = array_reverse($locations);

Есть более сложные способы сделать это, но я думаю, что это должно сработать в вашей ситуации.

 1
Author: tollmanz, 2011-07-12 04:45:55