Obtenha somente os termos pai de wp_get_post_terms

2

Eu tenho um tipo de postagem personalizado que tem taxonomias hierárquicas configuradas. Por exemplo, meu tipo de postagem de "projeto" tem categorias de

 A
   A.1
 B
 C

Estou tentando obter as taxonomias exibidas como classes em <li> itens para cada postagem, mas quero apenas que os pais de nível superior sejam exibidos. Para o post que estou olhando, ele é categorizado como A.1 e C, mas eu gostaria de retornar A e C.

Estou usando 'parent' => 0 nos args, mas ele está me dando A.1 e C. Eu também tentei usar 'hide_empty' => 0 , mas isso não parece ajudar.

Aqui está o meu 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;
     }
 }
    
por javy 23.03.2013 / 21:01

3 respostas

2

Obrigado pela ajuda do @Bainternet (aqui, e também a sua entrada que levou ao responder a essa pergunta ), consegui juntar o 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;
    }
}
    
por javy 04.05.2013 / 17:44
7

wp_get_post_terms não aceita 'parent' ou 'hide_empty' parâmetros em sua matriz de argumentos, apenas 'orderby' , 'order' e 'fields' , mas você está no caminho certo, basta adicionar uma verificação condicional antes de ecoar a lesma:

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;
     }
 }
    
por Bainternet 24.03.2013 / 12:36
1

Basta encomendar pelo pai ...

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

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