Obtener el término padre de nivel superior de una taxonomía personalizada

3 ago 2011, 15:30:06
Vistas: 76.3K
Votos: 17

¿Cómo podría obtener el término padre de nivel superior de un término dado?

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

Entonces, si estos son mis términos seleccionados, solo quiero mostrar Desayuno, Almuerzo y Cena.

x DESAYUNO
   x Cereal
   x Huevos
  ALMUERZO
     Hamburguesa
   x Pizza
  CENA
     Pescado
        Lubina
      x Salmón
        Trucha
     Lasaña

¿Cómo puedo hacer esto?

0
Todas las respuestas a la pregunta 8
4
24

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

La primera función a continuación, get_term_top_most_parent, acepta un término y una taxonomía y devuelve el padre de nivel superior del término (o el término mismo, si no tiene padre); la segunda función (get_top_parents) funciona dentro del loop y, dada una taxonomía, devuelve una lista HTML de los padres de nivel superior de los términos de una entrada.

// Determina el padre más superior de un término
function get_term_top_most_parent( $term, $taxonomy ) {
    // Comienza desde el término actual
    $parent  = get_term( $term, $taxonomy );
    // Asciende en la jerarquía hasta llegar a un término con padre = '0'
    while ( $parent->parent != '0' ) {
        $term_id = $parent->parent;
        $parent  = get_term( $term_id, $taxonomy);
    }
    return $parent;
}

Una vez que tienes la función anterior, puedes iterar sobre los resultados devueltos por wp_get_object_terms y mostrar el padre superior de cada término:

function get_top_parents( $taxonomy ) {
    // obtiene los términos para la entrada actual
    $terms = wp_get_object_terms( get_the_ID(), $taxonomy );
    $top_parent_terms = array();

    foreach ( $terms as $term ) {
        //obtiene el padre de nivel superior
        $top_parent = get_term_top_most_parent( $term, $taxonomy );
        //verifica si ya está en el array para agregarlo solo una vez
        if ( !in_array( $top_parent, $top_parent_terms ) ) {
            $top_parent_terms[] = $top_parent;
        }
    }

    // construye la salida (el HTML depende de ti)
    $output = '<ul>';
    foreach ( $top_parent_terms as $term ) {
          //Agrega cada término
          $output .= '<li><a href="'. get_term_link( $term ) . '">' . $term->name . '</a></li>';
    }
    $output .= '</ul>';

    return $output;
}
5 ago 2011 07:27:34
Comentarios

Me encantaría ver una modificación que no solo muestre los términos de nivel superior, sino todos los términos debajo del padre más alto, de forma jerárquica.

Robert Andrews Robert Andrews
22 dic 2018 02:14:31

@RobertAndrews Si solo necesitas los hijos de un único término, puedes usar la función incorporada de WordPress get_term_children( $term, $taxonomy ) (documentación).

Si quisieras obtener todos los hijos del padre de nivel superior de un término dado, podrías pasar el resultado anterior así: get_term_children( get_term_top_most_parent( $term, $taxonomy ), $taxonomy ).

supertrue supertrue
4 ene 2019 23:12:25

¿Qué es $term en este caso? ¿El objeto, el nombre del término, el taxonomyname_number con prefijo? En cualquier caso, este método tarda muchísimo en cargar. Llevo varios minutos esperando a que cargue la página.

Robert Andrews Robert Andrews
4 ene 2019 23:54:59

Como estaba escrito originalmente, esperaba un ID, pero edité la respuesta para permitir un ID de término o un objeto WP_Term.

No eres el único que reporta un problema con este código—idealmente debería reescribirse para usar la función incorporada de WP get_ancestors, que era nueva y no estaba bien documentada cuando se escribió la respuesta. Publicaré una nueva respuesta cuando haya tenido tiempo de probarlo.

supertrue supertrue
5 ene 2019 06:14:35
2
24

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

17 jun 2013 05:19:11
Comentarios

Esta es la respuesta correcta en mi opinión.

numediaweb numediaweb
5 jul 2015 13:14:00

Esta es la mejor respuesta.

Mark Mark
23 jul 2015 00:28:06
11

Aquí tienes una función simple que te dará el término padre superior 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 tienes esta función, puedes iterar sobre los resultados devueltos por wp_get_object_terms:

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

    //Obtener el padre de nivel superior
    $top_parent = get_term_top_most_parent( $term->ID, 'taxomony' );

    //Verificar si ya está en el array para agregarlo solo una vez
    if ( !in_array( $top_parent->ID, $top_parent_terms ) ) {
        $top_parent_terms[] = $top_parent;
    }
}
3 ago 2011 15:43:31
Comentarios

¡Gracias! Estoy probando esto ahora. Por cierto, creo que te falta un paréntesis de cierre en la línea 1 de la función.

supertrue supertrue
3 ago 2011 16:19:26

¿necesito agregar $taxonomy como segundo parámetro en $top_parent?

supertrue supertrue
3 ago 2011 16:20:51

Agregué el parámetro $taxonomy pero estoy recibiendo un error cuando uso este código, aquí: https://gist.github.com/1122631

supertrue supertrue
3 ago 2011 16:33:21

sí, lo haces. actualicé la respuesta.

Bainternet Bainternet
3 ago 2011 16:33:45

Con eso solucionado, ¿sabes por qué el código aquí (http://gist.github.com/1122631) no estaría funcionando?

supertrue supertrue
3 ago 2011 19:27:11

tu función parece rota, tus bucles foreach se están solapando, prueba esto: http://pastebin.com/u48dxzap y si aún obtienes un error, pega todo tu código y lo revisaré

Bainternet Bainternet
3 ago 2011 20:36:03

Sigue dando el mismo error; si hago print_r($top_parent_terms), obtengo un array vacío, así que tal vez el problema esté realmente en la primera función? Mi versión aquí - http://pastebin.com/cMUxs9Nn

supertrue supertrue
3 ago 2011 20:59:52

OK creo que el problema está con get_the_ID que funciona dentro del loop, así que prueba esto: http://pastebin.com/u48dxzap

Bainternet Bainternet
3 ago 2011 21:33:19

@Bainternet continuemos esta discusión en el chat

supertrue supertrue
3 ago 2011 21:37:38

@Bainternet-¿se publicó automáticamente ese mensaje de chat? Respecto a global $post y post->ID, estoy usando esto dentro de bucles WP_Query así que get_the_ID debería estar funcionando.

supertrue supertrue
3 ago 2011 22:37:47

No, lo estás usando en una función llamada por el bucle, ¿funciona?

Bainternet Bainternet
3 ago 2011 23:54:10
Mostrar los 6 comentarios restantes
1
/**
 * Obtener el término de nivel superior
 */
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 );
}
18 oct 2013 07:14:54
Comentarios

Por favor, agrega una explicación junto con tu código.

s_ha_dum s_ha_dum
18 oct 2013 07:43:10
0

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

Define $taxonomy. Puede ser el slug de la taxonomía de la que quieres obtener los datos. Después de hacer esto, simplemente puedes hacer:

<?php
    $postterms = wp_get_post_terms($post->ID, $taxonomy);   // obtiene los términos del post
    $parentId = $postterms[0]->parent;                      // obtiene el ID del término padre
    $parentObj = get_term_by('id', $parentId, $taxonomy);   // obtiene el objeto padre 
?>

Ahora tienes algo como esto:

object(stdClass)#98 (11) {
  ["term_id"]=>
  int(3)
  ["name"]=>
  string(8) "Deportes"
  ["slug"]=>
  string(8) "deportes"
  ["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 el slug, nombre, id, lo que sea. Solo usando $parentObj->slug o $parentObj->name como ejemplo.

30 oct 2014 19:38:35
0

La forma más fácil:

$rootId = end( get_ancestors( $term_id, 'my_taxonomy' ) );
$root = get_term( $rootId, 'my_taxonomy' );
echo $root->name;
29 ene 2016 12:24:18
0

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

codex.wordpress.org

11 dic 2015 12:49:16
1

¡Prueba esto!

function get_term_top_most_parent( $term_id, $taxonomy ) {
    // Obtener los ancestros del término
    $ancestors = get_ancestors( $term_id, $taxonomy );

    // Si hay ancestros, obtener el ID del padre más alto
    if(!empty($ancestors)){
        $parentID = end( $ancestors );
    }else{
        // Si no hay ancestros, usar el ID del término actual
        $parentID = $term_id;
    }
    return $parentID;
}
1 sept 2021 13:19:53
Comentarios

Por favor, [edita] tu respuesta y añade una explicación: ¿por qué podría eso resolver el problema?

fuxia fuxia
1 sept 2021 15:25:06