Obține părintele de nivel superior al unui termen de taxonomie personalizat

3 aug. 2011, 15:30:06
Vizualizări: 76.3K
Voturi: 17

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?

0
Toate răspunsurile la întrebare 8
4
24

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;
}
5 aug. 2011 07:27:34
Comentarii

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.

Robert Andrews Robert Andrews
22 dec. 2018 02:14:31

@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 ).

supertrue supertrue
4 ian. 2019 23:12:25

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.

Robert Andrews Robert Andrews
4 ian. 2019 23:54:59

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.

supertrue supertrue
5 ian. 2019 06:14:35
2
24

Î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.

17 iun. 2013 05:19:11
Comentarii

Acesta este răspunsul corect, după părerea mea.

numediaweb numediaweb
5 iul. 2015 13:14:00

Acesta este cel mai bun răspuns.

Mark Mark
23 iul. 2015 00:28:06
11

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;
    }
}
3 aug. 2011 15:43:31
Comentarii

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

supertrue supertrue
3 aug. 2011 16:19:26

trebuie să adaug $taxonomy ca al doilea parametru în $top_parent?

supertrue supertrue
3 aug. 2011 16:20:51

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

supertrue supertrue
3 aug. 2011 16:33:21

da, faci asta. am actualizat răspunsul.

Bainternet Bainternet
3 aug. 2011 16:33:45

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

supertrue supertrue
3 aug. 2011 19:27:11

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

Bainternet Bainternet
3 aug. 2011 20:36:03

Î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

supertrue supertrue
3 aug. 2011 20:59:52

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

Bainternet Bainternet
3 aug. 2011 21:33:19

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

supertrue supertrue
3 aug. 2011 21:37:38

@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.

supertrue supertrue
3 aug. 2011 22:37:47

Nu, o folosești într-o funcție apelată de buclă, funcționează?

Bainternet Bainternet
3 aug. 2011 23:54:10
Arată celelalte 6 comentarii
1
/**
 * Obține termenul de nivel superior
 */
function get_top_level_term($term,$taxonomy){
    if($term->parent==0) return $term;
    $parent = get_term( $term->parent,$taxonomy);
    return get_top_level_term( $parent , $taxonomy );
}
18 oct. 2013 07:14:54
Comentarii

Te rog să adaugi o explicație împreună cu codul tău.

s_ha_dum s_ha_dum
18 oct. 2013 07:43:10
0

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.

30 oct. 2014 19:38:35
0

Cea mai ușoară metodă:

$rootId = end( get_ancestors( $term_id, 'my_taxonomy' ) );
$root = get_term( $rootId, 'my_taxonomy' );
echo $root->name;
29 ian. 2016 12:24:18
0

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

codex.wordpress.org

11 dec. 2015 12:49:16
1

Î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;
}
1 sept. 2021 13:19:53
Comentarii

Te rog să [editezi] răspunsul tău și să adaugi o explicație: de ce ar putea rezolva această soluție problema?

fuxia fuxia
1 sept. 2021 15:25:06