如何在WordPress中选择具有特定标签/类别的帖子

时间:2008-08-26 14:29:38

标签: php mysql sql wordpress plugins

这是一个非常具体的问题,关于在 WordPress 中实现的 MySQL

我正在尝试开发一个插件,该插件会显示(选择)具有特定“标记”且属于特定“类别”(均为多个)的帖子< / p>

我被告知这是不可能的,因为存储类别和标签的方式:

  1. wp_posts包含帖子列表,每个帖子都有一个“ID”
  2. wp_terms包含术语列表(类别和标签)。每个术语都有一个TERM_ID
  3. wp_term_taxonomy有一个带有TERM_ID的术语列表,并且每个术语都有一个分类法定义(分类或标记)
  4. wp_term_relationships有条款和帖子之间的关联
  5. 如何加入表格以获取所有包含“Nuclear”“Deals”的帖子,这些标签也属于“Category1”类别?

6 个答案:

答案 0 :(得分:3)

我误解了你。我以为你想要核或特价。以下内容应该只给你核和交易。

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')

答案 1 :(得分:2)

多么严重的数据库结构。

无论如何,我会做这样的事情(注意我更喜欢EXISTS加入,但如果你愿意,可以将它们重新编写为连接;大多数查询分析器无论如何都会将它们折叠到同一个查询计划中)。你可能不得不以某种方式做一些额外的杂耍,以使其有效......

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" 
                                           )
                            )
            )

答案 2 :(得分:1)

试试这个:

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'))

基本上我正在使用相关子表的2个副本 - terms,term_taxonomy和term_relationship。一份副本适用“Category1”限制,另一份适用“核”或“交易”限制。

顺便说一下,关于核交易的所有帖子,这是一个什么样的项目?你想让我们上一些政府名单? ;)

答案 3 :(得分:1)

所以我在我的WordPress数据库上尝试了两个选项。我在帖子中查找了“技术”类别,标签为“Perl”和“Programming”。

一旦我在初始select语句中添加了一个缺少的逗号,

Eric's就可以了。它返回了3条记录。问题是寻找“post_tag”的部分实际上是作为OR选项工作。我的一个帖子只有一个标签,而不是两个。最好是制作SELECT DISTINCT。

我尝试了Matt's版本,但它一直返回一个空集。我可能会试着“玩弄”它。

答案 4 :(得分:0)

谢谢@Eric它有效!只需进行一些代码更正以供将来参考:

  • 第一个选择语句在wp_term_relationship tr2
  • 之后错过了一个昏迷
  • 在相同的选择状态中,必须更改以下内容:
wp_terms t2, wp_term_taxonomy tt2, wp_term_relationship 

tr2

应该是

wp_terms t3, wp_term_taxonomy tt3, wp_term_relationship 

tr3

答案 5 :(得分:0)

非常好的答案..帮了我很多...

很棒的bcoz。它给了我构建复杂查询的基本方法!

对于像我这样的现成用户进行一次小修正:)

“wp_term_relationship”会给出“不存在的错误” ..使用 wp_term_relationships ,因为它是正确的表名。

感谢Eric