web-dev-qa-db-fra.com

Comment lister 2 termes de taxonomie pour un article, en fonction de leur hiérarchie

J'utilise get_the_terms pour afficher 2 termes sur un message, associés à la taxonomie "emplacement". Les termes sont la banlieue et la ville. La taxonomie de localisation étant hiérarchisée, la banlieue est un enfant de la ville.

Dans l'écran de post-édition, un utilisateur sélectionne sa ville, suivi de sa banlieue (qui répertorie les banlieues en fonction de la ville qu'il a choisie). Les deux sont sélectionnables dans les menus déroulants.

Mon problème est que, lorsque les termes sont publiés sur le message, ils sont répertoriés par ordre alphabétique et, dans certains cas, la ville apparaît en premier:

Alpha (City), Beta (Suburb) 

J'ai besoin d'eux pour refléter leur hiérarchie afin qu'ils soient toujours répertoriés par banlieue en premier, puis par ville.

Beta (Suburb), Alpha, (City)

Voici mon code.

<?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 ?>

Cela serait-il mieux réalisé avec wp_list_categories d'une manière ou d'une autre? Il semble qu'il existe une option "hiérarchique" mais ne sachant pas comment l'utiliser, il saisit simplement les termes du message et pas tout.

1
Andrew

J'ai réussi à pirater cela ensemble en utilisant wp_get_object_terms. Le 'orderby' => 'term_id' a été très utile. Ce n'est probablement pas la meilleure méthode, mais semble bien fonctionner. Comme les termes enfants (banlieue) sont toujours créés après les termes parents (Villes), ils auront toujours un ID supérieur.

<?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
Andrew

Je pense que le moyen le plus simple de réaliser cela dans votre cas serait d'inverser le tableau.

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

Il existe des moyens plus compliqués de le faire, mais je pense que cela devrait fonctionner dans votre cas.

1
tollmanz