Сортировка ORDER BY по произвольному полю
На основе примера из https://make.wordpress.org/core/2015/03/30/query-improvements-in-wp-4-2-orderby-and-meta_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') );
чтобы получить все записи, где state
равно 'Wisconsin' ИЛИ timezone
равно 'central', отсортированные по population
по убыванию

Вы можете создавать группы meta_queries, применяя к ним определенные операции сравнения, и поскольку вам нужно выполнить сортировку по одному пользовательскому полю, вы можете оставить объявление сортировки посвященным только этому полю. Таким образом:
$q = new WP_Query(
array(
'meta_key' => 'population', //указываем meta_key, который будет использоваться для сортировки
'orderby' => 'meta_value', //если meta_key (population) числовой, используйте meta_value_num вместо этого
'order' => 'DESC', //указываем направление сортировки
'meta_query' => array(
'relation' => 'AND', //указываем отношение между группами запросов
array(
'relation' => 'OR', //указываем отношение внутри этой группы запросов
array(
'key' => 'state',
'value' => 'Wisconsin',
),
array(
'key' => 'timezone',
'value' => 'central',
)
),
array(
'key' => 'city',
'compare' => 'EXISTS', //проверяем существование поля
)
)
)
);

Это можно сделать следующим образом:
$q = new WP_Query( array(
'meta_query' => array(
'relation' => 'AND', // отношение между условиями - И
array(
'relation' => 'OR', // вложенное отношение - ИЛИ
'state_clause' => array(
'key' => 'state', // ключ метаполя
'value' => array( 'Wisconsin' ), // разрешенные значения
'compare' => 'IN' // штат должен быть в массиве выше
),
'state_clause' => array(
'key' => 'timezone', // ключ метаполя
'value' => 'central', // значение
'compare' => '=' // сравнение
),
),
'city_clause' => array(
'key' => 'city', // ключ метаполя
'compare' => 'EXISTS', // проверка на существование
),
),
'orderby' => array(
'city_clause' => 'DESC', // сортировка по убыванию
),
) );

Спасибо @fischi - но у меня есть две проблемы с этим решением: 1) значение 'state_clause' в массиве meta_query перезаписывается - так что остается только последнее объявление ('timezone'), если дампнуть запрос. 2) 'relation' => 'OR' нарушает логику запроса - теперь результат это все посты, так как population
существует во всех случаях (а нам нужны только те, где state
равен 'Wisconsin' или timezone
равен 'central'

Спасибо! повторение 'state_clause' в массиве для ключей state и timezone не сработало - поэтому мне пришлось сделать так, как предложил @Bruno Cantuaria выше. Однако решение Бруно не работало для меня без объявления city_clause и его вызова в 'orderby'. Так что еще раз спасибо
