Ottenere il genitore di livello superiore di un termine di tassonomia personalizzata

3 ago 2011, 15:30:06
Visualizzazioni: 76.3K
Voti: 17

Come posso ottenere il genitore di livello superiore di un determinato termine?

Sto utilizzando wp_get_object_terms per ottenere i termini della tassonomia sui post, ma invece di mostrare tutti i termini assegnati, voglio mostrare solo i genitori di livello superiore dei termini assegnati.

Quindi se questi sono i miei termini selezionati, voglio mostrare solo Colazione, Pranzo e Cena.

x COLAZIONE
   x Cereali
   x Uova
  PRANZO
     Hamburger
   x Pizza
  CENA
     Pesce
        Spigola
      x Salmone
        Trota
     Lasagna

Come posso farlo?

0
Tutte le risposte alla domanda 8
4
24

Grazie a Ivaylo per questo codice, basato sulla risposta di Bainternet.

La prima funzione qui sotto, get_term_top_most_parent, accetta un termine e una tassonomia e restituisce il genitore di livello più alto del termine (o il termine stesso, se non ha genitori); la seconda funzione (get_top_parents) opera all'interno del loop e, data una tassonomia, restituisce una lista HTML dei genitori di livello più alto dei termini di un post.

// Determina il genitore di livello più alto di un termine
function get_term_top_most_parent( $term, $taxonomy ) {
    // Parte dal termine corrente
    $parent  = get_term( $term, $taxonomy );
    // Risale la gerarchia finché non raggiunge un termine con parent = '0'
    while ( $parent->parent != '0' ) {
        $term_id = $parent->parent;
        $parent  = get_term( $term_id, $taxonomy);
    }
    return $parent;
}

Una volta che hai la funzione precedente, puoi ciclare sui risultati restituiti da wp_get_object_terms e visualizzare il genitore di livello più alto di ogni termine:

function get_top_parents( $taxonomy ) {
    // ottieni i termini per il post corrente
    $terms = wp_get_object_terms( get_the_ID(), $taxonomy );
    $top_parent_terms = array();

    foreach ( $terms as $term ) {
        // ottieni il genitore di livello più alto
        $top_parent = get_term_top_most_parent( $term, $taxonomy );
        // controlla se è già presente nell'array per aggiungerlo solo una volta
        if ( !in_array( $top_parent, $top_parent_terms ) ) {
            $top_parent_terms[] = $top_parent;
        }
    }

    // costruisci l'output (l'HTML dipende da te)
    $output = '<ul>';
    foreach ( $top_parent_terms as $term ) {
          // Aggiungi ogni termine
          $output .= '<li><a href="'. get_term_link( $term ) . '">' . $term->name . '</a></li>';
    }
    $output .= '</ul>';

    return $output;
}
5 ago 2011 07:27:34
Commenti

Mi piacerebbe vedere una modifica che non si limitasse a stampare i termini di primo livello, ma piuttosto tutti i termini al di sotto del genitore più in alto, in modo gerarchico.

Robert Andrews Robert Andrews
22 dic 2018 02:14:31

@RobertAndrews Se hai bisogno solo dei figli di un singolo termine, puoi usare la funzione integrata di WordPress get_term_children( $term, $taxonomy ) (documentazione).

Se invece vuoi ottenere tutti i figli del genitore di livello più alto di un dato termine, potresti passare il risultato sopra in questo modo: get_term_children( get_term_top_most_parent( $term, $taxonomy ), $taxonomy ).

supertrue supertrue
4 gen 2019 23:12:25

Cos'è $term in questo caso, cioè l'oggetto, il nome del termine, il taxonomyname_number con prefisso? In ogni caso, questo metodo è estremamente lento da caricare. Ho atteso diversi minuti per il caricamento della pagina.

Robert Andrews Robert Andrews
4 gen 2019 23:54:59

Come scritto originariamente ci si aspettava un ID, ma ho modificato la risposta per consentire un ID del termine o un oggetto WP_Term.

Non sei l'unico a segnalare un problema con questo codice - idealmente dovrebbe essere riscritto usando la funzione integrata di WP get_ancestors, che era nuova e non ben documentata quando la risposta è stata scritta. Pubblicherò una nuova risposta quando avrò avuto tempo di testare.

supertrue supertrue
5 gen 2019 06:14:35
2
24

Dalla versione 3.1.0, è disponibile la funzione get_ancestors(). Restituisce un array di elementi antenati ordinati dal livello più basso al più alto nella gerarchia.

17 giu 2013 05:19:11
Commenti

Questa è la risposta corretta secondo me.

numediaweb numediaweb
5 lug 2015 13:14:00

Questa è la risposta migliore.

Mark Mark
23 lug 2015 00:28:06
11

Ecco una semplice funzione che ti permetterà di ottenere il termine genitore più in alto per qualsiasi termine specificato:

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

Una volta che hai questa funzione, puoi semplicemente iterare sui risultati restituiti da wp_get_object_terms:

$terms =  wp_get_object_terms( $post->ID, 'taxonomy' );
$top_parent_terms = array();
foreach ( $terms as $term ) {

    //Ottieni il genitore di livello più alto
    $top_parent = get_term_top_most_parent( $term->ID, 'taxomony' );

    //Controlla se è già presente nell'array per aggiungerlo solo una volta
    if ( !in_array( $top_parent->ID, $top_parent_terms ) ) {
        $top_parent_terms[] = $top_parent;
    }
}
3 ago 2011 15:43:31
Commenti

Grazie! Sto provando ora. FYI penso ti manchi una parentesi chiusa nella prima riga della funzione.

supertrue supertrue
3 ago 2011 16:19:26

devo aggiungere $taxonomy come secondo parametro in $top_parent?

supertrue supertrue
3 ago 2011 16:20:51

Ho aggiunto il parametro $taxonomy ma ottengo un errore quando uso questo codice, qui: https://gist.github.com/1122631

supertrue supertrue
3 ago 2011 16:33:21

sì, lo fai. ho aggiornato la risposta.

Bainternet Bainternet
3 ago 2011 16:33:45

Con quello sistemato, sai perché il codice qui (http://gist.github.com/1122631) non funzionerebbe?

supertrue supertrue
3 ago 2011 19:27:11

la tua funzione sembra rotta, i tuoi cicli foreach si sovrappongono prova questo: http://pastebin.com/u48dxzap e se ancora ottieni un errore incolla tutto il tuo codice e controllerò

Bainternet Bainternet
3 ago 2011 20:36:03

Continua a dare lo stesso errore; se faccio print_r($top_parent_terms), ottengo un array vuoto, quindi forse il problema è effettivamente con la prima funzione? La mia versione qui - http://pastebin.com/cMUxs9Nn

supertrue supertrue
3 ago 2011 20:59:52

OK penso che il problema sia con get_the_ID che funziona nel loop quindi prova questo: http://pastebin.com/u48dxzap

Bainternet Bainternet
3 ago 2011 21:33:19

@Bainternet facciamo continuare questa discussione nella chat

supertrue supertrue
3 ago 2011 21:37:38

@Bainternet-it quel messaggio nella chat è stato pubblicato automaticamente? Riguardo a global $post e post->ID, sto usando questo all'interno di loop WP_Query quindi get_the_ID dovrebbe funzionare.

supertrue supertrue
3 ago 2011 22:37:47

No, lo stai usando in una funzione chiamata dal loop, funziona?

Bainternet Bainternet
3 ago 2011 23:54:10
Mostra i restanti 6 commenti
1
/**
 * Ottiene il termine di livello superiore
 */
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 ott 2013 07:14:54
Commenti

Per favore aggiungi una spiegazione insieme al tuo codice.

s_ha_dum s_ha_dum
18 ott 2013 07:43:10
0

Ho avuto lo stesso problema e l'ho risolto facilmente. Guarda qui:

Definisci $taxonomy. Può essere lo slug della tassonomia di cui vuoi ottenere i dati. Dopo aver fatto questo, puoi semplicemente fare:

<?php
    $postterms = wp_get_post_terms($post->ID, $taxonomy);   // ottieni i termini del post
    $parentId = $postterms[0]->parent;                      // ottieni l'ID del termine genitore
    $parentObj = get_term_by('id', $parentId, $taxonomy);   // ottieni l'oggetto genitore
?>

Ora otterrai qualcosa come questo:

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"
}

E puoi usare $parentObj per ottenere lo slug, il nome, l'id, quello che vuoi. Basta usare $parentObj->slug o $parentObj->name come esempio.

30 ott 2014 19:38:35
0

Modo più semplice:

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

Forse questo può aiutare: get_ancestors( $object_id, $object_type );

codex.wordpress.org

11 dic 2015 12:49:16
1

Prova questo!

function get_term_top_most_parent( $term_id, $taxonomy ) {
    $ancestors = get_ancestors( $term_id, $taxonomy );

    if(!empty($ancestors)){
        $parentID = end( $ancestors );
    }else{
        $parentID = $term_id;
    }
    return $parentID;
}
1 set 2021 13:19:53
Commenti

Per favore [modifica] la tua risposta e aggiungi una spiegazione: perché potrebbe risolvere il problema?

fuxia fuxia
1 set 2021 15:25:06