Obtenga solo los términos principales de wp_get_post_terms

2

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

 A
   A.1
 B
 C

Estoy intentando que las taxonomías se muestren como clases en <li> items para cada publicación, pero solo quiero que se muestren los padres de nivel superior. Para la publicación que estoy viendo, está categorizada como A.1 y C, pero me gustaría devolver A y C.

Estoy usando 'parent' => 0 en los argumentos, sin embargo, me está dando 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;
     }
 }
    
pregunta javy 23.03.2013 - 21:01

3 respuestas

2

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

// 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 project_get_item_classes($taxonomy, $results = 1) {
    // get terms for current post
    $terms = wp_get_object_terms( get_the_ID(), 'work_type' );
    // set vars
    $top_parent_terms = array();
    foreach ( $terms as $term ) {
        //get top level parent
        $top_parent = get_term_top_most_parent( $term->term_id, 'work_type' );
        //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)

    foreach ( $top_parent_terms as $term ) {
        echo " " . $term->slug;
    }
}
    
respondido por el javy 04.05.2013 - 17:44
7

wp_get_post_terms no acepta los parámetros 'parent' o 'hide_empty' en su matriz de argumentos, solo 'orderby' , 'order' y 'fields' pero está en el camino correcto, simplemente agregue una verificación condicional antes de hacer eco de la babosa:

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) //check for parent terms only
            echo " " . $_term->slug;
     }
 }
    
respondido por el Bainternet 24.03.2013 - 12:36
1

Simplemente ordene por padre ...

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

$myparent = $terms[0];
    
respondido por el Jérome Obbiet 30.01.2016 - 11:09

Lea otras preguntas en las etiquetas