Cómo mostrar términos hijos de la taxonomía padre del término actual
Me gustaría mostrar una lista de términos hijos según mi taxonomía actual.
Nombre de la taxonomía = 'course'
Photoshop(=término hijo)
- ps-thematic#1(= término nieto)
- ps-thematic#2
- ...
After Effects
ae-thematic#1
ae-thematic#2
...
Another course
- zz-thematic#1
- zz-thematic#1
Entonces, en mi archivo taxonomy-course-photoshop.php
, me gustaría mostrar ps-thematic#1, ps-thematic#2, etc.
Encontré muchas preguntas y respuestas sobre este tema.
Probé varias de ellas.
Sin éxito...
Ahora me siento muy confundido entre get_terms
, get_children_term
. O $args= array('parent' => $this_term->term_id,...}
Mi último intento fue este tema, que parecía perfecto, pero recibí un mensaje de error: Catchable fatal error: Object of class WP_Error could not be converted to string in
Gracias por cualquier ayuda.

Creo que puedes usar simplemente get_terms()
para esto. Este es solo un código mínimo, supongo que también querrás añadir enlaces permanentes, descripción de términos u otras cosas.
Sin embargo, acabo de probar este código (ahora probado con la taxonomía "curso") y funciona.
Haré mi mejor esfuerzo para comentar el código a medida que avanzamos:
// nuestro slug de taxonomía actual
// Si quieres obtener la taxonomía actual automáticamente, intenta usar $wp_query->get_queried_object();
$taxonomy = 'course';
// obtenemos los términos de la taxonomía 'course', pero solo términos de nivel superior con (parent => 0)
$top_level_terms = get_terms( array(
'taxonomy' => $taxonomy,
'parent' => '0',
'hide_empty' => false,
) );
// solo si existen algunos términos, continuamos
if ($top_level_terms) {
echo '<ul class="top-level-terms">';
foreach ($top_level_terms as $top_level_term) {
// el id del término de nivel superior, lo necesitaremos más adelante
$top_term_id = $top_level_term->term_id;
// el nombre del término de nivel superior
$top_term_name = $top_level_term->name;
// la taxonomía actual utilizada
$top_term_tax = $top_level_term->taxonomy;
// nota que el cierre </li> se establece más adelante, para que podamos añadir un sub elemento de lista correctamente
echo '<li class="top-level-term"><strong>'.$top_term_name.'</strong>';
// aquí obtenemos los términos hijo-hijo
// para esto estamos usando 'child_of' => $top_term_id
// También establecí 'parent' => $top_term_id aquí, con esta línea solo verás este nivel y no más hijos
$second_level_terms = get_terms( array(
'taxonomy' => $top_term_tax, // también podrías usar $taxonomy como se definió en las primeras líneas
'child_of' => $top_term_id,
'parent' => $top_term_id, // desactiva esta línea para ver más elementos hijo (términos hijo-hijo-hijo)
'hide_empty' => false,
) );
// comenzamos un segundo elemento de lista si tenemos términos de segundo nivel
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
También prueba usar print_r($top_level_term);
por ejemplo en el primer bucle foreach. Con eso, puedes ver toda la información que viene con un solo término.
Diría que deberías usar este código en la plantilla normal del archivo de taxonomía y no usar el archivo taxonomy-course-photoshop.php
. Porque entonces necesitarías un archivo de plantilla separado para cada término individual, y eso no es práctico.
Edición: También, asegúrate de tener algunas publicaciones asignadas a los términos individuales y sub-términos. De lo contrario, ¡los términos no se mostrarán en absoluto!
Actualización: Sí, puedes obtener la taxonomía actual y los datos del término automáticamente.
Si estás trabajando dentro de taxonomy-course.php
, entonces puedes probar esto:
// obtener el objeto actual
$current = $wp_query->get_queried_object();
// prueba var_dump($current); para ver todos los datos disponibles!
// devuelve el ID del término actual
// es decir, el ID del término "Photoshop" es "26", así que obtenemos "26" si estamos viendo "Photoshop"
$current_term_id = $current->term_id;
// devuelve el nombre legible del término actual
// es decir, devuelve "Photoshop"
// o "ps-thematic#1" si estamos en un término hijo de "Photoshop"
$current_name = $current->name;
// devuelve el slug de la taxonomía actual en la que estamos
// es decir, devolverá "course"
$current_taxonomy = $current->taxonomy;
// devuelve el ID del padre, si tenemos un padre
// es decir, si estamos viendo "ps-thematic#1" devolverá el ID de "Photoshop", 26
// si estamos viendo "Photoshop", devolverá 0, porque "Photoshop" es un término de nivel superior
$current_parent = $current->parent;
// mostrar el nombre del término actual, es decir, "Photoshop"
echo '<strong>'.$current_name.'</strong>';
$sub_terms = get_terms( array(
'taxonomy' => $current_taxonomy,
'child_of' => $current_term_id,
'hide_empty' => false,
) );
// solo comenzar si existen algunos sub términos
if ($sub_terms) {
// prueba var_dump($sub_terms); para ver todos los datos disponibles!
echo '<ul class="sub-terms">';
foreach ($sub_terms as $sub_term) {
// prueba var_dump($sub_term); para ver todos los datos disponibles!
// solo mostrar el nombre para el ejemplo, "ps-thematic#1"
echo '<li>'.$sub_term->name.'</li>';
}// END foreach
echo '</ul><!-- END .sub-terms -->';
}// END if
Entonces, si estamos viendo "Photoshop", la función anterior muestra SOLO:
Photoshop
- ps-thematic#1
- ps-thematic#2
NO muestra "After Effects" o los hijos, ae-thematic#1 o ae-thematic#2.
También echa un vistazo usando var_dump($current);
.
Verás toda la información disponible. Como verás arriba, por ejemplo, dejé algo de código en la función $current_parent = $current->parent;
.
Por ejemplo, podrías verificar:
// verificar si el padre actual no es = 0
if ($current_parent != '0') {
// código si el padre NO es 0
// eso siempre significa que estamos viendo un hijo
} else {
// código si el padre es 0
// si el padre es 0 estamos seguros de que estamos en un nivel superior
}
Pero hay más información/datos en $current
que quizás puedas usar.
Espero que esto ayude.

¡Gracias, funciona de verdad! Más agradecido aún porque tu respuesta está tan bien comentada, es paciente y pedagógica. Queda un problema: los términos (padres e hijos) se muestran correctamente. Pero se muestran TODOS los términos de mi taxonomía. Estoy intentando mostrar solo los términos hijos de mi término padre actual.

Me refiero a:
$top_level_terms = término padre actual (por ejemplo: Photoshop) (Estoy en taxonomy-course.php)
$second_level_terms = términos hijos de mi término padre (por ejemplo: temática-photoshop01, temática-photoshop01...)
Tú escribiste:
$top_level_terms = get_terms(array...) ¿Es posible añadir algo para obtener el término actual? $top_level_terms = get_queried_object()->name;
Pero de nuevo, te agradezco mucho el tiempo que ya has dedicado

@cha Acabo de actualizar mi respuesta, mira si te ayuda. También recreé tu estructura de taxonomía/términos y ahora también estaba usando el archivo de plantilla taxonomy-course.php
. Solo para asegurarme de que funcione en este archivo.
