web-dev-qa-db-fra.com

Obtenir uniquement les termes parents de wp_get_post_terms

J'ai un type de message personnalisé qui a des taxonomies hiérarchiques configurées. Par exemple, mon type de message de "projet" a des catégories de

 A
   A.1
 B
 C

J'essaie d'obtenir les taxonomies affichées sous forme de classes sur les éléments <li> pour chaque publication, mais je veux simplement que les parents de premier niveau soient affichés. Pour le poste que je regarde, il est classé dans les catégories A.1 et C, mais je voudrais retourner A et C.

J'utilise 'parent' => 0 dans les arguments, mais cela me donne les alinéas A.1 et C. J'ai aussi essayé d'utiliser 'hide_empty' => 0 mais cela ne semble pas aider.

Voici mon code:

 function project_get_item_classes($post_id = null) {
     if ($post_id === null)
         return;
     $_terms = wp_get_post_terms($post_id, 'construction_type', array( 'parent' => 0, 'hide_empty' => 0 ));
     foreach ($_terms as $_term) {
         echo " " . $_term->slug;
     }
 }
2
javy

Grâce à l'aide de @Bainternet (ici, ainsi que sa contribution qui a conduit à la réponse à cette question ), j'ai pu rassembler le code.

// determine the topmost parent of a term
function get_term_top_most_parent($term_id, $taxonomy){
    // start from the current term
    $parent  = get_term_by( 'id', $term_id, $taxonomy);
    // climb up the hierarchy until we reach a term with parent = '0'
    while ($parent->parent != '0'){
        $term_id = $parent->parent;

        $parent  = get_term_by( 'id', $term_id, $taxonomy);
    }
    return $parent;
}

// so once you have this function you can just loop over the results returned by wp_get_object_terms

function project_get_item_classes($taxonomy, $results = 1) {
    // get terms for current post
    $terms = wp_get_object_terms( get_the_ID(), 'work_type' );
    // set vars
    $top_parent_terms = array();
    foreach ( $terms as $term ) {
        //get top level parent
        $top_parent = get_term_top_most_parent( $term->term_id, 'work_type' );
        //check if you have it in your array to only add it once
        if ( !in_array( $top_parent, $top_parent_terms ) ) {
            $top_parent_terms[] = $top_parent;
        }
    }
    // build output (the HTML is up to you)

    foreach ( $top_parent_terms as $term ) {
        echo " " . $term->slug;
    }
}
2
javy

wp_get_post_terms n'accepte pas les paramètres 'parent' ou 'hide_empty' dans son tableau d'arguments, uniquement 'orderby', 'order' et 'fields' mais vous êtes sur la bonne voie, ajoutez simplement une vérification conditionnelle avant d'exécuter le slug:

function project_get_item_classes($post_id = null) {
     if ($post_id === null)
         return;
     $_terms = wp_get_post_terms($post_id, 'construction_type');
     foreach ($_terms as $_term) {
        if ($_term->parent == 0) //check for parent terms only
            echo " " . $_term->slug;
     }
 }
7
Bainternet

Commandez simplement par les parents ...

$terms = wp_get_post_terms(  $ID , $tax, array( 'orderby' => 'parent', 'order' => 'ASC' ) );

$myparent = $terms[0];
1
Jérome Obbiet