Obtener términos de taxonomía padre e hijo en WordPress
Tengo una función configurada que imprime el nombre y slug de cada término de la taxonomía products-category
. Funciona bien, pero los muestra alfabéticamente así (sin importar si son términos padre/hijo):
Parent Category 2
Parent Category 1
Child Category 3
Parent Category 3
Child Category 2
Child Category 1
etc...
Mientras que lo que busco es una estructura más como esta:
—Parent Category 1
Child Category 1
Child Category 2
Child Category 3
—Parent Category 2
Child Category 1
Child Category 2
Child Category 3
—Parent Category 3
Child Category 1
Child Category 2
Child Category 3
Para que los términos hijos de cada taxonomía aparezcan debajo, mostrando a qué padre pertenecen. Mi marcado actual es:
<?php
$args = array(
'hide_empty' => false
);
$terms = get_terms("products-category");
if ( !empty( $terms ) && !is_wp_error( $terms ) ){
foreach ( $terms as $term ) { ?>
<option value=".<?php echo $term->slug; ?>" data-hook="<?php echo $term->slug; ?>"><?php echo $term->name; ?></option>
<?php }
} ?>
¡Cualquier sugerencia sobre cómo lograr esto sería muy apreciada!

Debes tener dos bucles foreach. Uno para obtener los términos de taxonomía padres y otro para obtener los términos hijos.
En el segundo foreach necesitas especificar el ID del término padre de la taxonomía que es $parent_term->term_id
del primer bucle foreach.
foreach( get_terms( 'products-category', array( 'hide_empty' => false, 'parent' => 0 ) ) as $parent_term ) {
// mostrar el nombre del término de nivel superior
echo $parent_term->name . '<br>';
foreach( get_terms( 'products-category', array( 'hide_empty' => false, 'parent' => $parent_term->term_id ) ) as $child_term ) {
// mostrar el nombre de todos los hijos del término padre
echo $child_term->name . '<br>';
}
}

Puedes simplemente utilizar wp_list_categories
para mostrar tu lista. Es extremadamente versátil y puede modificarse fácilmente para adaptarse a tus necesidades específicas. Aunque el nombre sugiere que es solo para la taxonomía incorporada category
, no es así. Se puede utilizar para cualquier taxonomía.
Tendrás que trabajar con ejemplos, etc. y modificarlos según sea necesario. Aquí tienes un ejemplo simple que puedes usar para mostrar tu lista:
wp_list_categories('taxonomy=products-category');

Al usar mi método, él tiene más flexibilidad y control sobre cómo se muestran los términos de su taxonomía. Pero tu respuesta también está bien.

Si usas tu propio walker con este método, puedes obtener la misma flexibilidad y control.

Basado en la respuesta aceptada, hice una taxonomía para nietos (grandchildren), además todos los elementos son casillas de verificación. En caso de que alguien lo necesite:
$taxonomy_name = 'tu-taxonomia';
foreach (get_terms($taxonomy_name, array('hide_empty' => false, 'parent' => 0)) as $parent_term) {
// mostrar el nombre del término de nivel superior
echo "<li class='depth-1'><label><input type='checkbox' name='{$taxonomy_name}' value='{$parent_term->slug}'>{$parent_term->name}</label></li>";
foreach (get_terms($taxonomy_name, array('hide_empty' => false, 'parent' => $parent_term->term_id)) as $child_term) {
// mostrar el nombre del primer nivel hijo del término padre
echo "<li class='depth-2'><label><input type='checkbox' name='{$taxonomy_name}' value='{$child_term->slug}'>{$child_term->name}</label></li>";
foreach (get_terms($taxonomy_name, array('hide_empty' => false, 'parent' => $child_term->term_id)) as $grandchild_term) {
// mostrar el nombre del segundo nivel hijo (nieto) del término padre
echo "<li class='depth-3'><label><input type='checkbox' name='{$taxonomy_name}' value='{$grandchild_term->slug}'>{$grandchild_term->name}</label></li>";
}
}
}
