Ottieni il genitore di livello superiore di un termine di tassonomia personalizzato


14

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

Sto usando wp_get_object_termsper ottenere termini di tassonomia sui post, ma invece di mostrare tutti i termini con tag, voglio solo mostrare i genitori di livello superiore dei termini con tag.

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

x BREAKFAST
   x Cereal
   x Eggs
  LUNCH
     Hamburger
   x Pizza
  DINNER
     Fish
        Bass
      x Salmon
        Trout
     Lasagna

Come posso fare questo?

Risposte:


22

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

La prima funzione di seguito, get_term_top_most_parentaccetta un termine e una tassonomia e restituisce il genitore di primo livello del termine (o il termine stesso, se è senza genitori); la seconda funzione ( get_top_parents) funziona nel ciclo e, data una tassonomia, restituisce un elenco HTML dei genitori di livello superiore dei termini di un post.

// Determine the top-most parent of a term
function get_term_top_most_parent( $term, $taxonomy ) {
    // Start from the current term
    $parent  = get_term( $term, $taxonomy );
    // Climb up the hierarchy until we reach a term with parent = '0'
    while ( $parent->parent != '0' ) {
        $term_id = $parent->parent;
        $parent  = get_term( $term_id, $taxonomy);
    }
    return $parent;
}

Una volta che hai la funzione sopra, puoi scorrere i risultati restituiti wp_get_object_termse visualizzare il genitore principale di ogni termine:

function get_top_parents( $taxonomy ) {
    // get terms for current post
    $terms = wp_get_object_terms( get_the_ID(), $taxonomy );
    $top_parent_terms = array();

    foreach ( $terms as $term ) {
        //get top level parent
        $top_parent = get_term_top_most_parent( $term, $taxonomy );
        //check if you have it in your array to only add it once
        if ( !in_array( $top_parent, $top_parent_terms ) ) {
            $top_parent_terms[] = $top_parent;
        }
    }

    // build output (the HTML is up to you)
    $output = '<ul>';
    foreach ( $top_parent_terms as $term ) {
          //Add every term
          $output .= '<li><a href="'. get_term_link( $term ) . '">' . $term->name . '</a></li>';
    }
    $output .= '</ul>';

    return $output;
}

Mi piacerebbe vedere una modifica che non si limiterebbe a stampare i termini di primo livello ma, piuttosto, tutti i termini sotto il genitore più in alto, gerarchicamente.
Robert Andrews,

@RobertAndrews Se hai solo bisogno dei figli di un solo termine, puoi usare il WordPress integrato get_term_children( $term, $taxonomy )( documentazione ). Se si voleva ottenere tutti i figli di genitori-alto livello di un dato termine, si potrebbe passare il risultato di cui sopra in esso, in questo modo: get_term_children( get_term_top_most_parent( $term, $taxonomy ), $taxonomy ).
supertratto

Qual è $ term in questo caso, ad es. l'oggetto, il nome del termine, il taxonomyname_number prefissato? In tutti i casi, questo metodo è estremamente lungo da caricare. Sto aspettando il caricamento della pagina da diversi minuti.
Robert Andrews,

1
Come originariamente scritto, mi aspettavo un ID, ma ho modificato la risposta per consentire un ID termine o un oggetto WP_Term. Non sei l'unico a segnalare un problema con questo codice, idealmente dovrebbe essere riscritto per usare la funzione integrata di WP get_ancestors, che era nuova e non ben documentata quando è stata scritta la risposta. Pubblicherò una nuova risposta quando avrò tempo di testare.
supertratto


8

Ecco una semplice funzione che ti porterà il primo termine più genitore di un determinato termine:

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 passare in rassegna i risultati restituiti da wp_get_object_terms:

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

    //Get top level parent
    $top_parent = get_term_top_most_parent( $term->ID, 'taxomony' );

    //Check if you have it in your array to only add it once
    if ( !in_array( $top_parent->ID, $top_parent_terms ) ) {
        $top_parent_terms[] = $top_parent;
    }
}

Grazie! Ci sto provando adesso. Cordiali saluti Penso che ti manchi un paren vicino nella riga 1 della funzione.
Vero

devo aggiungere $ tassonomia come secondo parametro in $ top_parent?
Supertrue

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

si lo fai. ho aggiornato la risposta.
Bainternet,

1
la tua funzione sembra rotta i tuoi loop foreach sono sovrapposti prova questo: pastebin.com/u48dxzap e se ricevi ancora un errore incolla tutto il tuo codice e controllerò
Bainternet

5
/**
 * Get top level term
 */
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 );
}

1
Aggiungi una spiegazione insieme al tuo codice.
s_ha_dum,

4

Ho avuto lo stesso problema e ho risolto facilmente. Controllalo:

Definire $taxonomy. Può essere la lumaca della tassonomia che si desidera ottenere i dati. Dopo averlo fatto, puoi semplicemente farlo:

<?php
    $postterms = wp_get_post_terms($post->ID, $taxonomy);   // get post terms
    $parentId = $postterms[0]->parent;                      // get parent term ID
    $parentObj = get_term_by('id', $parentId, $taxonomy);   // get parent object 
?>

Ora hai qualcosa del genere:

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 $parentObjper ottenere lumaca, nome, id, qualunque cosa. Solo usando $parentObj->slugo $parentObj->namecome esempio.


2

Il modo più semplice:

$rootId = end( get_ancestors( $term_id, 'my_taxonomy' ) );
$root = get_term( $rootId, 'my_taxonomy' );
echo $root->name;

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.