Cum să obții doar termenii părinți din wp_get_post_terms

23 mar. 2013, 22:01:00
Vizualizări: 17.7K
Voturi: 2

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;
     }
 }
0
Toate răspunsurile la întrebare 3
1

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;
     }
 }
24 mar. 2013 13:36:44
Comentarii

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 javy
25 mar. 2013 22:44:51
0

Simplu ordonează după părinte...

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

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

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;
    }
}
4 mai 2013 18:44:27