Ottenere solo i termini genitore da wp_get_post_terms

23 mar 2013, 22:01:00
Visualizzazioni: 17.7K
Voti: 2

Ho un custom post type con tassonomie gerarchiche configurate. Ad esempio, il mio post type "progetto" ha queste categorie:

 A
   A.1
 B
 C

Sto cercando di visualizzare le tassonomie come classi sugli elementi <li> per ogni post, ma voglio mostrare solo i livelli superiori (genitori). Per il post che sto analizzando, è categorizzato come A.1 e C, ma vorrei ottenere A e C.

Sto usando 'parent' => 0 negli argomenti, ma mi restituisce A.1 e C. Ho anche provato con 'hide_empty' => 0 ma non sembra aiutare.

Ecco il mio codice:

 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
Tutte le risposte alla domanda 3
1

wp_get_post_terms non accetta i parametri 'parent' o 'hide_empty' nell'array degli argomenti, solo 'orderby', 'order' e 'fields' ma sei sulla strada giusta, basta aggiungere un controllo condizionale prima di visualizzare lo 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) //controlla solo i termini genitore
            echo " " . $_term->slug;
     }
 }
24 mar 2013 13:36:44
Commenti

Grazie, avevo confuso gli argomenti con un'altra funzione. Ora, l'unico problema è che la categoria genitore non viene applicata alla figlia. Ad esempio, la categoria A dovrebbe essere applicata a un post per la categoria A.1. Prima di questo snippet la categoria A.1 veniva applicata, ma ora è semplicemente vuota.

javy javy
25 mar 2013 22:44:51
0

Ordina semplicemente per genitore...

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

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

Grazie all'aiuto di @Bainternet (qui, e anche al suo contributo che ha portato alla risposta in questa domanda), sono riuscito a mettere insieme il codice.

// determina il genitore più in alto nella gerarchia di un termine
function get_term_top_most_parent($term_id, $taxonomy){
    // parte dal termine corrente
    $parent  = get_term_by( 'id', $term_id, $taxonomy);
    // risale la gerarchia finché non trova un termine con parent = '0'
    while ($parent->parent != '0'){
        $term_id = $parent->parent;

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

// una volta ottenuta questa funzione puoi iterare sui risultati restituiti da wp_get_object_terms

function project_get_item_classes($taxonomy, $results = 1) {
    // ottiene i termini per il post corrente
    $terms = wp_get_object_terms( get_the_ID(), 'work_type' );
    // inizializza le variabili
    $top_parent_terms = array();
    foreach ( $terms as $term ) {
        // ottiene il genitore di livello più alto
        $top_parent = get_term_top_most_parent( $term->term_id, 'work_type' );
        // verifica se è già presente nell'array per aggiungerlo solo una volta
        if ( !in_array( $top_parent, $top_parent_terms ) ) {
            $top_parent_terms[] = $top_parent;
        }
    }
    // costruisce l'output (l'HTML dipende da te)

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