Cómo ordenar el resultado de get_categories
He leído la documentación del codex pero no puedo ordenar el resultado de get_categories() como padre, hijos.
Tengo este tipo de árbol de categorías:
-Eventos
- Música
- Cultura
- Taller
- Turismo
-Deporte
-Fútbol
-Rugby
-Tenis
Quiero que la salida sea:
Eventos, Música
He probado:
echo $product->get_categories();
y el resultado es la impresión de Música, Eventos (hijo, padre).
También probé poniendo $args como argumento de get_categories():
$args = array(
'type' => 'post',
'child_of' => 0,
'parent' => '',
'orderby' => 'name',
'order' => 'ASC',
'hide_empty' => 1,
'hierarchical' => 1,
'exclude' => '',
'include' => '',
'number' => '',
'taxonomy' => 'category',
'pad_counts' => false
);
¿Cómo puedo ordenarlo de la manera que quiero?

En primer lugar, $product->get_categories()
no funcionará porque es una función de WooCommerce, que básicamente es un envoltorio para get_the_term_list
, la cual no tiene un parámetro de ordenación. Siempre es bueno revisar el código fuente para saber con qué estás trabajando.
En segundo lugar, get_the_term_list
utiliza get_the_terms
, pero tampoco tiene un parámetro de ordenación. Esta última obtiene los términos ya sea desde la caché get_object_term_cache
o directamente mediante wp_get_object_terms
. La caché probablemente no será útil porque los términos allí guardados tienen el orden incorrecto, de ahí el problema que estás experimentando. wp_get_object_terms
, por otro lado, tiene —finalmente— la capacidad de definir el orden.
Del Codex:
Uso
wp_get_object_terms( $object_ids, $taxonomies, $args )
Argumentos por Defecto
$args = array('orderby' => 'name', 'order' => 'ASC', 'fields' => 'all');
El primer argumento se llama 'orderby' y tiene como valor por defecto 'name'. Otros valores soportados incluyen 'count', 'slug', 'term_group', 'term_order', y 'term_id'.
El segundo argumento se llama 'order' y tiene como valor por defecto 'ASC'. El único otro valor aceptable es 'DESC'.
Así que esto podría acercarte a lo que deseas, pero revísalo tú mismo.
En tercer lugar, podrías simplemente usar get_ancestors
, que te devuelve un
Array de ancestros desde el más bajo al más alto en la jerarquía
Lo cual funciona bien en la taxonomía de categorías de producto de WooCommerce ya que es jerárquica. Sin embargo, se vuelve un poco problemático si asignas múltiples términos por nivel de jerarquía. He escrito una respuesta sobre este tema general, tal vez te ayude más.

Escribí este código que ejecuto después de get_categories. Esto ordenará los resultados por categorías padre y nombres:
$all_categories = get_categories( $args );
$byId = array();
// Crear un array con categorías por id
foreach ($all_categories as $cat) {
$byId[$cat->term_id] = $cat;
}
// Añadir un nuevo campo path por el que podemos ordenar
foreach ($all_categories as $cat) {
$path = $cat->name;
$parentCat = $cat;
for($n=0;$n<10 && $parentCat->parent > 0;$n++) {
// Limitar a 10 niveles (cambiar si es necesario)
$parentCat = $byId[$parentCat->parent];
$path = $parentCat->name."/".$path;
}
$cat->path = $path;
}
// Finalmente ordenar por el nuevo campo path
function cmp($a, $b) {
return strcmp($a->path,$b->path);
}
usort($all_categories, "cmp");
// $all_categories ahora está ordenado por jerarquía y nombre

No tengo una configuración como la tuya, así que intentemos algo. Te doy el código, mejor pruébalo y dame tu feedback. ¿Es satisfactorio?
<?php
$args = array(
'type' => 'post',
'child_of' => 0,
'parent' => '',
'orderby' => 'name',
'order' => 'ASC',
'hide_empty' => false,
'hierarchical' => 1,
'exclude' => '',
'include' => '',
'number' => '',
'taxonomy' => 'category',
'pad_counts' => false
);
$cats = get_categories( $args );
//var_dump($cat);
foreach( $cats as $cat ){
echo $cat->name .', ';
}
?>

Intenté:
<?php
$args = array(
'type' => 'product',
'child_of' => 0,
'parent' => '',
'orderby' => 'term_group',
'hide_empty' => false,
'hierarchical' => 1,
'exclude' => '',
'include' => '',
'number' => '',
'taxonomy' => 'product_cat',
'pad_counts' => false
);
$cats = get_categories( $args );
//var_dump($cat);
foreach( $cats as $cat ){
echo $cat->name.', ';
}
?>
Esto imprime todas las categorías agrupadas por jerarquía, en mi caso:
Eventos, Deportes, Música, Cultura, Talleres, Turismo, Fútbol, Rugby, Tenis.
Solo quisiera omitir las categorías no seleccionadas para el post.
