query_posts() pe valoarea cheii sau existența acesteia

7 ian. 2011, 05:35:57
Vizualizări: 752
Voturi: 1

Am început recent să folosesc simple fields într-un proiect pentru a diferenția între tipurile de postări. Toate postările de acum înainte vor avea una dintre cele patru valori meta posibile asociate (Story, Article, Video sau Cartoon). Niciunul dintre aceste tipuri de postări nu are atribute sau valori unice, așa că am decis să nu folosesc tipuri de postări personalizate de data aceasta.

Știu cum să interoghez postări cu o anumită valoare meta, dar acest lucru funcționează doar pentru postările care au deja asociată acea cheie meta - nu și pentru postările create înainte de instalarea și utilizarea plugin-ului simple fields. Sunt curios cum aș putea interoga toate postările care fie nu au cheia meta "fizzbuzz", fie au cheia dar aceasta este asociată cu valoarea "foobar".

Există o modalitate de a interoga toate postările care nu au deloc o anumită cheie?

0
Toate răspunsurile la întrebare 1
5

Aceasta va obține tot ce nu are cheia meta fizzbizz. Partea de buclă personalizată, am preluat-o direct din 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);
// acum ești în buclă, folosește the_title() sau orice altceva

Aceasta va obține tot ce are cheia, dar valoarea este '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;
");

iar ultima este complicată, nu sunt atât de sigur pe aceasta...

Editare

Am corectat prima interogare datorită acestei întrebări.

7 ian. 2011 05:51:49
Comentarii

A doua interogare ar trebui să funcționeze, dar poți face același lucru mai bine folosind funcțiile din WP API. Prima interogare nu mi se pare că funcționează. Se pare că va obține doar postările care au setate chei meta (pentru că altfel, nu ar fi incluse în JOIN.)

goldenapples goldenapples
7 ian. 2011 09:50:46

@golden Bună observație la prima. Cred că pentru a scrie corect acea interogare, ar trebui mai întâi o modalitate de a interoga postările care lipsesc orice cheie. Ai vreo idee pentru aceasta?

JakeParis JakeParis
7 ian. 2011 17:41:18

@golden am rezolvat prima interogare.

JakeParis JakeParis
7 ian. 2011 19:11:28

Super! Nu am reușit niciodată să înțeleg LEFT JOIN, așa că nu aveam idee cum să fac asta (și crede-mă, am avut nevoie!) Acum singurul lucru rămas este să înțeleg cum să folosesc această sintaxă în cadrul metodelor WP API. Adică, a doua interogare ar putea fi scrisă simplu ca get_posts('meta_key=fizzbizz&meta_value=foobar'); Cred că interogarea pentru absența unei chei meta necesită filtre speciale pe 'posts_join' și 'posts_where'... are cineva o soluție simplă?

goldenapples goldenapples
7 ian. 2011 20:09:46

Cred că ai nevoie și de o clauză DISTINCT în SELECT dacă o faci așa, altfel vei obține un anumit post de mai multe ori dacă are mai multe valori meta.

goldenapples goldenapples
7 ian. 2011 20:34:01