Obtenga el padre de nivel superior de un término de taxonomía personalizada

11

¿Cómo obtendría el padre de nivel superior de un término determinado?

Estoy usando wp_get_object_terms para obtener términos de taxonomía en las publicaciones, pero en lugar de mostrar todos los términos etiquetados, solo quiero mostrar los padres de nivel superior de los términos etiquetados.

Entonces, si estos son mis términos seleccionados, solo quiero mostrar el desayuno, el almuerzo y la cena.

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

¿Cómo puedo hacer esto?

    
pregunta supertrue 03.08.2011 - 14:30

7 respuestas

19

Gracias a Ivaylo por este código, que se basó en la respuesta de Bainternet.

La primera función ( get_term_top_most_parent ) acepta una ID de término y una taxonomía y devuelve el padre de nivel superior del término (o el término en sí, si no tiene padres); la segunda función ( get_top_parents ) funciona en el bucle y, dada una taxonomía, devuelve los ancestros de nivel superior de los términos de una publicación.

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

}
    
respondido por el supertrue 05.08.2011 - 06:27
18

Desde la versión 3.1.0, get_ancestors() está disponible. Devuelve una matriz de ancestros de menor a mayor en la jerarquía.

    
respondido por el markd 17.06.2013 - 04:19
8

Aquí hay una función simple que le dará el mejor término principal de cualquier término dado:

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

Una vez que tenga esta función, puede pasar los resultados obtenidos 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;
    }
}
    
respondido por el 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 );
}
    
respondido por el Kiet 18.10.2013 - 06:14
4

Tuve el mismo problema y lo resolví fácilmente. Mira esto:

Defina $taxonomy . Puede ser la bala de la taxonomía que desea obtener los datos. Después de hacer esto, simplemente puede hacer esto:

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

Ahora tienes algo como esto:

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

Y puedes usar $parentObj para obtener slug, name, id, lo que sea. Simplemente utilizando $parentObj->slug o $parentObj->name como ejemplo.

    
respondido por el user3328615 30.10.2014 - 18:38
1

La manera más fácil:

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

Quizás esto ayude: get_ancestors( $object_id, $object_type );

codex.wordpress.org

    
respondido por el Alois Kratochwill 11.12.2015 - 11:49

Lea otras preguntas en las etiquetas