No sé si os ha pasado pero, en varias ocasiones, he necesitado obtener taxonomías en forma de array multidimensional para poder mostrarlas como necesito.
Sin bien es cierto que WordPress tiene funciones propias para obtener una lista con las taxonomías, el resultado que nos devuelve está formateado o sin jerarquía. Hablo de funciones como get_terms(), get_categories(), wp_dropdown_categories() o wp_list_categories().
Para solucionar este pequeño inconveniente he desarrollado una pequeña función recursiva que te devuelve toda la jerarquía en forma de array multidimensional a partir de un padre:
function taxonomies_children($taxonomy, $parent){
$args = array(
'taxonomy' => $taxonomy,
'parent' => $parent,
'orderby' => 'name',
'order' => 'ASC',
'hierarchical' => 1
);
$categories = get_categories( $args );
$result = array();
foreach ( $categories as $category ){
$result[] = array(
"id" => $category->term_id,
"name" => $category->name,
"children" => taxonomies_children($taxonomy, $category->term_id),
);
}
return $result;
}
Solo hay que pasar dos argumentos: nombre de la taxonomía y el id del padre. Ejemplo: taxonomies_children(‘categoria’, 23);
Si lo que queremos es listar todos los elementos de la taxonomía, y no solo la familia del padre dado, bastará con llamar a la función dentro de un bucle donde listemos los elementos de la taxonomía sin padres:
$taxonomy = 'categoria';
$args = array(
'taxonomy' => $taxonomy,
'parent' => 0,
'orderby' => 'name',
'order' => 'ASC',
'hierarchical' => 1,
);
$categories = get_categories( $args );
$data = array();
foreach ( $categories as $category ){
$data[] = array(
"id" => $category->term_id,
"name" => $category->name,
"children" => taxonomies_children($taxonomy, $category->term_id),
);
}
Después de ejecutar este pequeño script tendremos en la variable $data un array multidimensional con todos los elementos de la taxonomía.
Leer el array multidimensional
Una vez obtenidos todos los datos, una forma sencilla de leerlos y utilizarlos como se quiera sería mediante otra función recursiva:
function list_children($data, $url){
$result = '<ul>';
foreach($data as $aux){
$result .= '<li>';
$result .= '<a href="'.$url.$aux["id"].'">'.$aux["name"].'</a>';
if ($aux["children"]) $result .= list_children($aux["children"], $url);
$result .= '</li>';
}
$result .= '</ul>';
return $result;
}
$url = get_permalink() .'?id_category=';
$response = '<ul>';
foreach($data as $aux){
$response .= '<li>';
$response .= '<a href="'.$url.$aux["id"].'">'.$aux["name"].'</a>';
if ($aux["children"]) {
$response .= list_children($aux["children"], $url);
}
$response .= '</li>';
}
$response .= '</ul>';
En este ejemplo lo que hago es crear una lista jerárquica con todos los elementos de la taxonomía pasando por URL la variable id_category con el id del elemento.
Espero que te sirva de ayuda. Como siempre, si tienes alguna duda o aportación, no dudes en dejar un comentario.