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 EXISTSper funzionare correttamente prima della versione 3.9. Devi fornire una stringa per il parametro value. Una stringa vuota oNULLNON 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 ;-)
Pieter Goosen
$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' => '=',
),
),
);