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?
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;
}
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.
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;
}
}
/**
* 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 );
}
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.
Manière la plus simple:
$rootId = end( get_ancestors( $term_id, 'my_taxonomy' ) );
$root = get_term( $rootId, 'my_taxonomy' );
echo $root->name;
Peut-être que cela aide: get_ancestors( $object_id, $object_type );