Ordinare per valore di un campo personalizzato
Basato sull'esempio qui https://make.wordpress.org/core/2015/03/30/query-improvements-in-wp-4-2-orderby-and-meta_query/
Vorrei modificare la query
$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') );
per ottenere tutti i post dove state
è 'Wisconsin' OPPURE timezone
è 'central' ORDINATI PER population
in ordine DECRESCENTE

Puoi creare gruppi di meta_queries utilizzando specifiche operazioni di confronto su di essi, e dal momento che vuoi ordinare basandoti su un singolo custom field, puoi mantenere la dichiarazione di ordinamento dedicata al singolo campo meta. Quindi:
$q = new WP_Query(
array(
'meta_key' => 'population', //impostando il meta_key che verrà usato per l'ordinamento
'orderby' => 'meta_value', //se il meta_key (population) è numerico usa meta_value_num invece
'order' => 'DESC', //impostando la direzione dell'ordinamento
'meta_query' => array(
'relation' => 'AND', //impostando la relazione tra i gruppi di query
array(
'relation' => 'OR', //impostando la relazione tra questa query interna
array(
'key' => 'state',
'value' => 'Wisconsin',
),
array(
'key' => 'timezone',
'value' => 'central',
)
),
array(
'key' => 'city',
'compare' => 'EXISTS',
)
)
)
);

Questo si farebbe in questo modo:
$q = new WP_Query( array(
'meta_query' => array(
'relation' => 'AND',
array(
'relation' => 'OR',
'state_clause' => array(
'key' => 'state',
'value' => array( 'Wisconsin' ), //valori ammessi
'compare' => 'IN' // lo state deve essere nell'array sopra
),
'state_clause' => array(
'key' => 'timezone',
'value' => 'central',
'compare' => '='
),
),
'city_clause' => array(
'key' => 'city',
'compare' => 'EXISTS',
),
),
'orderby' => array(
'city_clause' => 'DESC',
),
) );

Grazie @fischi - ma ho due problemi con quella soluzione: 1) il valore di 'state_clause' nell'array meta_query viene sovrascritto - quindi rimane solo l'ultima dichiarazione ('timezone') se si effettua il dump della query. 2) la 'relation' => 'OR' rovina la logica della query - ora il risultato sono tutti i post poiché population
esiste in tutti i casi (e noi vogliamo solo quelli dove state
è 'Wisconsin' o timezone
è 'central'

Grazie! Ripetere 'state_clause' nell'array per le chiavi state e timezone non avrebbe funzionato - quindi ho dovuto fare come suggerito da @Bruno Cantuaria sopra. Tuttavia, la soluzione di Bruno non ha funzionato per me senza dichiarare city_clause e richiamarlo in 'orderby'. Quindi grazie ancora
