Ordinare per chiavi meta multiple e valori meta
meta_query
è un array di clausole meta. Ad esempio:
$q = new WP_Query( array(
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'state',
'value' => 'Wisconsin',
),
array(
'key' => 'city',
'compare' => 'EXISTS',
),
),
) );
Puoi utilizzare un array associativo, con una chiave per ogni clausola meta:
$q = new WP_Query( array(
'meta_query' => array(
'relation' => 'AND',
'state_clause' => array(
'key' => 'state',
'value' => 'Wisconsin',
),
'city_clause' => array(
'key' => 'city',
'compare' => 'EXISTS',
),
),
) );
Successivamente, puoi utilizzare queste chiavi nell'argomento order_by
, con una sola:
$q = new WP_Query( array(
'meta_query' => array(
'relation' => 'AND',
'state_clause' => array(
'key' => 'state',
'value' => 'Wisconsin',
),
'city_clause' => array(
'key' => 'city',
'compare' => 'EXISTS',
),
),
'orderby' => 'city_clause', // I risultati saranno ordinati in base ai valori meta 'city'
) );
O più clausole:
$q = new WP_Query( array(
'meta_query' => array(
'relation' => 'AND',
'state_clause' => array(
'key' => 'state',
'value' => 'Wisconsin',
),
'city_clause' => array(
'key' => 'city',
'compare' => 'EXISTS',
),
),
'orderby' => array(
'city_clause' => 'ASC',
'state_clause' => 'DESC',
),
) );
Esempio tratto da questo articolo nel blog Make WordPress Core.

non dimenticare di aggiungere il tipo della meta chiave/valore. influenzerà i risultati. Di default WordPress tratterà il tuo meta come una stringa.

Ma cosa succede se non voglio restituire solo i risultati dove lo stato è Wisconsin? Voglio che vengano restituiti tutti gli stati e voglio righe dove potrebbe esserci o meno una città, ordinando comunque quei due campi. Ad esempio, nessuna clausola WHERE - solo un ORDER BY.

Felix, con quei requisiti una soluzione alternativa potrebbe essere includere una clausola finale "prendi tutto" nel tuo meta_query, e metterla per ultima nella tua istruzione orderby. Quindi le prime clausole nel tuo meta_query otterrebbero i risultati specifici che vuoi ordinare per primi. Poi la tua ultima clausola sarebbe tutto ciò che non è nelle tue clausole precedenti.

EXISTS
è un ottimo modo per ottenere una meta query complessa con nome ma allo stesso tempo non filtrare per il valore :)
Tra l'altro: ho avuto un caso d'uso reale - la richiesta era di ordinare gli eventi per data DESC ma per ora ASC utilizzando un unico campo data&ora Ho usato la documentazione e questa risposta per costruire questo: https://ideone.com/RUoyZs :-)
