Ordinare get_terms per meta del termine

22 nov 2016, 04:55:29
Visualizzazioni: 32.4K
Voti: 10

Ho una tassonomia personalizzata chiamata prod-cat

Voglio ordinare l'output nel template per numero, quindi ho aggiunto un term_meta alla tassonomia in questo modo:

add_action( 'prod-cat_add_form_fields', 'add_feature_group_field', 10, 2 );
function add_feature_group_field($taxonomy) {
    ?>
    <div class="form-field term-order-wrap">
        <label for="term-order">Ordine</label>
        <input type="text" name="wm-cat-prod-order" />
    </div>
    <?php
}

E poi:

add_action( 'created_prod-cat', 'save_feature_meta', 10, 2 );
function save_feature_meta( $term_id, $tt_id ){
    if( isset( $_POST['wm-cat-prod-order'] ) && '' !== $_POST['wm-cat-prod-order'] ){
        add_term_meta( $term_id, 'wm-cat-prod-order', $_POST['wm-cat-prod-order'], true );
    }
}

Ho il term_meta funzionante e viene salvato. Poi nel template faccio questo:

$args = array(
    'taxonomy'      =>  'categoria-de-productos',
    'orderby'       =>  'wm-cat-prod-order',
    'order'         =>  'ASC',
    'hide_empty'    =>  false,
    'hierarchical'  =>  false,
    'parent'        =>  0,
);

$terms = get_terms( $args );

Ma non riesco a ordinarlo per il meta "wm-cat-prod-order". Qualcuno può aiutarmi? Grazie

0
Tutte le risposte alla domanda 4
3
18

get_terms supporta un meta_query che richiama un nuovo parametro WP_Meta_Query come puoi vedere qui. Per interrogare i tuoi termini con i metadati desiderati, potresti modificare la tua chiamata di funzione in qualcosa come questo:

$args = array(
  'taxonomy' => 'categoria-de-productos',
  'orderby' => 'meta_value_num',
  'order' => 'ASC',
  'hide_empty' => false,
  'hierarchical' => false,
  'parent' => 0,
  'meta_query' => [[
    'key' => 'wm-cat-prod-order',
    'type' => 'NUMERIC',
  ]],
);

$terms = get_terms( $args );

Questo codice non è stato testato e potrebbe aver bisogno di modifiche nel tuo esempio. Ma i collegamenti dovrebbero guidarti verso la soluzione.

22 nov 2016 11:45:33
Commenti

Questo non funziona sulle categorie + acf

vladkras vladkras
30 mag 2017 07:56:49

Cosa vuoi ottenere esattamente @vladkras?

Fabian Marz Fabian Marz
30 mag 2017 11:34:12

Puoi anche negare la parte meta_query dei tuoi argomenti semplicemente aggiungendo 'meta_key'=>'wm-cat-prod-order' assicurandoti di mantenere ancora la parte 'orderby' => 'meta_value_num'

Frits Frits
3 dic 2019 09:43:09
2
$args = array(

    'taxonomy'      => 'MY_TAX', // Tassonomia da interrogare
    'meta_key'      => 'ordem',   // Chiave meta per l'ordinamento
    'meta_compare'  => 'NUMERIC', // Confronto come valore numerico
    'orderby'       => 'meta_value_num', // Ordina per valore numerico del meta
    'order'         => 'ASC',     // Ordine ascendente
    'hide_empty'    => false,    // Mostra anche termini vuoti
);

$the_query = new WP_Term_Query($args); // Esegue la query sui termini

// Ciclo attraverso i termini restituiti
foreach ( $the_query->get_terms() as $term )
{
    ...
}
29 ago 2018 20:12:01
Commenti

Per favore [modifica] la tua risposta, e aggiungi una spiegazione: perché potrebbe risolvere il problema?

fuxia fuxia
29 ago 2018 20:46:48

Questo funziona con i custom post type ed è la soluzione più semplice, basta cambiare il meta_key con lo stesso nome del field_name (nota che questo è un numero)

User User
3 feb 2019 11:53:04
0

Anche io ho avuto difficoltà con questo e ho creato il mio campo personalizzato con ACF. Ecco cosa ho fatto per farlo funzionare (ho rimosso alcune proprietà per brevità):

$args = array(
    'taxonomy'      => 'categoria-de-productos',
    'order'         => 'ASC',
    'orderby'       => 'meta_value_num', //Tratta il valore meta come numerico
    'meta_key'      => 'wm-cat-prod-order' //Chiave meta
);
$terms_query = new WP_Term_Query( $args );
if( ! empty( $terms_query->terms ) ) {
   foreach( $terms_query->terms as $term ) {
      //Esegui operazioni, $term è un oggetto WP_Term
    }
}

Una cosa che faccio solitamente è definire un fallback, come 'meta_value_num term_id' per usare term_id se i valori per wm-cat-prod-order sono tutti uguali, ma questo ha completamente rotto il funzionamento e prodotto risultati inaspettati. Ha funzionato solo se 'meta_value_num' era l'unico valore per orderby.

14 ago 2020 00:51:29
0

Per me, ho creato una tassonomia personalizzata e in quella tassonomia personalizzata avevo un meta personalizzato. Volevo avere nel backend di amministrazione una colonna e renderla ordinabile. Per far funzionare l'ordinamento per un meta personalizzato in una tassonomia personalizzata, ho fatto questo.

https://pastebin.com/vr2sCKzX

public function pre_get_terms( $query ) {
$meta_query_args = array(
    'relation' => 'AND', // Opzionale, il valore predefinito è "AND"
    array(
        'key'     => 'order_index',
        'value'   => 0,
        'compare' => '>='
    )
);
$meta_query = new WP_Meta_Query( $meta_query_args );
$query->meta_query = $meta_query;
$query->orderby = 'position_clause';

} Ho trovato la risposta in questo link https://core.trac.wordpress.org/ticket/34996

Ho solo dovuto adattare la risposta fornita nei commenti da @eherman24

10 nov 2017 16:20:34