Confrontare meta_query negli argomenti get_posts
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
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)
),
)
);
Ho aggiornato la risposta, il NOT EXISTS è supportato solo da WP 3.5+ secondo il Codex.
birgire
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
http://pastebin.com/bLSHErMH qual è la tua? (Ho anche 'numberposts => 1' ma immagino che questo non abbia importanza)
Xaver
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
no, passo gli argomenti alla funzione get_posts. Farò alcuni test e ti terrò aggiornato. Nel frattempo, grazie!
Xaver
Ho aggiornato le mie domande con una possibile soluzione ma ha alcune controindicazioni
Xaver
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
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
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