2012-02-12 9 views
6

उनके टैग के अनुसार वर्डप्रेस पदों का पता कर इस तरह दिख सकता है (अगर मैं इसे एक साथ सही ढंग से pieced - मैं क्वेरी से अप्रासंगिक भागों निकाला गया):फ़िल्टर पदों अगर वे केवल एक निश्चित टैग

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 

यह टैग आईडी 55 के साथ सभी पोस्टों से पूछताछ करना चाहिए।

मुझे केवल एक ही टैग वाले सभी पोस्ट को फ़िल्टर करने के लिए क्या करना है, लेकिन कोई अन्य टैग नहीं है।

तो अगर मैं टैग 23,34,55,67 टैग करता हूं तो मैं एक पोस्ट दिखाना चाहता हूं लेकिन अगर मैं टैग 55 (और कोई अन्य टैग नहीं) तो पोस्ट को दिखाना नहीं चाहता हूं। जिन पदों में यह निश्चित टैग नहीं है, उन्हें क्वेरी में भी शामिल किया जाना चाहिए।

मैं यह कैसे कर सकता हूं?

+1

आप इसे गलत कर रहे हैं। आपको हमेशा WP_query क्लास के साथ पोस्ट का चयन करना चाहिए: http://codex.wordpress.org/Class_Reference/WP_Query – janw

+1

मैं @janw से सहमत हूं, जब तक कि आप अपनी प्लगइन विकसित नहीं कर रहे हैं, आपको कभी भी एक SELECT कथन लिखने की आवश्यकता नहीं है । – twilson

+1

बकवास। मुझे एक ही प्रश्न में कई मेटा मान, थंबनेल, उपयोगकर्ता नाम और टैग पूछने की ज़रूरत है। WP_Query डमी के लिए है और मुझे लचीलापन की अनुमति नहीं है। – reggie

उत्तर

4

GROUP BY और ORDER BY के बीच HAVING हालत जोड़ने का प्रयास करें:

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

और केवल पोस्ट प्रकार और स्थिति के लिए जाँच करने के लिए अपने WHERE हालत बदल जाते हैं।

यदि आप wp_terms से टैग_आईडी के अलावा कुछ भी नहीं चुनते हैं तो यह आवश्यक नहीं है क्योंकि आप केवल wp_term_taxonomy से term_id का उपयोग कर सकते हैं।

+0

धन्यवाद। मैंने कभी भी हैविंग क्लॉज के बारे में नहीं सुना था। – reggie

+0

उह ?? यह कैसे काम कर सकता है, 'tag_terms.term_id' का चयन कर रहा है और उसी समय खंड में इसका उपयोग कर रहा है - क्या मुझे कुछ याद आ रहा है ?? – Aprillion

+0

यहां कोई चयन नहीं है, हम नहीं जानते कि ओपी क्या चुनना चाहता है, अगर वह टैग चाहता था तो वह शायद नामों पर GROUP_CONCAT का उपयोग करेगा, या अनइडेड पोस्ट को फ़िल्टर करने के बाद फिर से शब्दों में शामिल होगा। प्रश्न में प्रश्न एक अलग उद्देश्य के साथ एक पूरी तरह से अलग है। – piotrm

1

यदि आप किसी निश्चित टैग के साथ सभी पोस्ट चाहते हैं, तो आपने क्वेरी में पोस्ट आईडी क्यों निर्दिष्ट की है?

यह निम्न क्वेरी

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 

अब दिए गए टैग आईडी के साथ सभी पोस्ट दिखाई देगा, तो आप यह सुनिश्चित करें कि इन पदों केवल दिए गए टैग आईडी बनाने के लिए चाहते हैं, तो घोंसला क्वेरी इस प्रकार है:

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 
संबंधित मुद्दे