WP_Query - Ordinare i risultati per valore meta

4 ott 2011, 18:10:50
Visualizzazioni: 202K
Voti: 79

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'
);
0
Tutte le risposte alla domanda 3
12
100

orderby dovrebbe essere meta_value_num o meta_value, non il nome della chiave. Consulta i parametri orderby di WP_Query.

4 ott 2011 18:25:38
Commenti

Ha funzionato alla perfezione, grazie amico.

Adam Moss Adam Moss
4 ott 2011 18:41:05

Grazie! Sei il mio salvatempo! Da nessuna parte su WPCodex viene menzionato 'meta_value_num'.

BasTaller BasTaller
21 giu 2012 17:04:10

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

adamj adamj
2 dic 2015 04:46:50

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

RobBenz RobBenz
25 apr 2017 19:50:22

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

Milo Milo
25 apr 2017 19:52:22

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 RobBenz
25 apr 2017 19:58:42

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

RobBenz RobBenz
25 apr 2017 20:02:38

@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 Milo
25 apr 2017 20:09:38

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

RobBenz RobBenz
25 apr 2017 21:07:50

@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 Milo
25 apr 2017 21:21:47

@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 unbreak
22 feb 2018 09:46:45

@unbreak la soluzione semplice è analizzare tutti i post e aggiungere loro la meta_key prima di eseguire la query di ordinamento

adamj adamj
23 feb 2018 11:21:18
Mostra i restanti 7 commenti
0
11

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'
);
13 nov 2020 00:09:13
0

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);
24 mag 2024 19:00:49