query_posts() sul valore di una chiave o sulla sua esistenza
Recentemente ho iniziato a utilizzare Simple Fields in un progetto per differenziare i tipi di post. D'ora in poi tutti i post avranno uno dei quattro possibili valori meta associati (Storia, Articolo, Video o Cartone). Nessuno di questi tipi di post ha attributi o valori unici, quindi ho deciso di non utilizzare i custom post type questa volta.
Sono consapevole di come interrogare i post con un certo valore meta, ma questo funziona solo per i post che hanno già quella chiave meta associata - non per i post creati prima dell'installazione del plugin Simple Fields e messi in uso. Mi chiedo come potrei interrogare tutti i post che mancano della chiave meta "fizzbuzz" o che hanno la chiave ma è associata a un valore di "foobar".
Esiste un modo per interrogare tutti i post che mancano completamente di una chiave?
Questo ti darà tutto ciò che non ha la meta chiave fizzbizz. La parte del custom loop, l'ho presa direttamente dal codex.
$pageposts = $wpdb->get_results("
SELECT * FROM wp_posts p
LEFT JOIN wp_postmeta m
ON p.ID = m.post_id
WHERE m.meta_key <> 'fizzbizz'
OR m.metakey IS NULL
ORDER BY p.post_date DESC;
");
if ($pageposts):
global $post;
foreach ($pageposts as $post):
setup_postdata($post);
// ora sei nel loop, usa the_title() o qualsiasi altra funzione
Questo ti darà tutto dove c'è la chiave, ma il valore è 'foobar'
$pageposts = $wpdb->get_results("
SELECT * FROM wp_posts p
JOIN wp_postmeta m
ON p.ID = m.post_id
WHERE m.meta_key = 'fizzbizz'
AND m.meta_value = 'foobar'
ORDER BY p.post_date DESC;
");
e quest'ultimo è complicato, non sono così sicuro su quello...
Modifica
Prima query corretta grazie a questa domanda.
La seconda query dovrebbe funzionare, ma puoi fare la stessa cosa meglio utilizzando le funzioni dell'API di WP. La prima query a me non sembra funzionare. Sembra che otterrà solo i post che hanno meta key impostate (perché altrimenti, non sarebbero inclusi nel JOIN.)
goldenapples
@golden Ottima osservazione sulla prima. Immagino che per scrivere quella correttamente, ci dovrebbe prima essere un modo per interrogare i post che non hanno alcuna chiave. Hai qualche idea su questo?
JakeParis
Fantastico! Non avevo mai capito il LEFT JOIN, quindi non avevo idea di come farlo (e credimi, ne ho avuto bisogno!) Ora l'unica cosa da fare è capire come usare quella sintassi all'interno dei metodi dell'API di WP. Ad esempio, la seconda query potrebbe essere scritta semplicemente come get_posts('meta_key=fizzbizz&meta_value=foobar'); Penso che per interrogare l'assenza di una meta key siano necessari filtri speciali su 'posts_join' e 'posts_where'... qualcuno ha una soluzione semplice?
goldenapples