2008-08-26 19 views
6

Dies ist eine sehr spezifische Frage bezüglich mysql wie in WordPress implementiert.So wählen Sie Beiträge mit bestimmten Tags/Kategorien in WordPress

Ich versuche, ein Plugin zu entwickeln, die Beiträge zeigen (Auswahl), die spezifische haben ‚Tags‘ und gehören zu spezifischen ‚Kategorien‘ (beide mehrfach)

Mir wurde gesagt, es ist unmöglich, weil die Art und Weise Kategorien und Tags gespeichert sind:

  1. wp_posts eine Liste der Post enthält, haben jeweils Beiträge eine „ID“
  2. wp_terms enthält eine Liste von Begriffen (beide Kategorie s und Tags). Eac Begriff hat ein TERM_ID
  3. wp_term_taxonomy eine Liste von Begriffen mit ihrer TERM_IDs hat und eine Taxonomie Definition für jeden von denen (entweder eine Kategorie oder einen Tag)
  4. wp_term_relationships haben Verbände betweens Begriffe und Beiträge

Wie kann ich an den Tabellen teilnehmen, um alle Beiträge mit den Tags "Nuclear" und "Deals" zu erhalten, die ebenfalls zur Kategorie "Category1" gehören?

Antwort

3

Ich habe dich missverstanden. Ich dachte du wolltest Nuclear oder Deals. Das Folgende sollte Ihnen nur Nuclear und Deals geben.

select p.* 
from wp_posts p, wp_terms t, wp_term_taxonomy tt, wp_term_relationship tr, 
wp_terms t2, wp_term_taxonomy tt2, wp_term_relationship tr2 
wp_terms t2, wp_term_taxonomy tt2, wp_term_relationship tr2 

where p.id = tr.object_id and t.term_id = tt.term_id and tr.term_taxonomy_id = tt.term_taxonomy_id 

and p.id = tr2.object_id and t2.term_id = tt2.term_id and tr2.term_taxonomy_id = tt2.term_taxonomy_id 

and p.id = tr3.object_id and t3.term_id = tt3.term_id and tr3.term_taxonomy_id = tt3.term_taxonomy_id 

and (tt.taxonomy = 'category' and tt.term_id = t.term_id and t.name = 'Category1') 
and (tt2.taxonomy = 'post_tag' and tt2.term_id = t2.term_id and t2.name = 'Nuclear') 
and (tt3.taxonomy = 'post_tag' and tt3.term_id = t3.term_id and t3.name = 'Deals') 
2

Was für eine grobe DB-Struktur.

Wie auch immer, ich würde so etwas tun (ich bevorzuge EXISTS zu Joins, aber Sie können sie als Joins umschreiben, wenn Sie möchten; die meisten Abfrageanalysatoren werden sie sowieso auf den gleichen Abfrageplan reduzieren). Sie können einige zusätzliche Jonglieren eine Möglichkeit zu tun haben, oder eine andere, damit es funktioniert ...

SELECT * 
    FROM wp_posts p 
WHERE EXISTS(SELECT * 
       FROM wp_term_relationship tr 
       WHERE tr.object_id = p.id 
        AND EXISTS(SELECT * 
           FROM wp_term_taxonomy tt 
           WHERE tt.term_taxonomy_id = tr.term_taxonomy_id 
           AND tt.taxonomy   = 'category' 
           AND EXISTS(SELECT * 
               FROM wp_terms t 
               WHERE t.term_id = tt.term_id 
               AND t.name = "Category1" 
              ) 
          ) 
        AND EXISTS(SELECT * 
           FROM wp_term_taxonomy tt 
           WHERE tt.term_taxonomy_id = tr.term_taxonomy_id 
           AND tt.taxonomy   = 'post_tag' 
           AND EXISTS(SELECT * 
               FROM wp_terms t 
               WHERE t.term_id = tt.term_id 
               AND t.name = "Nuclear" 
              ) 
           AND EXISTS(SELECT * 
               FROM wp_terms t 
               WHERE t.term_id = tt.term_id 
               AND t.name = "Deals" 
              ) 
          ) 
      ) 
1

Try this:

select p.* 
from wp_posts p, 
wp_terms t, wp_term_taxonomy tt, wp_term_relationship tr 
wp_terms t2, wp_term_taxonomy tt2, wp_term_relationship tr2 

where p.id = tr.object_id 
and t.term_id = tt.term_id 
and tr.term_taxonomy_id = tt.term_taxonomy_id 

and p.id = tr2.object_id 
and t2.term_id = tt2.term_id 
and tr2.term_taxonomy_id = tt2.term_taxonomy_id 

and (tt.taxonomy = 'category' and tt.term_id = t.term_id and t.name = 'Category1') 
and (tt2.taxonomy = 'post_tag' and tt2.term_id = t2.term_id and t2.name in ('Nuclear', 'Deals')) 

Ich Verwendung von 2 Kopien der betreffenden Kind Tabellen Im Wesentlichen - Begriffe , term_taxonomy und term_relationship. Eine Kopie gilt für die Beschränkung "Kategorie 1", die andere für die Beschränkung "Nuklear" oder "Deals".

BTW, was für ein Projekt ist das mit Posts alles über nukleare Angebote? Sie versuchen uns auf eine Regierungsliste zu bringen? ;)

1

Also habe ich beide Optionen auf meiner WordPress db ausprobiert. In meinen Beiträgen habe ich mit den Tags "Perl" UND "Programming" nach der Kategorie "Tech" gesucht.

Eric's funktionierte, sobald ich ein fehlendes Komma in der ersten Select-Anweisung hinzugefügt. Es gab 3 Datensätze zurück. Das Problem ist, dass der Abschnitt, der nach "post_tag" sucht, tatsächlich als OR-Option funktioniert. Einer meiner Beiträge hatte nur einen Tag, nicht beide. Es wäre auch gut, SELECT DISTINCT zu machen.

Ich versuchte Matt's Version, aber es wurde immer eine leere Menge zurückgegeben. Ich könnte versuchen, damit zu "jonglieren".

0

Danke @Eric es funktioniert!Nur ein paar Code-Korrekturen für die Zukunft:

  • den ersten select-Anweisungen verpasst eine Koma nach wp_term_relationship TR2
  • Im gleichen wählen statemt muss folgendes ändern sein:
wp_terms t2, wp_term_taxonomy tt2, wp_term_relationship 

tr2

sollte

wp_terms t3, wp_term_taxonomy tt3, wp_term_relationship 

tr3
0

Wirklich so große Antwort .. hat mir sehr geholfen ..

große bcoz., Gab es mir grundlegende Ansatz zum Erstellen meiner komplexen Abfrage!

eine kleine Korrektur, für bereit User wie mich :)

„wp_term_relationship“ geben ‚existiert nicht Fehler‘ .. verwenden wp_term_relationships wie es die richtige Tabellenname ist.

Dank Eric

Verwandte Themen