Ottenere solo i termini genitore da wp_get_post_terms
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;
}
}
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;
}
}

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.

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;
}
}
