Cum să afișez termenii copii ai taxonomiei părinte a termenului curent?

7 mar. 2017, 14:59:01
Vizualizări: 14.6K
Voturi: 3

Doresc să afișez o listă de termeni copii în funcție de taxonomia mea curentă.

Numele taxonomiei ='course'

  • Photoshop(=termen copil)

    • ps-thematic#1(= termen copil al copilului)
    • ps-thematic#2
    • ...
  • After Effects

    • ae-thematic#1

    • ae-thematic#2

    • ...

  • Another course

    • zz-thematic#1

Deci, în fișierul meu taxonomy-course-photoshop.php, aș dori să afișez ps-thematic#1, ps-thematic#2, etc.
Am găsit o mulțime de întrebări și răspunsuri pe acest subiect.
Am încercat multe dintre ele.
Fără succes...
Acum mă simt foarte confuz între get_terms, get_children_term. Sau $args= array('parent' => $this_term->term_id,...}

Ultima mea încercare a fost acest subiect, care pare perfect, dar primesc un mesaj de eroare: Catchable fatal error: Object of class WP_Error could not be converted to string in

Mulțumesc pentru orice ajutor.

0
Toate răspunsurile la întrebare 1
4

Cred că poți folosi pur și simplu get_terms() pentru asta. Acesta este doar un cod minimal, presupun că ai nevoie și de permalink-uri, descrierea termenului sau alte lucruri.

Totuși, am testat acest cod (acum testat cu taxonomia "course") și funcționează.

Încerc să comentez codul pe măsură ce avansăm:

// slug-ul taxonomiei curente
// Dacă dorești să obții automat taxonomia curentă, încearcă să folosești $wp_query->get_queried_object();
    $taxonomy = 'course';

// obținem termenii taxonomiei 'course', dar doar termenii de nivel superior (parent => 0)
$top_level_terms = get_terms( array(
    'taxonomy'      => $taxonomy,
    'parent'        => '0',
    'hide_empty'    => false,
) );

// continuăm doar dacă există termeni
if ($top_level_terms) {

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

    foreach ($top_level_terms as $top_level_term) {

        // ID-ul termenului de nivel superior, îl vom folosi mai jos
        $top_term_id = $top_level_term->term_id;
        // numele termenului de nivel superior
        $top_term_name = $top_level_term->name;
        // taxonomia folosită curent
        $top_term_tax = $top_level_term->taxonomy;

        // observă că </li> este setat mai jos, pentru a putea adăuga corect un sub-element de listă
        echo '<li class="top-level-term"><strong>'.$top_term_name.'</strong>';

        // aici obținem termenii copil-ai-copilului
        // pentru asta folosim 'child_of' => $top_term_id
        // De asemenea, am setat 'parent' => $top_term_id aici, cu această linie vei vedea doar acest nivel și nu și copiii mai departe
        $second_level_terms = get_terms( array(
            'taxonomy' => $top_term_tax, // poți folosi și $taxonomy definit la început
            'child_of' => $top_term_id,
            'parent' => $top_term_id, // dezactivează această linie pentru a vedea mai multe elemente copil (termeni copil-ai-copilului)
            'hide_empty' => false,
        ) );

        // începem un al doilea element de listă dacă avem termeni de nivel secundar
        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

Încearcă și folosirea print_r($top_level_term); de exemplu în primul loop foreach. Cu asta, poți vedea toate informațiile care vin cu un singur termen.

Aș spune că ar trebui să folosești acest cod în template-ul normal al arhivei taxonomiei și să nu folosești fișierul taxonomy-course-photoshop.php. Pentru că atunci ai avea nevoie de un fișier template separat pentru fiecare termen, iar asta nu este practic.

Edit: De asemenea, asigură-te că ai câteva postări atribuite termenilor și sub-termenilor. Altfel, termenii nu vor fi afișați deloc!


Actualizare: Da, poți obține automat datele despre taxonomia și termenul curent.

Dacă lucrezi în interiorul fișierului taxonomy-course.php, poți încerca asta:

        // obține obiectul curent
        $current = $wp_query->get_queried_object();

        // încearcă  var_dump($current);  pentru a vedea toate datele disponibile!

        // returnează ID-ul termenului curent
        // ex. ID-ul termenului "Photoshop" este "26", deci obținem "26" dacă vizualizăm "Photoshop"
        $current_term_id = $current->term_id;

        // returnează numele frumos al termenului curent
        // ex. returnează "Photoshop"
        // sau "ps-thematic#1" dacă suntem pe un termen copil al "Photoshop"
        $current_name = $current->name;

        // returnează slug-ul taxonomiei curente în care ne aflăm
        // ex. va returna "course"
        $current_taxonomy = $current->taxonomy;

        // returnează ID-ul părintelui, dacă avem un părinte
        // ex. dacă vizualizăm "ps-thematic#1" va returna ID-ul lui "Photoshop", 26
        // dacă vizualizăm "Photoshop", va returna 0, pentru că "Photoshop" este un termen de nivel superior
        $current_parent = $current->parent;

        // afișează numele termenului curent, ex. "Photoshop"
        echo '<strong>'.$current_name.'</strong>';

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

        // începe doar dacă există sub-termeni
        if ($sub_terms) {

            // încearcă  var_dump($sub_terms);  pentru a vedea toate datele disponibile!

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

            foreach ($sub_terms as $sub_term) {

                // încearcă  var_dump($sub_term);  pentru a vedea toate datele disponibile!

                // afișează doar numele pentru exemplu, "ps-thematic#1"
                echo '<li>'.$sub_term->name.'</li>';

            }// END foreach

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

        }// END if

Deci, dacă vizualizăm "Photoshop", funcția de mai sus afișează DOAR:
Photoshop
- ps-thematic#1
- ps-thematic#2

Nu afișează "After Effects" sau copiii săi, ae-thematic#1 sau ae-thematic#2.

De asemenea, verifică folosind var_dump($current);. Vei vedea toate informațiile disponibile. După cum vei vedea mai sus, de exemplu, am lăsat niște cod în funcția $current_parent = $current->parent;.
De exemplu, poți verifica:

            // verifică dacă părintele curent nu este = 0
            if ($current_parent != '0') {
                // cod dacă părintele NU este 0
                // asta înseamnă întotdeauna că vizualizăm un copil
            } else {
                // cod dacă părintele este 0
                // dacă părintele este 0 suntem siguri că suntem la nivel superior
            }

Dar mai sunt și alte informații/date în $current pe care le poți folosi. Sper că te ajută.

8 mar. 2017 17:29:32
Comentarii

Mulțumesc, funcționează într-adevăr! Mulțumesc și mai mult pentru că răspunsul tău este atât de bine comentat, răbdător și pedagogic! Rămâne o problemă: termenii (părinți și copii) sunt afișați corect. Dar TOȚI termenii din taxonomia mea. Încerc să afișez doar termenii copii ai părintelui curent.

Cha Cha
9 mar. 2017 11:16:04

Adică:

$top_level_terms = termenul părinte curent (exemplu: Photoshop) (Eu sunt în taxonomy-course.php)

$second_level_terms = termenii copii ai părintelui meu (ex: thematic-photoshop01, thematic-photoshop01...)

Ai scris:

$top_level_terms = get_terms(array...) Este posibil să adaugi ceva pentru a obține termenul curent?

$top_level_terms = get_queried_object()->name;

Dar repet, îți mulțumesc mult pentru timpul pe care l-ai acordat deja.

Cha Cha
9 mar. 2017 11:27:29

@cha Tocmai am actualizat răspunsul meu, verifică dacă te ajută. Am recreat și structura ta de taxonomie/termeni și am folosit acum și fișierul șablon taxonomy-course.php. Doar pentru a fi sigur că funcționează în acest fișier.

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

Genial !!! Exact ce aveam nevoie !! Și mulțumesc mult (din nou) pentru calitatea explicațiilor tale.

Cha Cha
10 mar. 2017 12:47:47