Как перечислить 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 каким-либо образом? Кажется, есть опция "иерархическая", но не уверен в том, как ее использовать, поэтому она просто использует термины поста, а не все
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;
?>
Я думаю, что самый простой способ сделать это в вашем случае - перевернуть массив.
foreach ($terms as $term) {
$locations[] = $term->name;
}
$locations = array_reverse($locations);
Есть более сложные способы сделать это, но я думаю, что это должно сработать в вашей ситуации.