उन सभी पदों को छोड़ें जहां मेटा कुंजी मौजूद नहीं है


50

मैं उन सभी पदों को पुनः प्राप्त करने के लिए एक प्रश्न प्राप्त करने की कोशिश कर रहा हूं जहां कोई विशिष्ट meta_keyमौजूद नहीं है और फिर इसे बनाएं।

मुझे उन पोस्टों को खोजने में समस्या हो रही है क्योंकि मैं जिस परीक्षण का परीक्षण कर रहा हूं वह काम नहीं करता है।

यहाँ उन पोस्ट को प्राप्त करने की कोशिश करने के लिए कोड का उपयोग किया जा रहा है:

$args = array(
   'posts_per_page' => 18,
   'cat'=>1955,
   'post_status'=>'publish',
   'meta_query' => array(
                  array(
                     'key' => 'colors',
                     'compare' => 'NOT EXISTS'
                  ),
   ));      

query_posts($args);

यदि कुंजी के साथ कोई पोस्ट नहीं है, तो यह कुछ भी नहीं लौटाता है colors, लेकिन जब भी वह कुंजी मौजूद होती है (मुझे जो चाहिए उसकी विपरीत है) idsकुंजी के साथ उन पदों को वापस कर देता है colors। मैंने EXISTइसके बजाय कोशिश की लेकिन कोई किस्मत नहीं।

अगर कोई मुझे प्रश्न बनाने के सही तरीके पर टिप दे सकता है जैसे मुझे ज़रूरत है तो मैं इसकी सराहना करूँगा।

धन्यवाद!


आप वर्डप्रेस के किस संस्करण का उपयोग कर रहे हैं?
s_ha_dum

हाय, चूक के लिए खेद है। मैं v3.5 का उपयोग कर रहा हूं
जॉर्डनबेल

ऐसा लगता है कि उस प्रकार का प्रश्न (3.5 सेट की तुलना में नहीं के साथ तुलना में) 3.5 में जोड़ा गया था, इसलिए इसे जहां तक ​​मैं देख सकता हूं, यह काम करना चाहिए। कस्टम
सेलेक्ट

धन्यवाद मैं चयन का उपयोग करने की कोशिश करूंगा। मुझे पहले सीखना चाहिए कि कौन सी तालिकाएँ क्वेरी से और कैसे क्वेरी के अनुरूप होनी चाहिए :(
जॉर्डनबेल

बहुत अजीब। मुझे उस कोड में कोई समस्या नहीं है और आप 3.5+ का उपयोग कर रहे हैं, यही कारण है कि मैंने पूछा। क्या आपने वास्तव में डेटाबेस पर यह देखने के लिए पुष्टि की है कि आपके डेटा को आपके सोचने के तरीके से डाला जा रहा है?
s_ha_dum

जवाबों:


73

मैंने इसके साथ कुछ और परीक्षण किए, और ईमानदारी से एक कारण नहीं मिल सकता है जब तक यह काम नहीं करेगा (जब तक कि ऊपर कोड सिर्फ एक स्निपेट नहीं है और वास्तविक कोड नीचे मेरे उदाहरणों पर फिट बैठता है)। हालाँकि, मैंने कुछ चीजों की खोज की, जो आपको सही दिशा में ले जा सकती हैं।

1) अपने आप में, यह मेटा क्वेरी "रंग IS NULL" के बराबर है, अर्थात यह उन पोस्टों को वापस कर देगा जिनके पास पोस्टमैट तालिका में वह कुंजी सेट नहीं है। यह ऊपर दिखाया गया मामला है, और इसे काम करना चाहिए था।

'meta_query' => array(
    array(
     'key' => 'colors',
     'compare' => 'NOT EXISTS' // this should work...
    ),
)

2) वर्डप्रेस 3.9 से पहले, 'संबंध' सूचकांक को 'या' के लिए स्थापित करने से यह स्थिति बदल जाती है। यह विपरीत लौटाता है। मुझसे मत पूछो क्यों। कई मेटा क्वेरीज़ करते समय यह विशेष रूप से महत्वपूर्ण है। इसका मतलब है कि उन पोस्टों के लिए एक क्वेरी करना संभव नहीं है, जिनमें 'कलर्स' की 'ब्लू' (या जो भी) के लिए सेट है या जो बिल्कुल सेट नहीं है। नीचे दी गई क्वेरी पहली शर्त को अनदेखा करेगी और केवल उन्हीं को लौटाएगी जो दूसरी स्थिति से मेल खाते हैं।

'meta_query' => array(
   'relation' => 'OR',
    array(
     'key' => 'colors',
     'compare' => 'NOT EXISTS' // doesn't work
    ),
    array(
     'key' => 'colors',
     'value' => 'blue'
    )
)

3) हालाँकि, यदि हम 'मान' सेट करते हैं, तो हम पहली शर्त का उपयोग करके वर्डप्रेस को बेवकूफ बना सकते हैं। इसके लिए एक प्रासंगिक मूल्य की आवश्यकता नहीं है (इसे नजरअंदाज किया जाता है, जहां तक ​​मुझे पता है), लेकिन इसे किसी भी प्रभाव के लिए स्थिति के लिए सेट करने की आवश्यकता हैNOT EXISTS

'meta_query' => array(
   'relation' => 'OR',
    array(
     'key' => 'colors',
     'compare' => 'NOT EXISTS', // works!
     'value' => '' // This is ignored, but is necessary...
    ),
    array(
     'key' => 'colors',
     'value' => 'blue'
    )
)

यह वर्डप्रेस 3.9 तक सच था। यदि आप अभी भी पुराने संस्करण का उपयोग कर रहे हैं, तो यह एक व्यवहार्य समाधान है।


धन्यवाद! और देरी के लिए खेद है। मैंने एक प्रश्न का उपयोग करके समाप्त कर दिया है, लेकिन मैं निम्नलिखित घंटों में आपके समाधान का परीक्षण करूंगा ताकि मैं वापस स्विच कर सकूं और हो सकता है कि इस काम में हम एक दूसरे की मदद कर सकें। जैसे ही मैं इसकी जांच करूंगा, मैं आपको बता दूंगा। धन्यवाद फिर से
जॉर्डनबेल

अच्छी तरह से लिखा है और पुष्टि की है कि एक खाली मूल्य रिटर्न जोड़ने से अपेक्षित परिणाम मिलते हैं। मैं कहूंगा कि यह अनजाने में है, यह देखने के लिए trac.wordpress.org पर देखने लायक हो सकता है कि क्या पहले से ही टिकट है, यदि नहीं, तो यह प्रतिलिपि प्रस्तुत करने योग्य है।
टेलर डेवी

WP की ट्रिक के महान स्पष्टीकरण और समाधान के लिए धन्यवाद :) यहां पहुंचने में कुछ समय लगा - लेकिन अब मैं कम से कम 10 बार (यदि केवल मैं कर सकता हूं;) पर क्लिक करना चाहता हूं
lorem बंदर

अगर मैं तुलना का उपयोग करता हूँ, तो मान दुर्भाग्य से WP के नए संस्करणों में अनदेखा नहीं किया गया है (4.2.2 में परीक्षण किया गया)
इगोर जेरोस्सिमिक

10
EXISTSऔर NOT EXISTS"बग" जो एक मूल्य निर्धारित करने के लिए आवश्यक है, WP 3.9 में तय किया गया था
trex005

11

एक कस्टम क्वेरी का उपयोग करते हुए, इसने मेरे लिए काम किया:

SELECT * FROM wp_posts as posts
            WHERE   posts.post_type     = 'post'
            AND NOT EXISTS (
              SELECT * FROM `wp_postmeta`
               WHERE `wp_postmeta`.`meta_key` = "your_meta_key"
                AND `wp_postmeta`.`post_id`=posts.ID
            ) 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.