Interroga tutti i post in cui non esiste una meta chiave


50

Sto cercando di ottenere una query per recuperare tutti i post in cui meta_keynon esiste uno specifico e quindi crearlo.

Sto riscontrando problemi nel trovare quei post poiché la query che sto testando non sembra funzionare.

Ecco il codice che sto usando per cercare di ottenere quei messaggi:

$args = array(
   'posts_per_page' => 18,
   'cat'=>1955,
   'post_status'=>'publish',
   'meta_query' => array(
                  array(
                     'key' => 'colors',
                     'compare' => 'NOT EXISTS'
                  ),
   ));      

query_posts($args);

Questo non restituisce nulla se non ci sono post con la chiave colors, ma restituisce idsi post con la chiave colorsogni volta che quella chiave è presente (l'opposto di quello che mi serve). Ho provato con EXISTinvece ma senza fortuna.

Se qualcuno può darmi consigli sul modo corretto di creare una query come quella di cui ho bisogno, lo apprezzerò.

Grazie!


Quale versione di WordPress stai usando?
s_ha_dum,

Ciao, scusa per l'omissione. Sto usando v3.5
JordanBel

Sembra che quel tipo di query (con il confronto impostato su NOT EXISTS) sia stato aggiunto in 3.5, quindi dovrebbe funzionare così com'è, per quanto posso vedere. Sarebbe facile farlo tramite una query SELECT personalizzata, però ...
Tomas Buteler,

Grazie proverò ad usare select. Devo imparare prima quali tabelle interrogare e come conformare la query però :(
JordanBel

Molto strano. Non riesco a individuare un problema con quel codice e stai usando 3.5+, motivo per cui ho chiesto. Hai effettivamente guardato il database per confermare che i tuoi dati sono stati inseriti come pensi che siano?
s_ha_dum,

Risposte:


73

Ho fatto qualche altro test con questo, e onestamente non riesco a trovare un motivo per cui non funzionerebbe (a meno che il codice sopra non sia solo uno snippet e il codice reale si adatti ai miei esempi di seguito). Tuttavia, ho scoperto un paio di cose che potrebbero condurti nella giusta direzione.

1) Di per sé, questa meta query è l'equivalente di "colors IS NULL", ovvero restituirà i post che non hanno quella chiave impostata nella tabella postmeta. Questo è il caso mostrato sopra e avrebbe dovuto funzionare.

'meta_query' => array(
    array(
     'key' => 'colors',
     'compare' => 'NOT EXISTS' // this should work...
    ),
)

2) Prima di WordPress 3.9, stabilire l'indice "relazione" con "OR" modifica questa condizione. Restituisce il contrario. Non chiedermi perché. Ciò è particolarmente importante quando si eseguono più meta query. Ciò significa che inizialmente non è possibile eseguire una query per i post che hanno la chiave "colors" impostata su "blue" (o qualsiasi altra cosa) o non impostata affatto. La query seguente ignorerà la prima condizione e restituirà solo quelli che corrispondono alla seconda condizione.

'meta_query' => array(
   'relation' => 'OR',
    array(
     'key' => 'colors',
     'compare' => 'NOT EXISTS' // doesn't work
    ),
    array(
     'key' => 'colors',
     'value' => 'blue'
    )
)

3) Tuttavia, possiamo indurre WordPress a utilizzare la prima condizione se impostiamo il 'valore'. Non ha bisogno di un valore rilevante (è ignorato, per quanto ne so), ma deve essere impostato affinché la NOT EXISTScondizione abbia effetto.

'meta_query' => array(
   'relation' => 'OR',
    array(
     'key' => 'colors',
     'compare' => 'NOT EXISTS', // works!
     'value' => '' // This is ignored, but is necessary...
    ),
    array(
     'key' => 'colors',
     'value' => 'blue'
    )
)

Questo era vero fino a WordPress 3.9. Se stai ancora utilizzando una versione precedente, questa è una soluzione alternativa possibile.


Grazie! E scusa per il ritardo. Ho finito per usare una query, ma testerò la tua soluzione nelle ore seguenti in modo da poter tornare indietro e forse se questo lavoro potremo aiutare qualcun altro. Ti farò sapere non appena posso verificarlo. Grazie ancora
Jordan Bel

Ben scritto e confermato che l'aggiunta di un valore vuoto restituisce i risultati previsti. Direi che è involontario, potrebbe valere la pena di dare un'occhiata a trac.wordpress.org per vedere se c'è già un biglietto, in caso contrario, questo è riproducibile.
Taylor Dewey,

Grazie per l'ottima spiegazione e la soluzione per ingannare WP :) Ci è voluto del tempo per arrivare qui - ma ora voglio fare clic su vota per almeno 10 volte (se solo potessi;))
lorem monkey

Se uso comparare EXISTS, sfortunatamente il valore non viene ignorato nelle nuove versioni di WP (testato in 4.2.2)
Igor Jerosimić,

10
L' EXISTSe NOT EXISTS"bug", che ha richiesto di specificare un valore, è stato fissato in WP 3.9
trex005

11

Utilizzando una query personalizzata, questo ha funzionato per me:

SELECT * FROM wp_posts as posts
            WHERE   posts.post_type     = 'post'
            AND NOT EXISTS (
              SELECT * FROM `wp_postmeta`
               WHERE `wp_postmeta`.`meta_key` = "your_meta_key"
                AND `wp_postmeta`.`post_id`=posts.ID
            ) 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.