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