Ordinare get_terms usando un Campo Personalizzato
Ho una tassonomia personalizzata "crb_issues" che ha un campo personalizzato associato chiamato "issue_date" che restituisce un valore data per ogni termine nel formato "20140601" (annoMeseGiorno).
Sto cercando di visualizzare tutti i termini della Tassonomia usando get_terms e ordinarli secondo quel campo personalizzato. Di seguito il codice su cui sto lavorando che visualizza correttamente il Nome dei Termini e il valore di "issue_date". Tuttavia, sto avendo difficoltà a far ordinare l'output secondo quel campo personalizzato.
$args = array(
'meta_key' => 'issue_date',
'orderby' => 'meta_value_num',
'order' => 'DESC',
'hide_empty' => true,
'number' => '4', // Limita a 4 risultati
'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>";
}
Qualsiasi aiuto sarebbe molto apprezzato.

Invece di visualizzare i termini nel ciclo iniziale, lo utilizzerei per costruire un nuovo array, con la data di emissione come chiave:
$my_new_array = array( );
foreach ( $terms as $term ) {
$issue_date = get_field( 'issue_date', $term );
$my_new_array[$issue_date] = $term->name;
}
Puoi quindi scorrere questo nuovo array in ordine:
ksort( $my_new_array, SORT_NUMERIC );
foreach ( $my_new_array as $issue_date => $term_name ) {
echo "<li>" . $term_name . " " . $issue_date . "</li>";
}
Non è stato testato.

Mi piace l'idea, purtroppo non sono abbastanza intelligente per farla funzionare correttamente, questo sicuramente restituisce tutti i termini e tutto il resto, ma non in ordine di issue_date.

Prova la versione modificata sopra. Potresti dover forzare il nuovo array nell'ordine corretto.

È esattamente quello che stavo cercando su Google quando ho visto il tuo post! Ahah. L'ho fatto funzionare modificandolo leggermente per adattarlo alle mie esigenze e pubblicherò il mio codice.

Buona osservazione... strano che get_terms() abbia orderby meta_value_num... ma non sono riuscito a farlo funzionare

Ho utilizzato un metodo simile, ma volevo memorizzare più valori dalla tassonomia rispetto al nome e al valore del campo personalizzato che avevo fornito, quindi ho finito per memorizzarli come oggetto
e creare un array
molto simile a ciò che viene effettivamente restituito quando si utilizza la funzione get_terms
.
Ottieni i tuoi termini:
$terms = get_terms('your-taxonomy');
Quindi crea un nuovo array, memorizzandoli in base al valore del mio campo personalizzato, che in questo caso era numerico:
$newterms = array();
foreach($terms as $term) {
$order = get_field('order', $term); //QUESTO È IL VALORE DEL MIO CAMPO PERSONALIZZATO
$newterms[$order] = (object) array(
'name' => $term->name,
'slug' => $term->slug,
'term_id' => $term->term_id
);
}
Ordinali numericamente:
ksort( $newterms, SORT_NUMERIC );
Quindi utilizza il ciclo foreach
per ottenere i valori di ogni oggetto:
foreach ( $newterms as $newterm ) {
echo '<a href="#' . $newterm->slug . '">' . $newterm->name . '</a>';
}
Quindi, essenzialmente sto riscrivendo l'array per utilizzare la chiave del mio ordine personalizzato, ma in questo caso avevo bisogno dello slug, del nome e dell'ID del termine, quindi li ho memorizzati come oggetto, piuttosto che con il metodo sopra descritto.
Il mio obiettivo finale era impostare un Advanced Custom Field in modo che quando veniva creato un termine di tassonomia, potesse essere assegnato un ordine numerico dall'utente, e quindi potessi scorrere i termini in base all'ordine desiderato.
Spero che questo possa aiutare qualcuno!

Grazie Vancoder per il tuo aiuto!!! Ho passato tutto il giorno a strapparmi i capelli cercando di capire come fare. Ironia della sorte, la tua soluzione era una delle sei che avevo scritto sulla mia lavagna, MA non avevo la minima idea di come creare effettivamente un array con quella come chiave. Sono proprio un principiante in questo. Di seguito il codice che ho finito per usare, con alcuni commenti per chiunque altro stia cercando di fare la stessa cosa!
<?php
$terms = get_terms("crb_issues");
$issue_archive = array( ); // crea un array per tutti i termini all'interno della tassonomia crb_issues usando il campo personalizzato "issue_date" come chiave
foreach ( $terms as $term ) {
$issue_date = get_field( 'issue_date', $term );
$issue_archive[$issue_date] = $term->name;
}
krsort( $issue_archive, SORT_NUMERIC ); //ordina l'array issue_archive dal valore più alto al più basso
foreach ( $issue_archive as $issue_date => $term_name ) {
echo "<li>" . $term_name . " " . $issue_date . "</li>"; //mostra il nome del termine e il campo personalizzato issue_date
if (++$i == 4) break; //Interrompe il foreach dopo 4 elementi
}
?>
Se qualcuno ha commenti migliori per questo codice fatemelo sapere, o modi migliori per gestire qualsiasi cosa. Ma penso che questa sia una soluzione piuttosto fantastica.

Grazie Phil Hoyt, era esattamente quello che stavo cercando. Ma, purtroppo, non sono riuscito a farlo funzionare con il mio setup. Quello che invece funziona è il seguente:
<?php
// Soluzione per ordinare per campo personalizzato ACF nelle categorie di tracce
// 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); //non funzionava quindi ho usato la riga sotto
$ordr = get_field( 'track_order', $cat );
$sorted_cats[$ordr] = $cat;
}
krsort($sorted_cats);//ksort ordina in modo ascendente, krsort inverte l'ordine (cioè dal più grande al più piccolo)
?>
Saluti

Ordina i termini per il valore dell'array 'order' invece che per la chiave dell'array. Se hai 2 elementi con la stessa chiave, l'ultimo sovrascriverà il primo. Questo lo eviterà e li renderà tutti visibili:
$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 ), // Ottieni il campo da 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;
