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

Piccola nota, se il meta_key
non esiste ancora per il post, il post verrà ignorato.

meta_value_num
è un meta personalizzato che puoi assegnare ai post type? Ho bisogno di poter modificare questo valore per ogni post.

@RobBenz Vedi Campi Personalizzati per imparare i meta dei post.

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

oppure meta_value_num
prende semplicemente il valore di qualsiasi 'meta_key' => 'search_order' sia basato sul post

@RobBenz meta_value_num
sta dicendo a WP di ordinare i risultati in base a un valore meta numerico. Non è il nome della chiave.

come posso modificare meta_value_num
in modo che un particolare post compaia più in alto nei risultati di ricerca

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

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

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);
