Ordinare get_terms usando un Campo Personalizzato

12 set 2014, 19:57:44
Visualizzazioni: 29.8K
Voti: 7

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.

2
Commenti

Nota: Ho trovato soluzioni tramite plugin come Advanced Taxonomy Terms Order, che mi permette di trascinare e rilasciare i termini nell'ordine corretto, ma preferirei gestire questo aspetto tramite un orderby o qualche metodo di ordinamento automatico.

Phil Hoyt Phil Hoyt
12 set 2014 20:45:14

Puoi fare riferimento a questa discussione: http://wordpress.stackexchange.com/questions/117147/order-get-terms-by-custom-field

Oppure a questo link: http://www.wphub.com/sorting-categories-custom-sort-order/

Spero ti sia utile.

Domain Domain
12 set 2014 21:00:22
Tutte le risposte alla domanda 6
1
10

Una soluzione molto più breve, aggiungi questo prima di foreach:

usort($terms, function($a, $b) {
    return get_field('issue_date', $a) - get_field('issue_date', $b);
});
9 gen 2016 21:23:52
Commenti

Il migliore perché non importa se i valori di ordinamento sono identici o meno ed è la soluzione più elegante.

Picard Picard
30 nov 2021 01:31:11
5

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.

12 set 2014 21:41:49
Commenti

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.

Phil Hoyt Phil Hoyt
12 set 2014 21:57:06

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

vancoder vancoder
12 set 2014 22:06:53

È 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.

Phil Hoyt Phil Hoyt
12 set 2014 22:18:10

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

GDY GDY
23 dic 2016 10:37:21

Attenzione che se uno o più termini hanno la stessa data di emissione, si sovrascrivono a vicenda

uruk uruk
27 apr 2017 15:28:08
2

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!

14 ott 2015 21:22:10
Commenti

Questa dovrebbe essere la risposta accettata. Ottimo lavoro.

Christine Cooper Christine Cooper
6 mar 2016 17:34:40

Posso lavorare con questa soluzione, ma come ha commentato uruk sulla soluzione di vancoder, se 2 o più elementi hanno lo stesso valore nel campo order, si sovrascriveranno a vicenda e verrà visualizzato solo l'ultimo.

David Rhoden David Rhoden
9 lug 2019 00:12:27
0

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.

12 set 2014 22:25:59
0

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

9 mag 2015 04:30:13
0

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;
12 feb 2016 05:01:01