Come visualizzare i termini figli della tassonomia genitore del termine corrente?

7 mar 2017, 14:59:01
Visualizzazioni: 14.6K
Voti: 3

Vorrei visualizzare un elenco di termini figli in base alla mia tassonomia corrente.

Nome della tassonomia ='course'

  • Photoshop(=termine figlio)

    • ps-thematic#1(= termine figlio del figlio)
    • ps-thematic#2
    • ...
  • After Effects

    • ae-thematic#1

    • ae-thematic#2

    • ...

  • Another course

    • zz-thematic#1

Quindi, nel mio file taxonomy-course-photoshop.php, vorrei visualizzare ps-thematic#1, ps-thematic#2, ecc.
Ho trovato molte domande e risposte su questo argomento.
Ne ho provate diverse.
Senza successo...
Ora sono molto confuso tra get_terms, get_children_term. O $args= array('parent' => $this_term->term_id,...}

Il mio ultimo tentativo è stato questo topic, che sembra perfetto, ma ottengo un messaggio di errore: Catchable fatal error: Object of class WP_Error could not be converted to string in

Grazie per qualsiasi aiuto.

0
Tutte le risposte alla domanda 1
4

Penso che tu possa semplicemente usare get_terms() per questo. Questo è solo del codice minimale, immagino che tu voglia aggiungere anche permalink, descrizioni dei termini o altre cose.

Comunque, ho testato questo codice (ora testato con la tassonomia "course") e funziona.

Cerco di commentare il codice il meglio possibile man mano che procediamo:

// il nostro slug della tassonomia corrente
// Se vuoi ottenere la tassonomia corrente automaticamente prova a usare $wp_query->get_queried_object();
    $taxonomy = 'course';

// otteniamo i termini della tassonomia 'course', ma solo i termini di livello superiore con (parent => 0)
$top_level_terms = get_terms( array(
    'taxonomy'      => $taxonomy,
    'parent'        => '0',
    'hide_empty'    => false,
) );

// solo se esistono effettivamente dei termini, procediamo
if ($top_level_terms) {

    echo '<ul class="top-level-terms">';

    foreach ($top_level_terms as $top_level_term) {

        // l'id del termine di livello superiore, ci servirà più avanti
        $top_term_id = $top_level_term->term_id;
        // il nome del termine di livello superiore
        $top_term_name = $top_level_term->name;
        // la tassonomia corrente utilizzata
        $top_term_tax = $top_level_term->taxonomy;

        // nota che il tag di chiusura </li> è impostato più avanti, così possiamo aggiungere correttamente un sottolivello
        echo '<li class="top-level-term"><strong>'.$top_term_name.'</strong>';

        // qui otteniamo i termini figli dei figli
        // per questo usiamo 'child_of' => $top_term_id
        // Ho anche impostato 'parent' => $top_term_id qui, con questa riga vedrai solo questo livello e nessun altro figlio ulteriore
        $second_level_terms = get_terms( array(
            'taxonomy' => $top_term_tax, // potresti anche usare $taxonomy come definito nelle prime righe
            'child_of' => $top_term_id,
            'parent' => $top_term_id, // disabilita questa riga per vedere più elementi figli (termini figli dei figli)
            'hide_empty' => false,
        ) );

        // inizia un secondo elemento di lista se abbiamo termini di secondo livello
        if ($second_level_terms) {

            echo '<ul class="second-level-terms">';

            foreach ($second_level_terms as $second_level_term) {

                $second_term_name = $second_level_term->name;

                echo '<li class="second-level-term">'.$second_term_name.'</li>';

            }// END foreach

            echo '</ul><!-- END .second-level-terms -->';

        }// END if

        echo '</li><!-- END .top-level-term -->';

    }// END foreach

    echo '</ul><!-- END .top-level-terms -->';

}// END if

Prova anche a usare print_r($top_level_term); per esempio nel primo ciclo foreach. Con questo, puoi vedere tutte le informazioni che arrivano con un singolo termine.

Direi che dovresti usare questo codice nel normale template dell'archivio tassonomico e non usare il file taxonomy-course-photoshop.php. Perché altrimenti avresti bisogno di un file template separato per ogni singolo termine, e questo non è pratico.

Modifica: Inoltre, assicurati di avere alcuni post assegnati ai singoli termini e sottotermini. Altrimenti, i termini non verranno visualizzati affatto!


Aggiornamento: Sì, puoi ottenere automaticamente i dati della tassonomia e del termine correnti.

Se stai lavorando all'interno di taxonomy-course.php allora puoi provare questo:

        // ottieni l'oggetto corrente
        $current = $wp_query->get_queried_object();

        // prova var_dump($current); per vedere tutti i dati disponibili!

        // restituisce l'ID del termine corrente
        // es. l'ID del termine "Photoshop" è "26", quindi otteniamo "26" se stiamo visualizzando "Photoshop"
        $current_term_id = $current->term_id;

        // restituisce il nome pulito del termine corrente
        // es. restituisce "Photoshop"
        // o "ps-thematic#1" se siamo su un termine figlio di "Photoshop"
        $current_name = $current->name;

        // restituisce lo slug della tassonomia corrente in cui ci troviamo
        // es. restituirà "course"
        $current_taxonomy = $current->taxonomy;

        // restituisce l'ID del genitore, se ne abbiamo uno
        // es. se stiamo visualizzando "ps-thematic#1" restituirà l'ID di "Photoshop", 26
        // se stiamo visualizzando "Photoshop", restituirà 0, perché "Photoshop" è un termine di livello superiore
        $current_parent = $current->parent;

        // mostra il nome del termine corrente, es. "Photoshop"
        echo '<strong>'.$current_name.'</strong>';

        $sub_terms = get_terms( array(
            'taxonomy'      => $current_taxonomy,
            'child_of'      => $current_term_id,
            'hide_empty'    => false,
        ) );

        // inizia solo se esistono dei sottotermini
        if ($sub_terms) {

            // prova var_dump($sub_terms); per vedere tutti i dati disponibili!

            echo '<ul class="sub-terms">';

            foreach ($sub_terms as $sub_term) {

                // prova var_dump($sub_term); per vedere tutti i dati disponibili!

                // mostra solo il nome per l'esempio, "ps-thematic#1"
                echo '<li>'.$sub_term->name.'</li>';

            }// END foreach

            echo '</ul><!-- END .sub-terms -->';

        }// END if

Quindi se stiamo visualizzando "Photoshop", la funzione sopra mostra SOLO:
Photoshop
- ps-thematic#1
- ps-thematic#2

Non mostra "After Effects" o i figli, ae-thematic#1 o ae-thematic#2.

Dai anche un'occhiata usando var_dump($current);. Vedrai tutte le informazioni disponibili. Come vedrai sopra, per esempio, ho lasciato del codice nella funzione $current_parent = $current->parent;.
Per esempio potresti verificare:

            // verifica se il genitore corrente non è = 0
            if ($current_parent != '0') {
                // codice se il genitore NON è 0
                // questo significa sempre che stiamo visualizzando un figlio
            } else {
                // codice se il genitore è 0
                // se il genitore è 0 siamo sicuri di essere su un livello superiore
            }

Ma ci sono altre informazioni/dati in $current che potresti usare. Spero che questo sia d'aiuto.

8 mar 2017 17:29:32
Commenti

Grazie, funziona davvero! Grazie ancora di più perché la tua risposta è così ben commentata, paziente e pedagogica! Rimane un problema: i termini (genitori e figli) sono visualizzati correttamente. Ma vengono visualizzati TUTTI i termini della mia tassonomia. Sto cercando di visualizzare solo i termini figlio del genitore corrente.

Cha Cha
9 mar 2017 11:16:04

Intendo:

$top_level_terms = termine genitore corrente (esempio: Photoshop) (Mi trovo in taxonomy-course.php)

$second_level_terms = termini figli del mio genitore (es: thematic-photoshop01, thematic-photoshop01...)

Hai scritto:

$top_level_terms = get_terms(array...) È possibile aggiungere qualcosa per ottenere il termine corrente?

$top_level_terms = get_queried_object()->name;

Ma ripeto, ti ringrazio moltissimo per il tempo che hai già dedicato

Cha Cha
9 mar 2017 11:27:29

@cha Ho appena aggiornato la mia risposta, vedi se questo aiuta. Ho anche ricreato la tua struttura di tassonomia/termini e ora stavo usando anche il file template taxonomy-course.php. Solo per essere sicuro che funzioni in questo file.

LWS-Mo LWS-Mo
10 mar 2017 11:57:27

Fantastico!!! È esattamente quello che mi serviva!! E grazie mille (di nuovo) per la qualità delle tue spiegazioni.

Cha Cha
10 mar 2017 12:47:47