Ordonare după chei și valori meta multiple
Cum pot seta ordonarea după mai multe chei meta în funcție de valorile meta, poate cineva să-mi dea un exemplu?

meta_query
este un array de clauze meta. De exemplu:
$q = new WP_Query( array(
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'state',
'value' => 'Wisconsin',
),
array(
'key' => 'city',
'compare' => 'EXISTS',
),
),
) );
Puteți folosi un array asociativ, cu o cheie pentru fiecare clauză 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',
),
),
) );
Apoi, puteți folosi acele chei în argumentul order_by
, cu una:
$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', // Rezultatele vor fi ordonate după valorile meta 'city'.
) );
Sau mai multe clauze:
$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',
),
) );
Exemplu preluat din acest articol de pe blogul Make WordPress Core.

nu uita să adaugi tipul cheii/valorii meta. Acest lucru va afecta rezultatele. În mod implicit, WordPress va trata meta-ul ca un șir de caractere.

Dar dacă nu vreau să returnez doar rezultatele unde statul este Wisconsin? Vreau să returnez toate statele și vreau rânduri unde poate exista sau nu un oraș, dar totuși să ordonez după acele 2 câmpuri. De exemplu, fără nicio clauză WHERE - doar un ORDER BY.

Felix, cu aceste cerințe, o soluție ar putea fi să incluzi o clauză finală de 'prindere a tuturor' în meta_query-ul tău și să o pui ultima în instrucțiunea ta orderby. Astfel, primele câteva clauze din meta_query-ul tău ar obține rezultatele specifice pe care vrei să le ordonezi mai întâi. Apoi ultima ta clauză ar fi tot ce nu se potrivește cu clauzele anterioare.

EXISTS
este o metodă excelentă pentru a obține o interogare complexă de metadate denumită, dar în același timp să nu filtrezi după valoare :)
Apropo: am avut un caz real - cererea a fost să ordonăm evenimentele după dată DESC dar timp ASC folosind un singur câmp de dată&timp. Am folosit documentația și acest răspuns pentru a construi asta: https://ideone.com/RUoyZs :-)
