Cómo ordenar el resultado de get_categories

28 nov 2013, 13:58:03
Vistas: 36.3K
Votos: 3

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?

5
Comentarios

¿Necesitas los términos de categoría para el $post actual? ¿O todas las categorías de manera jerárquica?

Simon Simon
29 nov 2013 18:50:57

solo los términos de la publicación actual, para mostrarlos en el archivo, debajo de cada publicación

mgt mgt
29 nov 2013 18:54:08

get_categories no es la función correcta para categorías asignadas a una publicación, debes usar get_the_category para la taxonomía de categoría incorporada, o get_the_terms para cualquier taxonomía incluyendo las personalizadas.

Milo Milo
29 nov 2013 19:31:33

Por si acaso, hice algo al respecto recientemente: http://wordpress.stackexchange.com/questions/124566/help-building-array-hierarchically-with-taxonomies-to-get-posts/124667#124667 - si no tienes una respuesta simple, intentaremos adaptar esto.

Simon Simon
29 nov 2013 20:05:11

por favor considera aceptar una de las respuestas que te ayudaron a resolver tu problema :)

atiquratik atiquratik
8 dic 2014 11:11:32
Todas las respuestas a la pregunta 4
0

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.

29 nov 2013 21:16:38
0

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
7 abr 2016 09:43:48
1

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 .', ';
}
?>
29 nov 2013 19:09:17
Comentarios

Es un paso adelante :D gracias

mgt mgt
29 nov 2013 19:31:12
0

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.

29 nov 2013 19:29:21