WP_Query avanzata con meta_query e orderby
Mi chiedevo se qualcuno potesse aiutarmi con questa query un po' complessa con ACF.
Ho quanto segue che dovrebbe visualizzare:
Pagine,
Articoli News,
Articoli About e
Articoli Involved.
Mostrare: solo 4.
Visualizzare solo se: la Chiave Meta ACF 'home_page' è selezionata come 'yes'
E
Ordinare per il valore numerico della Chiave Meta ACF 'home_order' ovvero 1,2,3 primo, secondo, terzo ecc
$args = array(
// Array dei tipi di post da visualizzare
'post_type' => array( 'page', 'news-articles', 'about-articles','involved-articles' ),
'showposts' => 4,
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'home_page',
'value' => 'yes',
'compare' => 'IN',
),
array(
'orderby' => 'meta_value_num',
'meta_key' => 'home_order',
),
),
);
Penso ci sia qualcosa che non va con 'compare' e 'relation'

Dovresti davvero leggere la documentazione sulle meta_query
Ecco cosa è permesso in una meta_query
key (string) - Chiave del campo personalizzato.
value (string|array) - Valore del campo personalizzato. Può essere un array solo quando compare è
'IN'
,'NOT IN'
,'BETWEEN'
o'NOT BETWEEN'
. Non è necessario specificare un valore quando si utilizzano i confronti'EXISTS'
o'NOT EXISTS'
in WordPress 3.9 e versioni successive.(Nota: A causa del bug #23268, value è richiesto per i confronti
NOT EXISTS
per funzionare correttamente prima della versione 3.9. Devi fornire una stringa per il parametro value. Una stringa vuota oNULL
NON funzionerà. Tuttavia, qualsiasi altra stringa andrà bene e NON apparirà nel tuo SQL quando usiNOT EXISTS
. Hai bisogno di ispirazione? Che ne dici di 'bug #23268'.)compare (string) - Operatore di confronto. Valori possibili sono
'='
,'!='
,'>'
,'>='
,'<'
,'<='
,'LIKE'
,'NOT LIKE'
,'IN'
,'NOT IN'
,'BETWEEN'
,'NOT BETWEEN'
,'EXISTS'
e'NOT EXISTS'
. Il valore predefinito è'='
.type (string) - Tipo di campo personalizzato. Valori possibili sono
'NUMERIC'
,'BINARY'
,'CHAR'
,'DATE'
,'DATETIME'
,'DECIMAL'
,'SIGNED'
,'TIME'
,'UNSIGNED'
. Il valore predefinito è'CHAR'
.
L'ordinamento deve avvenire al di fuori della tua meta_query
. Puoi provare quanto segue
$args = [
'post_type' => ['page', 'news-articles', 'about-articles', 'involved-articles'],
'posts_per_page' => 4,
'meta_key' => 'home_order',
'orderby' => 'meta_value_num',
'meta_query' => [
[
'key' => 'home_page',
'value' => 'yes',
]
],
];
Note aggiuntive:
A partire da PHP 5.4 puoi usare la sintassi abbreviata per gli array, cioè puoi usare
[]
invece diarray()
. Se stai ancora utilizzando una versione precedente a PHP 5.6, dovresti seriamente considerare di aggiornare.showposts
è stato sostituito daposts_per_page
, quindi è meglio usareposts_per_page

@birgire grazie, sì, è stato un errore di copia e incolla veloce ;-)

$args = array(
'posts_per_page' => 4,
'post_type' => array( 'page', 'news-articles', 'about-gorilla','involved' ),
'orderby' => 'meta_value_num',
'meta_key' => 'home_order',
'order' => 'ASC',
'meta_query' => array(
array(
'key' => 'home_page',
'value' => 'yes',
'compare' => '=',
),
),
);
