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?
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.
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
13704800cookie-checkFiltern Sie Beiträge in einer Abfrage, wenn sie nur ein bestimmtes Tag habenyes
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