Ordonează get_terms folosind un câmp personalizat
Am o taxonomie personalizată "crb_issues" care are asociat un câmp personalizat "issue_date" ce returnează o valoare de tip dată pentru fiecare termen în formatul "20140601" (an-lună-zi).
Încerc să afișez toți termenii taxonomiei folosind get_terms și să îi ordonez după acel câmp personalizat. Mai jos este codul la care lucrez, care afișează corect numele termenilor și valoarea câmpului "issue_date", dar am dificultăți în a ordona rezultatele după acest câmp personalizat.
$args = array(
'meta_key' => 'issue_date',
'orderby' => 'meta_value_num',
'order' => 'DESC',
'hide_empty' => true,
'number' => '4',
'fields' => 'all',
);
$terms = get_terms("crb_issues", $args);
if ( !empty( $terms ) && !is_wp_error( $terms ) ){
echo "<ul>";
foreach ( $terms as $term ) {
echo "<li>" . $term->name . "</li>";
the_field('issue_date', $term);
}
echo "</ul>";
}
Orice ajutor ar fi foarte apreciat.

În loc să afișezi termenii în acea buclă inițială, aș folosi-o pentru a construi un nou array, cu issue_date ca cheie:
$my_new_array = array( );
foreach ( $terms as $term ) {
$issue_date = get_field( 'issue_date', $term );
$my_new_array[$issue_date] = $term->name;
}
Apoi poți parcurge acest nou array în ordine:
ksort( $my_new_array, SORT_NUMERIC );
foreach ( $my_new_array as $issue_date => $term_name ) {
echo "<li>" . $term_name . " " . $issue_date . "</li>";
}
Acest cod nu a fost testat.

Îmi place ideea, din păcate nu sunt suficient de inteligent ca să o fac să funcționeze corect, acest cod afișează cu siguranță toți termenii și altele, dar nu în ordinea issue_date.

Încearcă versiunea modificată de mai sus. Poate va trebui să forțezi noul array în ordinea corectă.

Exact la asta căutam pe Google când am văzut postarea ta! Haha. Am reușit să o fac să funcționeze modificând puțin pentru a se potrivi nevoilor mele și voi posta codul meu.

Bun punctat... e ciudat că get_terms() are orderby meta_value_num... dar nu am reușit să-l fac să funcționeze

Am folosit o metodă similară, dar am dorit să stochez mai multe valori din taxonomie decât numele și valoarea câmpului personalizat pe care le-am furnizat, așa că am ajuns să le stochez ca un obiect
și să creez un array
similar cu ceea ce este returnat efectiv atunci când utilizați funcția get_terms
.
Obțineți termenii:
$terms = get_terms('your-taxonomy');
Apoi creați un nou array, stocându-le după valoarea câmpului meu personalizat, care în acest caz a fost numerică:
$newterms = array();
foreach($terms as $term) {
$order = get_field('order', $term); //ACESTA ESTE VALOAREA CÂMPULUI MEU PERSONALIZAT
$newterms[$order] = (object) array(
'name' => $term->name,
'slug' => $term->slug,
'term_id' => $term->term_id
);
}
Sortați-le numeric:
ksort( $newterms, SORT_NUMERIC );
Apoi utilizați bucla foreach
pentru a obține valorile fiecărui obiect:
foreach ( $newterms as $newterm ) {
echo '<a href="#' . $newterm->slug . '">' . $newterm->name . '</a>';
}
Deci, în esență, rescriu array-ul pentru a utiliza cheia ordinii mele personalizate, dar în acest caz aveam nevoie de slug, nume și ID-ul termenului, așa că l-am stocat ca un obiect, mai degrabă decât metoda de mai sus.
Scopul meu final a fost să configurez un Advanced Custom Field astfel încât atunci când se creează un termen de taxonomie, acesta să poată primi o ordine numerică de la utilizator, iar apoi să pot parcurge termenii în funcție de ordinea dorită.
Sper că acest lucru ajută pe cineva!

Mulțumesc Vancoder pentru ajutor!!! Am tot încercat să rezolv problema toată ziua și eram disperat. Culmea e că soluția ta era una dintre cele șase pe care le-am notat pe tablă, DAR nu aveam nicio idee cum să creez efectiv un array folosind-o drept cheie. Sunt începător în astfel de lucruri. Mai jos este codul pe care l-am folosit în final, cu câteva comentarii pentru oricine încearcă să facă același lucru!
<?php
$terms = get_terms("crb_issues");
$issue_archive = array( ); // creează un array pentru toți termenii din taxonomia crb_issues folosind câmpul personalizat "issue_date" drept cheie
foreach ( $terms as $term ) {
$issue_date = get_field( 'issue_date', $term );
$issue_archive[$issue_date] = $term->name;
}
krsort( $issue_archive, SORT_NUMERIC ); //sortează array-ul issue_archive în ordine descrescătoare
foreach ( $issue_archive as $issue_date => $term_name ) {
echo "<li>" . $term_name . " " . $issue_date . "</li>"; //afișează numele termenului și câmpul personalizat issue_date
if (++$i == 4) break; //Oprește foreach după primele 4 intrări
}
?>
Dacă cineva are sugestii mai bune pentru comentariile din acest cod sau modalități mai eficiente de a gestiona anumite aspecte, vă rog să-mi spuneți. Dar cred că aceasta este o soluție destul de bună.

Mulțumesc Phil Hoyt, exact la asta mă gândeam. Dar, din păcate, nu am reușit să funcționeze în configurația mea. Ce a funcționat este următoarea soluție:
<?php
// Soluție pentru sortarea după câmp personalizat ACF pentru categoriile de tracks
// http://support.advancedcustomfields.com/forums/topic/sorting-categories-list-by-custom-field/
$categories = get_categories('taxonomy=tracks');
$sorted_cats = array();
foreach($categories as $cat){
//$ordr = get_field('track_order', 'tracks_'.$cat>term_id); //nu funcționa, așa că am folosit linia de mai jos
$ordr = get_field( 'track_order', $cat );
$sorted_cats[$ordr] = $cat;
}
krsort($sorted_cats);//ksort sortează crescător, krsort inversează ordinea (adică de la mare la mic)
?>
Noroc

Sortează termenii după valoarea 'order' din array în loc de cheia array-ului. Dacă ai 2 elemente cu aceeași cheie, ultimul va înlocui primul. Acest lucru va preveni această situație și îi va face pe toți vizibili:
$sorted = array();
$args = array( 'hide_empty' => false );
$terms = get_terms( 'my-tax', $args );
if( $terms ) :
foreach ( $terms as $term ) {
$sorted[] = array(
'order' => get_field( 'order', $term ), // Obține câmpul din ACF
'name' => $term->name,
);
}
function sortByOrder($a, $b) {
return $a['order'] - $b['order'];
}
usort($sorted, 'sortByOrder');
foreach( $sorted as $t ) :?>
<span>
<?php echo $t['name']; ?>
</span>
<?php endforeach;
endif;
