Récupérer les termes d’une taxonomie en rapport avec un terme d’une autre taxonomie

Mon titre n’est pas forcément très clair, je pense que le mieux c’est d’expliquer par l’exemple en quoi ce code peut-être utile. Je développe actuellement un site dont les articles ont 2 taxonomies différentes : pays et villes. Sur la page d’un pays, je souhaite afficher toutes les villes de ce pays et qui sont associées à au moins un article.

Comme il n’existe pas, à ma connaissance, de moyen pour faire un lien direct entre les termes de taxonomies différentes,  j’ai écrit ce bout de code qui me permet donc de récupérer toutes les ID des termes souhaités.

Cela se fait en plusieurs étapes :

  • En premier lieu, je récupère tous les objets qui sont associés à mon terme de base en question (par exemple “France” dans la taxonomie pays)
  • Pour chaque objet, je récupère les termes dans la taxonomie souhaitée (par exemple “villes”) et je boucle dessus afin de récupérer uniquement les ID (je n’avais pas besoin du reste dans le cas présent)
  • Enfin, je passe mon tableau d’IDs dans la fonction array_unique afin de supprimer les doublons

Reste à utiliser ce tableau comme on le souhaite : affichage d’une liste avec wp_list_categories() par exemple, réutilisation dans une autre fonction, etc.

(Si vous avez une idée moins verbeuse pour le titre de l’article, je suis preneur)

<?php
$base_taxonomy = 'pays';
$term_id = '1';

$required_taxonomy = 'villes';
$required_terms = array();
$required_terms_id = array();

$objects_in_tax = get_objects_in_term( $term_id, $taxonomy );

if( !empty( $objects_in_tax ) ) {
    if ( !is_wp_error( $objects_in_tax ) ) {
        foreach ( $objects_in_tax as $post_id ) {
            $required_terms = wp_get_object_terms( $post_id, $required_taxonomy );
            if ( !empty( $required_terms ) {
                if ( !is_wp_error( $required_terms ) ) {
                    foreach( $required_terms as $term ) {
                        $required_terms_id[] = $term->term_id;
                    }
                    $terms_id_unique = array_unique( $required_terms_id );
                }
            }
        }
    }
}
?>

Leave a comment

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

ut Sed justo quis accumsan risus. tempus elit. amet, et, Donec