Confrontare meta_query negli argomenti get_posts

13 nov 2014, 13:04:26
Visualizzazioni: 33.7K
Voti: 12

Vorrei escludere alcuni post con un campo personalizzato. Quindi se my_custom_field_ignore è impostato E vale 1 ignora questo post. Se non è impostato, includilo.

Questo è quello che ho:

    $args = array(
        'post_type' => $post_type,
        'offset' => $offset,
        'meta_query' => array(
            array(
                'key' => 'my_custom_field_ignore',
                'value' => '1',
                'compare' => '!=',
            )
        )
    );

Questo funziona solo per i post dove my_custom_field_ignore è impostato a un valore diverso da 1

Come posso includere tutti i post (naturalmente non quelli con my_custom_field_ignore = 1)?

Modifica:

Questo è come funziona su WP 3.5+

    'meta_query' => array(
        array(
            'key' => 'my_custom_field_ignore',
            'compare' => 'NOT EXISTS',
        )
    )

Questa semplice ricerca verifica la presenza di my_custom_field_ignore quindi il valore verrà ignorato. Anche se questo potrebbe funzionare inizialmente, gli utenti potrebbero confondersi quando cambiano 1 in 0 e si aspettano di essere inclusi.

Sembra che le versioni 3.3 e 3.4 necessitino comunque di alcuni controlli condizionali.

Modifica 2

Sembra che la risposta controllata funzioni (almeno per 3.5+). Per qualche strana ragione ignora il primissimo post "Hello World". Dopo aver aggiunto my_custom_field_ignore e averlo rimosso successivamente, funziona

0
Tutte le risposte alla domanda 2
12
11

Se definiamo le condizioni:

A: my_custom_field_ignore ESISTE
B: my_custom_field_ignore = 1

allora NOT ( A && B ) è equivalente a:

NOT ( A ) || NOT ( B )

che nel nostro caso significa:

( my_custom_field_ignore NON ESISTE ) ||  ( my_custom_field_ignore != 1 ) 

Potremmo quindi provare il seguente codice per WP 3.5+ (non testato):

 $args = array(
    'post_type'  => $post_type,
    'offset'     => $offset,
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key'     => 'my_custom_field_ignore',
            'value'   => '1',
            'compare' => '!=',
        ),
        array(
            'key'     => 'my_custom_field_ignore',
            'compare' => 'NOT EXISTS',
            'value'   => '1',     #<-- solo un valore come fix per un bug pre 3.9 (Codex)
        ),
    )
);
13 nov 2014 13:19:08
Commenti

Grazie, controllerò ma dovrebbe funzionare con la versione 3.3+

Xaver Xaver
13 nov 2014 13:20:12

Ho aggiornato la risposta, il NOT EXISTS è supportato solo da WP 3.5+ secondo il Codex.

birgire birgire
13 nov 2014 13:24:34

scusa questo non funziona dalla 3.3 fino alla 4.0

Xaver Xaver
13 nov 2014 14:39:53

Ho appena testato questo su un'installazione pulita di WP 4.0, dove funziona come previsto. Qual è il tuo output? Come appare la query SQL nel tuo caso?

birgire birgire
13 nov 2014 15:05:07

http://pastebin.com/bLSHErMH qual è la tua? (Ho anche 'numberposts => 1' ma immagino che questo non abbia importanza)

Xaver Xaver
13 nov 2014 15:15:13

sì, ho la stessa query SQL, a parte il limite. Hai degli spazi extra nei tuoi valori meta? Non ottieni alcun risultato? Il tuo post type è corretto? Stai testando questo in WP 4.0?

birgire birgire
13 nov 2014 15:31:16

no, passo gli argomenti alla funzione get_posts. Farò alcuni test e ti terrò aggiornato. Nel frattempo, grazie!

Xaver Xaver
13 nov 2014 16:01:41

Ho aggiornato le mie domande con una possibile soluzione ma ha alcune controindicazioni

Xaver Xaver
13 nov 2014 16:17:50

Strano, non sono sicuro del perché non funzioni nel tuo caso. Assicurati che i valori dei meta salvati non abbiano spazi extra. Nella mia installazione pulita di WP 4.0 ho creato 10 post. Poi ne ho aggiornati 3 con il campo personalizzato my_custom_field_ignore, due di loro con il valore 1 e uno solo con il valore 0. Quindi ho eseguito la query sopra con posts_per_page=10 e ho ottenuto 8 post da quella query. I post con i valori del campo personalizzato uguali a 1 sono stati esclusi come previsto.

birgire birgire
13 nov 2014 18:58:08

ok, controllerò di nuovo - forse

Xaver Xaver
13 nov 2014 20:01:56

Il post che non veniva visualizzato era il post "Hello World". Tutto funziona bene se aggiungo il campo my_custom_field_ignore a questo post e poi lo rimuovo. Strana cosa però.

Xaver Xaver
13 nov 2014 20:31:12

è strano ma sono contento che tu sia riuscito a farlo funzionare ;-)

birgire birgire
13 nov 2014 21:15:09
Mostra i restanti 7 commenti
0

devi utilizzare la funzione serialize nel caso in cui stai utilizzando numeri interi:

$args = array(
    'meta_query' => array(
        array(
            'key' => 'my_meta_key',
            'value' => serialize(strval($my_vale)),
            'compare' => 'LIKE'
        )
    )
);
$posts = get_posts( $args );

e sei pronto,

print_r($posts); 

e visualizza i risultati

15 lug 2015 16:51:55