web-dev-qa-db-fra.com

Comment commander le résultat get_categories

J'ai lu la documentation du codex, mais je ne peux pas commander le résultat de get_categories () comme parent, childrens.

J'ai ce genre de catégories 'trois:

-Events
    - Music
    - Culture
    - Workshop
    - Tourism
-Sport
    -Football
    -Rugby
    -Tennis

Je veux que la sortie soit:

Events, Music

J'ai essayé:

echo $product->get_categories();

et le résultat est l'empreinte de Music, Events (enfant, parent).

J'ai aussi essayé de mettre $ args comme argument 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
); 

Comment puis-je le commander comme je le souhaite?

1
Daniele Meli

Premièrement , $product->get_categories() ne fonctionnera pas car il s’agit d’une fonction woocommerce, c’est en fait juste un wrapper pour get_the_term_list , qui n’a aucun paramètre de tri. _ {Il est toujours bon de regarder la source pour savoir à quoi vous avez affaire.} _

Deuxièmement , get_the_term_list utilise get_the_terms , mais il n’a également aucun paramètre de tri. Les derniers obtiennent les termes du cache get_object_term_cache ou directement wp_get_object_terms . Le cache est probablement inutile, car les termes y sont enregistrés avec un mauvais tri, d’où le problème que vous rencontrez. wp_get_object_terms a en revanche - enfin - la possibilité de définir le tri.

Du codex: _

Utilisation

wp_get_object_terms( $object_ids, $taxonomies, $args )

Arguments par défaut

$args = array('orderby' => 'name', 'order' => 'ASC', 'fields' => 'all');

Le premier argument s'appelle 'orderby' et a la valeur par défaut de 'name'. Les autres valeurs prises en charge sont 'count', 'slug', 'term_group', 'term_order' et 'term_id'.

Le deuxième argument s'appelle 'ordre' et a la valeur par défaut de 'ASC'. La seule autre valeur acceptable est 'DESC'.

Donc, cela pourrait vous rapprocher de ce que vous voulez, mais jetez un oeil vous-même.

Troisièmement , vous pouvez simplement utiliser get_ancestors , qui vous rend une

Tableau des ancêtres du plus bas au plus haut dans la hiérarchie

Ce qui fonctionne bien sur la taxonomie des catégories de produits woocommerce, car elle est hiérarchique. Cela devient toutefois un peu problématique si vous attribuez plusieurs termes par niveau hiérarchique. J'ai écrit une réponse concernant ce sujet général, cela vous aidera peut-être davantage.

3
Nicolai

J'ai écrit ce code que je lance après get_categories. Cela classera les résultats par catégories et noms parent:

$all_categories = get_categories( $args );

$byId = array();
// Create an array with categories by id
foreach ($all_categories as $cat) {
    $byId[$cat->term_id] = $cat;
} 

// Add a new path field that we can sort by
foreach ($all_categories as $cat) { 
    $path = $cat->name;
    $parentCat = $cat;
    for($n=0;$n<10 && $parentCat->parent > 0;$n++) {
        // Limit to 10 levels (change if you need to)
        $parentCat = $byId[$parentCat->parent];
        $path = $parentCat->name."/".$path;
    }
    $cat->path = $path;
} 

// Finally sort by the new path field
function cmp($a, $b) {
    return strcmp($a->path,$b->path);
}

usort($all_categories, "cmp");

// $all_categories are now sorted by hierarchy and name
2
Peter Salomonsen

Je n'ai pas de configuration comme vous, alors essayons quelque chose. Je donne le code, vous feriez mieux d'essayer de me donner les commentaires. Est-ce satisfaisant?

<?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 .', ';
}
?>
0
Mayeenul Islam

J'ai essayé:

<?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.', ';
}
?>

Il imprime toutes les catégories groupées pour la hiérarchie, dans mon cas:

Events, Sport, Music, Culture, Workshop, Tourism, Football, Rugby, Tennis.

Je voudrais juste omettre la catégorie non sélectionnée pour le post.

0
Daniele Meli