WP_Query - Ordinare i risultati per valore meta
Ho controllato in giro e non ho ancora trovato una risposta funzionante. Ho una WP_Query con i seguenti argomenti:
$args = array(
'post_status' => 'publish',
'post_type' => 'listing',
'meta_key' => 'client_feedback_score',
'orderby' => 'client_feedback_score',
'order' => 'DESC'
);
$query = new WP_Query($args);
Voglio ordinare i risultati per il campo personalizzato client_feedback_score, dal più basso al più alto. Ma questo non sembra funzionare... qualcuno può indicarmi la direzione giusta?
MODIFICA (RISOLTO):
Grazie alla risposta di Milo, ecco il codice funzionante per ordinare per valore meta numerico:
$args = array(
'post_status' => 'publish',
'post_type' => 'listing',
'meta_key' => 'client_feedback_score',
'orderby' => 'meta_value_num',
'order' => 'DESC'
);
orderby dovrebbe essere meta_value_num o meta_value, non il nome della chiave. Consulta i parametri orderby di WP_Query.
Grazie! Sei il mio salvatempo! Da nessuna parte su WPCodex viene menzionato 'meta_value_num'.
BasTaller
Piccola nota, se il meta_key non esiste ancora per il post, il post verrà ignorato.
adamj
meta_value_num è un meta personalizzato che puoi assegnare ai post type? Ho bisogno di poter modificare questo valore per ogni post.
RobBenz
@RobBenz Vedi Campi Personalizzati per imparare i meta dei post.
Milo
grazie, ho familiarità con i meta personalizzati dei post. Voglio aggiungere un meta box ai prodotti WC, chiamato search_order o qualcosa del genere. in modo che quando vengono mostrati i risultati di ricerca: io possa avere la capacità di controllare l'ordine del loro display. dovrei chiamare il meta personalizzato che sto aggiungendo meta_value_num
RobBenz
oppure meta_value_num prende semplicemente il valore di qualsiasi 'meta_key' => 'search_order' sia basato sul post
RobBenz
@RobBenz meta_value_num sta dicendo a WP di ordinare i risultati in base a un valore meta numerico. Non è il nome della chiave.
Milo
come posso modificare meta_value_num in modo che un particolare post compaia più in alto nei risultati di ricerca
RobBenz
@RobBenz Dovresti probabilmente iniziare una nuova domanda su questo argomento. Passo 1 Assegna il valore che desideri alla tua meta chiave, chiamiamola my_meta_key, per ogni post per generare l'ordine che preferisci. Passo 2 Imposti meta_key nella tua query a my_meta_key. Questo dice a WordPress di interrogare i post che hanno quella chiave. Passo 3 Imposta orderby nella tua query a meta_value_num. Questo dice a WordPress non solo di interrogare i post con my_meta_key, ma anche di ordinarli numericamente in base a quella chiave. Quel parametro della query è l'unico posto in cui vedrai o userai meta_value_num.
Milo
@adamj esiste qualche soluzione alternativa? Ho bisogno di ordinare tutti i post, indipendentemente dal fatto che la meta_key esista o meno per il post.
unbreak
se il tuo meta valore non è numerico, ad esempio se è un valore di data, puoi aggiungere il parametro meta_type => DATE.
I valori possibili sono: 'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED'.
La query con il tipo meta sarà così:
$args = array(
'post_status' => 'publish',
'post_type' => 'listing',
'meta_key' => 'client_feedback_score',
'orderby' => 'meta_value_num',
'meta_type' => 'DATE',
'order' => 'DESC'
);
Per rispondere al punto sollevato da @adamj nella risposta accettata
se il meta_key non esiste ancora per il post, il post verrà ignorato.
Ecco una soluzione che includerà anche i post a cui manca un valore client_feedback_score. Puoi impostare una semplice query per elencare tutti i post. Poi effettua manualmente un left join con la tabella postmeta dove meta_value è client_feedback_score. Infine ordinali con una clausola orderby.
$args = array(
'post_status' => 'publish',
'post_type' => 'listing',
);
add_filter('post_clauses','post_meta_sort',10,1);
function post_meta_sort( $sql_clauses ) {
global $wpdb;
remove_filter( 'posts_clauses', 'post_meta_sort' ); // Impedisce a questa funzione di essere eseguita su altre query.
$sql_clauses['join'] .= "LEFT JOIN $wpdb->postmeta AS sort_score_postmeta ON $wpdb->posts.ID = sort_score_postmeta.post_id
AND sort_score_postmeta.meta_key = 'client_feedback_score'";
$sql_clauses['orderby'] = 'sort_score_postmeta.meta_value+0 DESC';
return $sql_clauses;
}
$query = new WP_Query($args);