Ordinare get_terms per meta del termine
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

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.

$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 )
{
...
}

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

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
.

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