web-dev-qa-db-fra.com

Obtenir le parent de niveau supérieur d'un terme de taxonomie personnalisé

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

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

Donc, si ce sont mes termes choisis, je veux seulement 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 ceci?

13
supertrue

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

La première fonction ci-dessous, get_term_top_most_parent, accepte un 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, en fonction d'une taxonomie, renvoie une liste HTML des parents de premier niveau des termes d'une publication.

// Determine the top-most parent of a term
function get_term_top_most_parent( $term, $taxonomy ) {
    // Start from the current term
    $parent  = get_term( $term, $taxonomy );
    // Climb up the hierarchy until we reach a term with parent = '0'
    while ( $parent->parent != '0' ) {
        $term_id = $parent->parent;
        $parent  = get_term( $term_id, $taxonomy);
    }
    return $parent;
}

Une fois que vous avez la fonction ci-dessus, vous pouvez parcourir les résultats renvoyés par wp_get_object_terms et afficher le premier parent de chaque terme:

function get_top_parents( $taxonomy ) {
    // get terms for current post
    $terms = wp_get_object_terms( get_the_ID(), $taxonomy );
    $top_parent_terms = array();

    foreach ( $terms as $term ) {
        //get top level parent
        $top_parent = get_term_top_most_parent( $term, $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)
    $output = '<ul>';
    foreach ( $top_parent_terms as $term ) {
          //Add every term
          $output .= '<li><a href="'. get_term_link( $term ) . '">' . $term->name . '</a></li>';
    }
    $output .= '</ul>';

    return $output;
}
21
supertrue

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.

19
markd

Voici une fonction simple qui vous donnera 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;
    }
}
8
Bainternet
/**
 * 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 );
}
5
Kiet

J'ai eu le même problème et j'ai résolu facilement. Regarde ça:

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 slug, name, id, etc. En utilisant simplement $parentObj->slug ou $parentObj->name comme exemple.

4
user3328615

Manière la plus simple:

$rootId = end( get_ancestors( $term_id, 'my_taxonomy' ) );
$root = get_term( $rootId, 'my_taxonomy' );
echo $root->name;
2
Vincent Wasteels

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

codex.wordpress.org

0
Alois Kratochwill