Obtener solo términos padres desde wp_get_post_terms

23 mar 2013, 22:01:00
Vistas: 17.7K
Votos: 2

Tengo un tipo de contenido personalizado que tiene taxonomías jerárquicas configuradas. Por ejemplo, mi tipo de contenido "proyecto" tiene categorías de:

 A
   A.1
 B
 C

Estoy intentando mostrar las taxonomías como clases en elementos <li> para cada publicación, pero solo quiero que se muestren los niveles superiores (padres). Para la publicación que estoy viendo, está categorizada como A.1 y C, pero me gustaría que devolviera A y C.

Estoy usando 'parent' => 0 en los argumentos, sin embargo me está devolviendo A.1 y C. También he intentado usar 'hide_empty' => 0 pero eso no parece ayudar.

Aquí está mi código:

 function project_get_item_classes($post_id = null) {
     if ($post_id === null)
         return;
     $_terms = wp_get_post_terms($post_id, 'construction_type', array( 'parent' => 0, 'hide_empty' => 0 ));
     foreach ($_terms as $_term) {
         echo " " . $_term->slug;
     }
 }
0
Todas las respuestas a la pregunta 3
1

wp_get_post_terms no acepta los parámetros 'parent' o 'hide_empty' en su array de argumentos, solo 'orderby', 'order' y 'fields', pero vas por buen camino. Simplemente añade una verificación condicional antes de mostrar el slug:

function project_get_item_classes($post_id = null) {
     if ($post_id === null)
         return;
     $_terms = wp_get_post_terms($post_id, 'construction_type');
     foreach ($_terms as $_term) {
        if ($_term->parent == 0) //verificar solo términos padre
            echo " " . $_term->slug;
     }
 }
24 mar 2013 13:36:44
Comentarios

Gracias, tenía los argumentos confundidos con otra función. Ahora, el único problema es que la categoría padre no se está aplicando a la hija. Es decir, la categoría A debería aplicarse a una publicación para la categoría A.1. Antes de este fragmento, la categoría A.1 se aplicaba, pero ahora simplemente está en blanco.

javy javy
25 mar 2013 22:44:51
0

Simplemente ordenar por padre...

$terms = wp_get_post_terms(  $ID , $tax, array( 'orderby' => 'parent', 'order' => 'ASC' ) );

$myparent = $terms[0];
30 ene 2016 12:09:30
0

Gracias a la ayuda de @Bainternet (aquí, y también su aporte que condujo a la respuesta en esta pregunta), pude armar el código.

// determinar el padre superior de un término
function get_term_top_most_parent($term_id, $taxonomy){
    // comenzar desde el término actual
    $parent  = get_term_by( 'id', $term_id, $taxonomy);
    // ascender en la jerarquía hasta llegar a un término con padre = '0'
    while ($parent->parent != '0'){
        $term_id = $parent->parent;

        $parent  = get_term_by( 'id', $term_id, $taxonomy);
    }
    return $parent;
}

// una vez que tienes esta función, puedes iterar sobre los resultados devueltos por wp_get_object_terms

function project_get_item_classes($taxonomy, $results = 1) {
    // obtener términos para el post actual
    $terms = wp_get_object_terms( get_the_ID(), 'work_type' );
    // establecer variables
    $top_parent_terms = array();
    foreach ( $terms as $term ) {
        // obtener el padre superior
        $top_parent = get_term_top_most_parent( $term->term_id, 'work_type' );
        // verificar si ya está en el array para agregarlo solo una vez
        if ( !in_array( $top_parent, $top_parent_terms ) ) {
            $top_parent_terms[] = $top_parent;
        }
    }
    // construir la salida (el HTML depende de ti)

    foreach ( $top_parent_terms as $term ) {
        echo " " . $term->slug;
    }
}
4 may 2013 18:44:27