WP_Query avanzata con meta_query e orderby

4 feb 2016, 23:03:25
Visualizzazioni: 30.9K
Voti: 2

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'

0
Tutte le risposte alla domanda 2
2

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 o NULL NON funzionerà. Tuttavia, qualsiasi altra stringa andrà bene e NON apparirà nel tuo SQL quando usi NOT 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 di array(). Se stai ancora utilizzando una versione precedente a PHP 5.6, dovresti seriamente considerare di aggiornare.

  • showposts è stato sostituito da posts_per_page, quindi è meglio usare posts_per_page

5 feb 2016 06:36:14
Commenti

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

Pieter Goosen Pieter Goosen
5 feb 2016 08:46:44

Sì, ho letto tutto ma non sono riuscito a capirlo completamente per metterlo nell'ordine corretto. Alla fine ho risolto con l'aiuto di un'altra fonte usando quanto segue..

user4630 user4630
5 feb 2016 11:52:48
1
$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'   => '=',
                    ),
                ),
            );
5 feb 2016 11:53:32
Commenti

Per favore non postare codice come risposta senza spiegazioni, aggiungi qualche dettaglio, grazie. Ma questo sembra quasi identico alla risposta di @PieterGoosen, a parte l'ordinamento. Nota che compare è = di default

birgire birgire
5 feb 2016 11:59:02