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.

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?

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

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?

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

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

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.

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ò.

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
