Récupère le parent de niveau supérieur d'un terme de taxonomie personnalisé

11

Comment pourrais-je obtenir le parent de niveau supérieur d'un terme donné?

J'utilise wp_get_object_terms pour obtenir des termes de taxonomie dans les publications, mais au lieu d'afficher tous les termes marqués, je souhaite uniquement afficher les parents de niveau supérieur des termes marqués.

Donc, si ce sont les termes que je choisis, je veux uniquement montrer le petit-déjeuner, le déjeuner et le dîner.

x BREAKFAST
   x Cereal
   x Eggs
  LUNCH
     Hamburger
   x Pizza
  DINNER
     Fish
        Bass
      x Salmon
        Trout
     Lasagna

Comment puis-je faire cela?

    
posée supertrue 03.08.2011 - 14:30

7 réponses

19

Merci à Ivaylo pour ce code, basé sur la réponse de Bainternet.

La première fonction ( get_term_top_most_parent ) accepte un identificateur de terme et une taxonomie et renvoie le parent de niveau supérieur du terme (ou le terme lui-même, s'il est sans parent); la deuxième fonction ( get_top_parents ) fonctionne dans la boucle et, avec une taxonomie, renvoie les ancêtres de niveau supérieur des termes d'une publication.

// 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 get_top_parents( $taxonomy ) {
    // get terms for current post
    $terms = wp_get_object_terms( get_the_ID(), $taxonomy );
    // set vars
    $top_parent_terms = array();
    foreach ( $terms as $term ) {
        //get top level parent
        $top_parent = get_term_top_most_parent( $term->term_id, $taxonomy );
        //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)

    $r = '<ul>';
    foreach ( $top_parent_terms as $term ) {
          //Add every term
          $r .= '<li><a href="'. get_term_link( $term->slug, $taxonomy ) . '">' . $term->name . '</a></li>';
    }
          $r .= '</ul>';

    // return the results
    return $r;

}
    
réponse donnée supertrue 05.08.2011 - 06:27
18

Depuis la version 3.1.0, get_ancestors() est disponible. Il retourne un tableau d'ancêtres du plus bas au plus haut dans la hiérarchie.

    
réponse donnée markd 17.06.2013 - 04:19
8

Voici une fonction simple qui vous permettra d'obtenir le terme le plus élevé de tous les termes:

function get_term_top_most_parent( $term_id, $taxonomy ) {
    $parent  = get_term_by( 'id', $term_id, $taxonomy );
    while ( $parent->parent != 0 ){
        $parent  = get_term_by( 'id', $parent->parent, $taxonomy );
    }
    return $parent;
}

Une fois que vous avez cette fonction, vous pouvez simplement parcourir les résultats renvoyés par wp_get_object_terms :

$terms =  wp_get_object_terms( $post->ID, 'taxonomy' );
$top_parent_terms = array();
foreach ( $terms as $term ) {

    //Get top level parent
    $top_parent = get_term_top_most_parent( $term->ID, 'taxomony' );

    //Check if you have it in your array to only add it once
    if ( !in_array( $top_parent->ID, $top_parent_terms ) ) {
        $top_parent_terms[] = $top_parent;
    }
}
    
réponse donnée Bainternet 03.08.2011 - 14:43
5
/**
 * Get top level term
 */
function get_top_level_term($term,$taxonomy){
    if($term->parent==0) return $term;
    $parent = get_term( $term->parent,$taxonomy);
    return get_top_level_term( $parent , $taxonomy );
}
    
réponse donnée Kiet 18.10.2013 - 06:14
4

J'ai eu le même problème et j'ai résolu facilement. Découvrez ceci:

Définissez $taxonomy . Ce peut être le slug de la taxonomie que vous voulez obtenir les données. Après cela, vous pouvez simplement faire ceci:

<?php
    $postterms = wp_get_post_terms($post->ID, $taxonomy);   // get post terms
    $parentId = $postterms[0]->parent;                      // get parent term ID
    $parentObj = get_term_by('id', $parentId, $taxonomy);   // get parent object 
?>

Maintenant, vous avez quelque chose comme ça:

object(stdClass)#98 (11) {
  ["term_id"]=>
  int(3)
  ["name"]=>
  string(8) "Esportes"
  ["slug"]=>
  string(8) "esportes"
  ["term_group"]=>
  int(0)
  ["term_taxonomy_id"]=>
  int(3)
  ["taxonomy"]=>
  string(17) "noticiaseditorias"
  ["description"]=>
  string(0) ""
  ["parent"]=>
  int(0)
  ["count"]=>
  int(4)
  ["object_id"]=>
  int(123)
  ["filter"]=>
  string(3) "raw"
}

Et vous pouvez utiliser $parentObj pour obtenir un slug, un nom, un identifiant, peu importe. En utilisant simplement $parentObj->slug ou $parentObj->name .

    
réponse donnée user3328615 30.10.2014 - 18:38
1

Manière la plus simple:

$rootId = end( get_ancestors( $term_id, 'my_taxonomy' ) );
$root = get_term( $rootId, 'my_taxonomy' );
echo $root->name;
    
réponse donnée Vincent Wasteels 29.01.2016 - 11:24
0

Peut-être que cela aide: get_ancestors( $object_id, $object_type );

codex.wordpress.org

    
réponse donnée Alois Kratochwill 11.12.2015 - 11:49

Lire d'autres questions sur les étiquettes