Obtener términos de taxonomía padre e hijo en WordPress

10 nov 2014, 18:14:25
Vistas: 18.1K
Votos: 1

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!

0
Todas las respuestas a la pregunta 3
2

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>';
  }

}
10 nov 2014 18:24:46
Comentarios

esto está generando un error de análisis: Parse error: syntax error, unexpected '['?

user1374796 user1374796
10 nov 2014 18:35:56

Esto se debe a tu versión de PHP. Para esta sintaxis deberías tener PHP 5.4+ creo. ¡Revisa mi respuesta actualizada! [] equivale a array() por cierto.

SLH SLH
10 nov 2014 18:37:02
3

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');
10 nov 2014 18:48:15
Comentarios

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.

SLH SLH
10 nov 2014 18:57:28

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

Milo Milo
10 nov 2014 21:23:38

@Milo sí, todo depende de lo que realmente quiera lograr el OP. Debo admitir, excelente observación

Pieter Goosen Pieter Goosen
10 nov 2014 21:30:00
0

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>";
      }
   }
}
19 sept 2024 17:26:24