Ordonare după valoarea unui câmp personalizat
Bazat pe exemplul de aici https://make.wordpress.org/core/2015/03/30/query-improvements-in-wp-4-2-orderby-and-meta_query/
Aș dori să modific interogarea
$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') );
pentru a putea obține toate postările unde state
este 'Wisconsin' SAU timezone
este 'central' ORDONATE DUPĂ population
DESCRESCĂTOR

Puteți crea grupuri de meta_queries folosind operații specifice de comparare asupra lor, iar deoarece doriți să ordonați în funcție de un singur câmp personalizat, puteți păstra declarația de ordonare dedicată acelui singur câmp meta. Astfel:
$q = new WP_Query(
array(
'meta_key' => 'population', //setează meta_key care va fi folosit pentru ordonare
'orderby' => 'meta_value', //dacă meta_key (population) este numeric, folosește meta_value_num în schimb
'order' => 'DESC', //setează direcția de ordonare
'meta_query' => array(
'relation' => 'AND', //setează relația între grupurile de interogări
array(
'relation' => 'OR', //setează relația pentru această interogare internă
array(
'key' => 'state',
'value' => 'Wisconsin',
),
array(
'key' => 'timezone',
'value' => 'central',
)
),
array(
'key' => 'city',
'compare' => 'EXISTS',
)
)
)
);

Acest lucru s-ar face astfel:
$q = new WP_Query( array(
'meta_query' => array(
'relation' => 'AND',
array(
'relation' => 'OR',
'state_clause' => array(
'key' => 'state',
'value' => array( 'Wisconsin' ), //valori permise
'compare' => 'IN' // statul trebuie să fie în array-ul de mai sus
),
'state_clause' => array(
'key' => 'timezone',
'value' => 'central',
'compare' => '='
),
),
'city_clause' => array(
'key' => 'city',
'compare' => 'EXISTS',
),
),
'orderby' => array(
'city_clause' => 'DESC',
),
) );

Mulțumesc @fischi - dar am două probleme cu această soluție: 1) valoarea 'state_clause' din tabloul meta_query este suprascrisă - deci doar ultima declarație rămâne ('timezone') dacă efectiv afișezi interogarea. 2) 'relation' => 'OR' distruge logica interogării - acum rezultatul sunt toate postările, deoarece population
există în toate cazurile (și noi vrem doar cele unde state
este 'Wisconsin' sau timezone
este 'central'

Mulțumesc! repetarea 'state_clause' în tablou pentru cheile state și timezone nu ar funcționa - așa că a trebuit să o fac cum a sugerat @Bruno Cantuaria mai sus. Cu toate acestea, soluția lui Bruno nu a funcționat pentru mine fără a declara city_clause și fără a o apela în 'orderby'. Deci mulțumesc din nou
