Cum să obții doar termenii părinți din wp_get_post_terms
Am un tip de postare personalizată care are taxonomii ierarhice configurate. De exemplu, tipul meu de postare "proiect" are categoriile:
A
A.1
B
C
Încerc să afișez taxonomiile ca clase pe elementele <li>
pentru fiecare postare, dar vreau să fie afișați doar părinții de nivel superior. Pentru postarea pe care o analizez, este clasificată ca A.1 și C, dar aș dori să returnez A și C.
Folosesc 'parent' => 0
în argumente, dar îmi returnează A.1 și C. Am încercat și cu 'hide_empty' => 0
, dar nu pare să ajute.
Iată codul meu:
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
nu acceptă parametrii 'parent'
sau 'hide_empty'
în array-ul de argumente, doar 'orderby'
, 'order'
și 'fields'
, dar ești pe drumul bun. Pur și simplu adaugă o verificare condițională înainte să afișezi slug-ul:
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) //verifică doar termenii părinte
echo " " . $_term->slug;
}
}

Mulțumesc, am confundat argumentele cu o altă funcție. Acum, singura problemă este că categoria părinte nu se aplică copilului. Adică, categoria A ar trebui să fie aplicată unui post pentru categoria A.1. Înainte de acest fragment de cod, categoria A.1 era aplicată, dar acum nu se aplică nimic.

Mulțumesc pentru ajutorul oferit de @Bainternet (aici, precum și contribuția sa care a condus la răspunsul din această întrebare), am reușit să adun codul.
// determină părintele cel mai de sus al unui termen
function get_term_top_most_parent($term_id, $taxonomy){
// începe de la termenul curent
$parent = get_term_by( 'id', $term_id, $taxonomy);
// urcă în ierarhie până când ajungem la un termen cu părinte = '0'
while ($parent->parent != '0'){
$term_id = $parent->parent;
$parent = get_term_by( 'id', $term_id, $taxonomy);
}
return $parent;
}
// odată ce ai această funcție, poți parcurge rezultatele returnate de wp_get_object_terms
function project_get_item_classes($taxonomy, $results = 1) {
// obține termenii pentru postul curent
$terms = wp_get_object_terms( get_the_ID(), 'work_type' );
// setează variabile
$top_parent_terms = array();
foreach ( $terms as $term ) {
// obține părintele de nivel superior
$top_parent = get_term_top_most_parent( $term->term_id, 'work_type' );
// verifică dacă îl ai deja în array pentru a-l adăuga o singură dată
if ( !in_array( $top_parent, $top_parent_terms ) ) {
$top_parent_terms[] = $top_parent;
}
}
// construiește output-ul (HTML-ul depinde de tine)
foreach ( $top_parent_terms as $term ) {
echo " " . $term->slug;
}
}
