Obține părintele de nivel superior al unui termen de taxonomie personalizat
Cum aș putea obține părintele de nivel superior al unui termen dat?
Folosesc wp_get_object_terms
pentru a obține termenii taxonomiei pentru articole, dar în loc să afișez toți termenii etichetați, vreau să afișez doar părinții de nivel superior ai termenilor etichetați.
Deci dacă acestea sunt termenii mei selectați, vreau să afișez doar Mic dejun, Prânz și Cină.
x MIC DEJUN
x Cereale
x Ouă
PRÂNZ
Hamburger
x Pizza
CINĂ
Pește
Biban
x Somon
Păstrăv
Lasagna
Cum pot face acest lucru?

Mulțumim lui Ivaylo pentru acest cod, care a fost bazat pe răspunsul lui Bainternet.
Prima funcție de mai jos, get_term_top_most_parent
, acceptă un termen și o taxonomie și returnează părintele de nivel superior al termenului (sau termenul însuși, dacă acesta nu are părinți); a doua funcție (get_top_parents
) funcționează în buclă și, dată fiind o taxonomie, returnează o listă HTML cu părinții de nivel superior ai termenilor unui post.
// Determină părintele de nivel superior al unui termen
function get_term_top_most_parent( $term, $taxonomy ) {
// Începe de la termenul curent
$parent = get_term( $term, $taxonomy );
// Urca î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( $term_id, $taxonomy);
}
return $parent;
}
Odată ce ai funcția de mai sus, poți parcurge rezultatele returnate de wp_get_object_terms
și afișa părintele superior al fiecărui termen:
function get_top_parents( $taxonomy ) {
// obține termenii pentru postul curent
$terms = wp_get_object_terms( get_the_ID(), $taxonomy );
$top_parent_terms = array();
foreach ( $terms as $term ) {
// obține părintele de nivel superior
$top_parent = get_term_top_most_parent( $term, $taxonomy );
// 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)
$output = '<ul>';
foreach ( $top_parent_terms as $term ) {
// Adaugă fiecare termen
$output .= '<li><a href="'. get_term_link( $term ) . '">' . $term->name . '</a></li>';
}
$output .= '</ul>';
return $output;
}

Mi-ar plăcea să văd o modificare care nu ar afișa doar termenii de nivel superior, ci toți termenii aflați sub părintele cel mai înalt, ierarhic.

@RobertAndrews Dacă ai nevoie doar de copiii unui singur termen, poți folosi funcția încorporată din WordPress get_term_children( $term, $taxonomy )
(documentație).
Dacă dorești să obții toți copiii părintelui de nivel superior al unui termen dat, poți transmite rezultatul de mai sus în el, astfel: get_term_children( get_term_top_most_parent( $term, $taxonomy ), $taxonomy )
.

Ce este $term în acest caz, adică obiectul, numele termenului sau taxonomyname_number prefixat? În toate cazurile, această metodă este extrem de lentă la încărcare. Am așteptat încărcarea paginii de câteva minute acum.

Cum a fost scris inițial, se aștepta un ID, dar am editat răspunsul pentru a permite un ID de termen sau un obiect WP_Term.
Nu ești singurul care raportează o problemă cu acest cod - ideal ar trebui rescris pentru a utiliza funcția încorporată a WP get_ancestors
, care era nouă și nu era bine documentată când a fost scris răspunsul. Voi posta un nou răspuns când voi avea timp să testez.

Începând cu versiunea 3.1.0, funcția get_ancestors()
este disponibilă. Aceasta returnează un array de ascendenți, de la cel mai mic la cel mai mare în ierarhie.

Iată o funcție simplă care va returna termenul părinte cel mai de sus pentru orice termen dat:
function get_term_top_most_parent( $term_id, $taxonomy ) {
$parent = get_term_by( 'id', $term_id, $taxonomy );
while ( $parent->parent != 0 ){
$parent = get_term_by( 'id', $parent->parent, $taxonomy );
}
return $parent;
}
Odată ce ai această funcție, poți parcurge rezultatele returnate de wp_get_object_terms
:
$terms = wp_get_object_terms( $post->ID, 'taxonomy' );
$top_parent_terms = array();
foreach ( $terms as $term ) {
//Obține părintele de nivel superior
$top_parent = get_term_top_most_parent( $term->ID, 'taxomony' );
//Verifică dacă îl ai deja în array pentru a-l adăuga o singură dată
if ( !in_array( $top_parent->ID, $top_parent_terms ) ) {
$top_parent_terms[] = $top_parent;
}
}

Mulțumesc! Încerc acum. FYI cred că lipseste o paranteză închisă în linia 1 a funcției.

Am adăugat parametrul $taxonomy dar primesc o eroare când folosesc acest cod, aici: https://gist.github.com/1122631

Cu asta rezolvat, știi de ce codul de aici (http://gist.github.com/1122631) nu ar funcționa?

funcția ta pare stricată, buclele tale foreach se suprapun, încearcă asta: http://pastebin.com/u48dxzap și dacă tot primești o eroare, lipește tot codul tău și o să verific

Încă primesc aceeași eroare; dacă folosesc print_r($top_parent_terms), obțin un array gol, deci poate problema este de fapt cu prima funcție? Versiunea mea aici - http://pastebin.com/cMUxs9Nn

OK, cred că problema este cu get_the_ID
care funcționează în buclă, așa că încearcă asta: http://pastebin.com/u48dxzap

@Bainternet haide să continuăm această discuție în chat

@Bainternet- mesajul acela din chat a fost postat automat? Referitor la global $post și post->ID, folosesc asta în bucle WP_Query, deci get_the_ID ar trebui să funcționeze.

Am avut aceeași problemă și am rezolvat-o ușor. Uite cum:
Definește $taxonomy
. Poate fi slug-ul taxonomiei din care vrei să obții datele.
După ce ai făcut asta, poți face simplu asta:
<?php
$postterms = wp_get_post_terms($post->ID, $taxonomy); // obține termenii postului
$parentId = $postterms[0]->parent; // obține ID-ul termenului părinte
$parentObj = get_term_by('id', $parentId, $taxonomy); // obține obiectul părinte
?>
Acum ai ceva de genul:
object(stdClass)#98 (11) {
["term_id"]=>
int(3)
["name"]=>
string(8) "Esportes"
["slug"]=>
string(8) "esportes"
["term_group"]=>
int(0)
["term_taxonomy_id"]=>
int(3)
["taxonomy"]=>
string(17) "noticiaseditorias"
["description"]=>
string(0) ""
["parent"]=>
int(0)
["count"]=>
int(4)
["object_id"]=>
int(123)
["filter"]=>
string(3) "raw"
}
Și poți folosi $parentObj
pentru a obține slug, nume, id, orice. Doar folosind $parentObj->slug
sau $parentObj->name
ca exemplu.

Poate te ajută acest lucru: get_ancestors( $object_id, $object_type );

Încearcă asta!
function get_term_top_most_parent( $term_id, $taxonomy ) {
// Obține toți strămoșii termenului
$ancestors = get_ancestors( $term_id, $taxonomy );
// Verifică dacă există strămoși
if(!empty($ancestors)){
// Returnează ID-ul părintelui cel mai de sus (ultimul din array)
$parentID = end( $ancestors );
}else{
// Dacă nu există strămoși, returnează ID-ul termenului curent
$parentID = $term_id;
}
return $parentID;
}
