Filtern Sie Beiträge in einer Abfrage, wenn sie nur ein bestimmtes Tag haben

Lesezeit: 4 Minuten

Das Abfragen von WordPress-Posts nach ihren Tags kann so aussehen (wenn ich es richtig zusammengesetzt habe – ich habe irrelevante Teile aus der Abfrage entfernt):

SELECT wposts.ID AS ID,
wposts.post_title, wposts.post_status, wposts.post_name,
tag_terms.term_id AS tag_id

FROM `wp_posts` AS wposts

INNER JOIN wp_term_relationships AS tag_term_relationships ON (wposts.ID = tag_term_relationships.object_id)
INNER JOIN wp_term_taxonomy AS tag_term_taxonomy ON (tag_term_relationships.term_taxonomy_id = tag_term_taxonomy.term_taxonomy_id AND tag_term_taxonomy.taxonomy = 'post_tag')
INNER JOIN wp_terms AS tag_terms ON (tag_term_taxonomy.term_id = tag_terms.term_id)

WHERE wposts.ID = '12345'

AND wposts.post_type="post"

AND wposts.post_status NOT LIKE 'private'

AND tag_terms.term_id = '55'

GROUP BY wposts.ID
ORDER BY wposts.post_date ASC

Dies sollte alle Beiträge mit der Tag-ID 55 abfragen.

Was ich tun muss, ist, alle Posts herauszufiltern, die nur dieses eine Tag, aber keine anderen Tags enthalten.

Ich möchte also einen Beitrag anzeigen, wenn er die Tags 23,34,55,67 hat. Ich möchte den Beitrag jedoch nicht anzeigen, wenn er das Tag 55 (und keine anderen Tags) hat. Beiträge, die dieses bestimmte Tag nicht enthalten, sollten ebenfalls in die Abfrage einbezogen werden.

Wie mache ich das?

  • du machst es falsch. Sie sollten Beiträge immer mit der Klasse WP_query auswählen: codex.wordpress.org/Class_Reference/WP_Query

    – jaw

    12. Februar 2012 um 9:58 Uhr

  • Ich stimme @janw zu, es sei denn, Sie entwickeln Ihr eigenes Plugin, Sie sollten niemals eine SELECT-Anweisung schreiben müssen.

    – Twinson

    12. Februar 2012 um 10:03 Uhr


  • Unsinn. Ich muss mehrere Metawerte, Miniaturansichten, den Benutzernamen und Tags in derselben Abfrage abfragen. WP_Query ist für Dummies und lässt nicht die Flexibilität zu, die ich brauche.

    – reggie

    12. Februar 2012 um 11:00 Uhr

  • Mir ist aufgefallen, dass ich das oben Genannte auch in meinen Vorlagen tun muss. Gibt es eine Möglichkeit, ein Tag auszuschließen, wenn es das einzige Tag eines Beitrags in der Funktion query_posts() ist?

    – reggie

    14. Februar 2012 um 19:50 Uhr

  • codex.wordpress.org/Function_Reference/WP_Query#Tag_Parameters

    – MetalFrog

    14. Februar 2012 um 20:02 Uhr

Versuchen Sie, hinzuzufügen HAVING Zustand zwischen GROUP BY und ORDER BY:

...
GROUP BY wposts.ID
HAVING COUNT( tag_terms.term_id ) <> 1
  OR MAX( tag_terms.term_id ) <> 55
ORDER BY wposts.post_date ASC

und ändern Sie Ihre WHERE Bedingung, um nur den Beitragstyp und den Status zu prüfen.

Auch wenn Sie nichts anderes als tag_id aus dem Beitritt zu wp_terms auswählen, ist dies nicht erforderlich, da Sie einfach term_id aus wp_term_taxonomy verwenden können.

  • Vielen Dank. Ich hatte noch nie von der HAVING-Klausel gehört.

    – reggie

    14. Februar 2012 um 19:48 Uhr

  • äh?? wie kann das funktionieren, ‘tag_terms.term_id’ auswählen und es gleichzeitig in einer have-Klausel verwenden – fehlt mir etwas?

    – Aprillöwe

    20. Februar 2012 um 21:21 Uhr

  • Hier gibt es keine Auswahl, wir wissen nicht, was OP auswählen möchte. Wenn er die Tags haben wollte, würde er wahrscheinlich GROUP_CONCAT für die Namen verwenden oder Begriffe erneut verbinden, nachdem er nicht benötigte Beiträge herausgefiltert hat. Die Abfrage in der Frage ist eine völlig andere, mit einem anderen Zweck.

    – piotrm

    20. Februar 2012 um 22:27 Uhr

Wenn Sie alle Beiträge mit einem bestimmten Tag möchten, warum haben Sie dann die Beitrags-ID in der Abfrage angegeben?

Die folgende Abfrage zeigt alle Beiträge mit der angegebenen Tag-ID

SELECT wposts.ID AS ID,
wposts.post_title, wposts.post_status, wposts.post_name,
tag_terms.term_id AS tag_id

FROM `wp_posts` AS wposts

INNER JOIN wp_term_relationships AS tag_term_relationships ON (wposts.ID = tag_term_relationships.object_id)
INNER JOIN wp_term_taxonomy AS tag_term_taxonomy ON (tag_term_relationships.term_taxonomy_id = tag_term_taxonomy.term_taxonomy_id AND tag_term_taxonomy.taxonomy = 'post_tag')
INNER JOIN wp_terms AS tag_terms ON (tag_term_taxonomy.term_id = tag_terms.term_id)


WHERE wposts.post_type="post"

AND wposts.post_status NOT LIKE 'private'

AND tag_terms.term_id = '55'

GROUP BY wposts.ID
ORDER BY wposts.post_date ASC

Wenn Sie nun sicherstellen möchten, dass diese Beiträge nur die angegebene Tag-ID haben, verschachteln Sie die Abfrage wie folgt:

    SELECT wposts.ID AS ID,
    wposts.post_title, wposts.post_status, wposts.post_name,
    tag_terms.term_id AS tag_id

    FROM `wp_posts` AS wposts

    INNER JOIN wp_term_relationships AS tag_term_relationships ON (wposts.ID = tag_term_relationships.object_id)
    INNER JOIN wp_term_taxonomy AS tag_term_taxonomy ON (tag_term_relationships.term_taxonomy_id = tag_term_taxonomy.term_taxonomy_id AND tag_term_taxonomy.taxonomy = 'post_tag')
    INNER JOIN wp_terms AS tag_terms ON (tag_term_taxonomy.term_id = tag_terms.term_id)


    WHERE wposts.post_type="post"

    AND wposts.post_status NOT LIKE 'private'

    AND tag_terms.term_id = '55'

    GROUP BY wposts.ID
    HAVING COUNT( tag_terms.term_id ) <> 1
    OR MAX( tag_terms.term_id ) <> 55    
    ORDER BY wposts.post_date ASC

1370480cookie-checkFiltern Sie Beiträge in einer Abfrage, wenn sie nur ein bestimmtes Tag haben

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy