Ordenar por valor de campo personalizado
Basado en el ejemplo de https://make.wordpress.org/core/2015/03/30/query-improvements-in-wp-4-2-orderby-and-meta_query/
Me gustaría modificar la consulta
$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') );
para poder obtener todos los posts donde state
sea 'Wisconsin' O timezone
sea 'central' ORDENADOS POR population
DESC

Puedes crear grupos de meta_queries utilizando operaciones de comparación específicas en ellos, y como quieres ordenar basado en un solo campo personalizado, puedes mantener la declaración de orden dedicada a ese único meta campo. Entonces:
$q = new WP_Query(
array(
'meta_key' => 'poblacion', //estableciendo el meta_key que se usará para ordenar
'orderby' => 'meta_value', //si el meta_key (poblacion) es numérico usa meta_value_num en su lugar
'order' => 'DESC', //estableciendo la dirección del orden
'meta_query' => array(
'relation' => 'AND', //estableciendo la relación entre grupos de queries
array(
'relation' => 'OR', //estableciendo la relación para esta query interna
array(
'key' => 'estado',
'value' => 'Wisconsin',
),
array(
'key' => 'zona_horaria',
'value' => 'central',
)
),
array(
'key' => 'ciudad',
'compare' => 'EXISTS',
)
)
)
);

Esto se haría de la siguiente manera:
$q = new WP_Query( array(
'meta_query' => array(
'relation' => 'AND',
array(
'relation' => 'OR',
'state_clause' => array(
'key' => 'state',
'value' => array( 'Wisconsin' ), //valores permitidos
'compare' => 'IN' // el estado debe estar en el array anterior
),
'state_clause' => array(
'key' => 'timezone',
'value' => 'central',
'compare' => '='
),
),
'city_clause' => array(
'key' => 'city',
'compare' => 'EXISTS', // compara si existe
),
),
'orderby' => array(
'city_clause' => 'DESC', // orden descendente
),
) );

Gracias @fischi - pero tengo dos problemas con esa solución: 1) el valor de 'state_clause' en el array meta_query se sobrescribe - así que solo la última declaración permanece ('timezone') si haces un dump de la consulta. 2) la 'relation' => 'OR' arruina la lógica de la consulta - ahora el resultado son todos los posts ya que population
existe en todos los casos (y solo queremos los que tienen state
como 'Wisconsin' o timezone
como 'central'

¡Gracias! repetir 'state_clause' en el array para las claves state y timezone no funcionaría - así que necesité hacerlo como @Bruno Cantuaria sugirió arriba. Sin embargo, la solución de Bruno no funcionó para mí sin declarar city_clause y llamarlo en 'orderby'. Así que gracias de nuevo
