2008-08-26 86 views
6

這是一個非常具體的問題,關於mysql中實現WordPress如何在WordPress中選擇包含特定標籤/類別的帖子

我想開發一個插件,它會顯示(選擇)有特定的「標籤」,屬於特定的「類別的帖子(包括多個)

有人告訴我,這是不可能的,因爲分類和標籤的存儲方式:

  1. wp_posts包含交的列表,每個崗位都有一個「身份證」
  2. wp_terms包含術語列表(包括categorie s和標籤)。選管會長期擁有TERM_ID
  3. wp_term_taxonomy與他們TERM_IDs術語的列表,併爲那些中的每一個分類定義(或者是分類或標籤)
  4. wp_term_relationships有關聯中間人條款和崗位

如何加入表格以獲取也屬於「Category1」類別的標籤「Nuclear」「Deals」的所有帖子?

回答

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') 
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" 
              ) 
          ) 
      ) 
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份 - 條款,term_taxonomy和term_relationship。一份適用'Category1'限制,另一份適用'Nuclear'或'Deals'限制。

順便說一句,這是什麼類型的項目,所有關於核交易的文章?你試圖讓我們在政府名單上? ;)

1

所以我試了我的WordPress數據庫的兩個選項。我在標籤爲「Perl」和「Programming」的帖子中查找了「Tech」類別。

Eric's曾經工作過一次,我在最初的select語句中添加了一個缺失的逗號。它返回了3條記錄。問題在於尋找「post_tag」的部分實際上是作爲OR選項工作的。我的一個帖子只有一個標籤不是兩個。此外,它將是很好的選擇DISTINCT。我試過Matt's版本,但是它不斷返回一個空集。我可能會試圖「玩弄」它。

0

Thanks @Eric it works!短短几年碼校正以供將來參考:

  • 第一選擇語句錯過wp_term_relationship TR2後昏迷
  • 在同一選擇statemt下列情況必須改變:
wp_terms t2, wp_term_taxonomy tt2, wp_term_relationship 

tr2

wp_terms t3, wp_term_taxonomy tt3, wp_term_relationship 

tr3
0

真的好棒的答案..幫了我很多..

偉大的bcoz。,它給了我構建我的複雜查詢的基本方法!

一個小的修正,爲用戶準備像我這樣:)

「wp_term_relationship」會給「不存在錯誤」 ..使用wp_term_relationships,因爲它是正確的表名。

謝謝埃裏克

相關問題