Obtenha o pai de nível superior de um termo de taxonomia customizado

11

Como obtenho o pai de nível superior de um determinado termo?

Estou usando wp_get_object_terms para obter termos de taxonomia nas postagens, mas, em vez de mostrar todos os termos marcados, só quero mostrar os pais de nível superior com os termos marcados.

Então, se esses são meus termos selecionados, só quero mostrar café da manhã, almoço e jantar.

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

Como posso fazer isso?

    
por supertrue 03.08.2011 / 14:30

7 respostas

19

Obrigado a Ivaylo por este código, que foi baseado na resposta da Bainternet.

A primeira função ( get_term_top_most_parent ) aceita um termo ID e taxonomia e retorna o pai de nível superior do termo (ou o termo em si, se não for pai); a segunda função ( get_top_parents ) funciona no loop e, dada uma taxonomia, retorna os ancestrais de nível superior dos termos de uma postagem.

// 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;

}
    
por supertrue 05.08.2011 / 06:27
18

Desde a versão 3.1.0, get_ancestors() está disponível. Ele retorna uma matriz de ancestrais do menor para o maior na hierarquia.

    
por markd 17.06.2013 / 04:19
8

Aqui está uma função simples que fará com que você receba o termo mais genérico de qualquer termo:

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;
}

Uma vez que você tenha esta função, você pode apenas fazer um loop pelos resultados retornados por 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;
    }
}
    
por 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 );
}
    
por Kiet 18.10.2013 / 06:14
4

Eu tive o mesmo problema e resolvi facilmente. Confira isso:

Defina $taxonomy . Pode ser o slug da taxonomia que você deseja obter os dados. Depois de fazer isso, você pode simplesmente fazer isso:

<?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 
?>

Agora você tem algo assim:

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"
}

E você pode usar $parentObj para obter slug, name, id, whatever. Apenas usando $parentObj->slug ou $parentObj->name como exemplo.

    
por user3328615 30.10.2014 / 18:38
1

maneira mais fácil:

$rootId = end( get_ancestors( $term_id, 'my_taxonomy' ) );
$root = get_term( $rootId, 'my_taxonomy' );
echo $root->name;
    
por Vincent Wasteels 29.01.2016 / 11:24
0

Talvez isso ajude: get_ancestors( $object_id, $object_type );

codex.wordpress.org

    
por Alois Kratochwill 11.12.2015 / 11:49