Cum să ordonezi rezultatul funcției get_categories

28 nov. 2013, 13:58:03
Vizualizări: 36.3K
Voturi: 3

Am citit documentația din codex dar nu pot ordona rezultatul funcției get_categories() exact așa cum vreau - părinte, copii.

Am următoarea structură de categorii:

-Evenimente
    - Muzică 
    - Cultură
    - Workshop
    - Turism
-Sport
    -Fotbal
    -Rugby
    -Tenis

Vreau ca rezultatul să fie:

Evenimente, Muzică

Am încercat:

echo $product->get_categories();

iar rezultatul afișează Muzică, Evenimente (copil, părinte).

De asemenea, am încercat să transmit argumentul $args către 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
); 

Cum pot ordona categoriile în modul dorit?

5
Comentarii

Ai nevoie de termenii de categorie pentru $post-ul curent? Sau toate categoriile într-o manieră ierarhică?

Simon Simon
29 nov. 2013 18:50:57

doar termenii pentru postarea curentă, care să fie afișați în arhivă, sub fiecare postare

mgt mgt
29 nov. 2013 18:54:08

get_categories nu este funcția corectă pentru categoriile asignate unei postări, pentru taxonomia de categorii încorporată vei dori get_the_category, sau get_the_terms pentru orice taxonomie inclusiv cele personalizate.

Milo Milo
29 nov. 2013 19:31:33

Doar pentru orice eventualitate, am făcut ceva în legătură cu asta recent: http://wordpress.stackexchange.com/questions/124566/help-building-array-hierarchically-with-taxonomies-to-get-posts/124667#124667 - dacă nu ai un răspuns simplu, vom încerca să adaptăm asta.

Simon Simon
29 nov. 2013 20:05:11

te rog să iei în considerare acceptarea unui răspuns care ți-a ajutat să rezolvi problema :)

atiquratik atiquratik
8 dec. 2014 11:11:32
Toate răspunsurile la întrebare 4
0

În primul rând, $product->get_categories() nu va funcționa deoarece este o funcție WooCommerce, care practic este doar un wrapper pentru get_the_term_list, care nu are parametru de sortare. Este întotdeauna bine să arunci o privire la sursă pentru a ști cu ce ai de-a face.

În al doilea rând, get_the_term_list folosește get_the_terms, dar nici aceasta nu are parametru de sortare. Aceasta din urmă obține termenii fie din cache-ul get_object_term_cache fie direct din wp_get_object_terms. Cache-ul cel mai probabil nu este util, deoarece termenii sunt salvați acolo cu sortarea greșită, de unde și problema pe care o întâmpinați. wp_get_object_terms, pe de altă parte, are - în sfârșit - capacitatea de a defini sortarea.

Din codex:

Utilizare

wp_get_object_terms( $object_ids, $taxonomies, $args )

Argumente implicite

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

Primul argument se numește 'orderby' și are valoarea implicită 'name'. Alte valori suportate includ 'count', 'slug', 'term_group', 'term_order' și 'term_id'.

Al doilea argument se numește 'order' și are valoarea implicită 'ASC'. Singura altă valoare acceptabilă este 'DESC'.

Deci acest lucru v-ar putea aduce mai aproape de ceea ce doriți, dar aruncați o privire singur.

În al treilea rând, ați putea folosi pur și simplu get_ancestors, care vă returnează un

Array de strămoși de la cel mai mic la cel mai mare în ierarhie

Ceea ce funcționează bine pe taxonomia de categorii de produse WooCommerce, deoarece este ierarhică. Totuși, devine puțin problematic dacă atribuiți mai mulți termeni pe nivel de ierarhie. Am scris un răspuns legat de acest subiect general, poate vă va fi de ajutor.

29 nov. 2013 21:16:38
0

Am scris acest cod pe care îl rulez după get_categories. Acesta va sorta rezultatele după categorii părinte și nume:

$all_categories = get_categories( $args );

$byId = array();
// Crează un array cu categorii după ID
foreach ($all_categories as $cat) {
    $byId[$cat->term_id] = $cat;
} 

// Adaugă un nou câmp 'path' după care putem sorta
foreach ($all_categories as $cat) { 
    $path = $cat->name;
    $parentCat = $cat;
    for($n=0;$n<10 && $parentCat->parent > 0;$n++) {
        // Limitează la 10 niveluri (schimbă dacă e necesar)
        $parentCat = $byId[$parentCat->parent];
        $path = $parentCat->name."/".$path;
    }
    $cat->path = $path;
} 

// Funcție de comparare pentru sortare
function cmp($a, $b) {
    return strcmp($a->path,$b->path);
}

// Sortează array-ul folosind funcția de comparare
usort($all_categories, "cmp");

// $all_categories sunt acum sortate ierarhic și după nume
7 apr. 2016 09:43:48
1

Nu am o configurație ca a ta, așa că hai să încercăm ceva. Îți dau codul, tu încearcă și dă-mi feedback-ul. E satisfăcător?

<?php
$args = array(
    'type'                     => 'post', // Tipul de conținut
    'child_of'                 => 0, // ID-ul categoriei părinte
    'parent'                   => '', // ID-ul părintelui direct
    'orderby'                  => 'name', // Ordonează după nume
    'order'                    => 'ASC', // Ordine crescătoare
    'hide_empty'               => false, // Afișează și categoriile goale
    'hierarchical'             => 1, // Păstrează ierarhia
    'exclude'                  => '', // ID-uri de exclus
    'include'                  => '', // ID-uri de inclus
    'number'                   => '', // Număr maxim de categorii
    'taxonomy'                 => 'category', // Taxonomia
    'pad_counts'               => false // Numără postările în subcategorii
);

$cats = get_categories( $args );
//var_dump($cat);
foreach( $cats as $cat ){
    echo $cat->name .', '; // Afișează numele categoriei
}
?>
29 nov. 2013 19:09:17
Comentarii

Este un pas înainte :D mersi

mgt mgt
29 nov. 2013 19:31:12
0

Am încercat:

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

Afișează toate categoriile grupate ierarhic, în cazul meu:

Evenimente, Sport, Muzică, Cultură, Ateliere, Turism, Fotbal, Rugby, Tenis.

Vreau doar să omit categoria nealesă pentru postare.

29 nov. 2013 19:29:21