Cum să afișez termenii copii ai taxonomiei părinte a termenului curent?
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
- 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.

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

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.

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