बूलियन सच / गलत मूल्य के साथ मेटा क्वेरी


11

मैं सभी किराये की संपत्तियों को दिखाने की कोशिश कर रहा हूं, पहले उन सभी संपत्तियों को किराए पर नहीं दिया गया है, और फिर उन सभी संपत्तियों को जो वर्तमान में किराए पर हैं। किराए के लिए कस्टम पोस्ट मेटा के साथ एक कस्टम पोस्ट टाइप 'रेंट' है (_price_rented) जो एक चेकबॉक्स है (यदि यह किराए पर दिया गया है तो सच है या गलत ... सच है)। मुझे उपलब्ध (गैर-किराए पर) संपत्तियों के साथ सभी संपत्तियों को दिखाने के लिए क्वेरी को बदलने की जरूरत है और पहले प्रदर्शित होने वाली किराए की संपत्तियां।

यहाँ मेरी क्वेरी है:

$ts_properties = new WP_Query( 
    array( 
    'post_type' => 'rent', 
    'paged' => $paged, 
    'posts_per_page' => -1,
    'meta_key' => '_price_rented',
    'orderby' => 'meta_value',
    'order' => 'DESC',
    'meta_query' => array(
        array(
        'key' => '_price_rented',
        'value' => false,
        'type' => 'BOOLEAN',
        ),
    ) 
) 
);

किसी कारण से यह क्वेरी उन सभी संपत्तियों को दिखाती है, जो किराए पर ली गई हैं। जब मैं 'असत्य' से मान को 'मेटा' में स्विच करता हूं, तो मेटा_क्वारी में यह कोई गुण नहीं दिखाता है।

तो, फिर मैंने सोचा, वापसी मूल्य या तो गलत है (किराए पर ली गई संपत्तियों के लिए) या NULL (उन संपत्तियों के लिए जो किराए पर नहीं हैं), लेकिन मुझे यकीन नहीं है कि NULL परिणाम के लिए क्वेरी कैसे करें (गलत नहीं), मैंने एक 'जोड़ा 'meta_query के तर्क की तुलना करें और मान को'! = 'पर सेट करें, लेकिन यह काम भी नहीं किया।

संपादित करें: var_dump एक उपलब्ध, गैर-किराए के अपार्टमेंट के लिए निम्न रिटर्न देता है: string(0) ""और एक गैर-उपलब्ध, किराए पर दिए गए अपार्टमेंट के लिए:string(1) "1"


शायद 1 और 0 के मूल्यों का उपयोग कर रहे हैं?
रिकियूसिन

meta_query प्रकार => स्ट्रिंग। संभावित मान 'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED' हैं। डिफ़ॉल्ट मान 'CHAR' है।
इयूमल जुले

@reikyoushin: '1' का उपयोग करके सभी किराए पर दिए गए गुण लौटते हैं, और '0' कोई गुण नहीं देता है।
केगन क्वाम्बी

1
@ ईमैन्यूले: ऐसा लगता है कि कोई प्रभाव नहीं पड़ रहा है (मैंने भी यही सोचा था)। मैंने देखा कि इस लेख से: thethemefoundry.com/blog/…
Kegan Quimby

1
क्या _price_rentedवास्तव में दोनों trueऔर falseमूल्यों के लिए निर्धारित है , या यह केवल इसके लिए निर्धारित है true? कृपया डेटाबेस की जाँच करें। मैंने पूछा क्योंकि एक अनियंत्रित चेक बॉक्स बिल्कुल भी पारित नहीं हुआ है POSTइसलिए मैं सोच रहा हूं कि क्या उन मामलों के लिए मूल्य बिल्कुल निर्धारित है।
s_ha_dum

जवाबों:


4

WP_Meta_Query किसी भी तरह से कोर में "इतना स्थिर नहीं" हिस्सा है और यदि आप बहुत ध्यान नहीं देते हैं तो यह आसानी से भ्रमित हो सकता है।

जब आप एक कर रहे हैं new WP_Query()और meta_query => array()तर्क या इसके एकल कुंजी / मूल्य जोड़ी समकक्ष हैं, तो new WP_Meta_Query()तुरंत छलांग लगाने के बाद, कूदता है।

$this->meta_query = new WP_Meta_Query();
$this->meta_query->parse_query_vars( $q );

संस्कारित मूल्य

जब आप मेटा डेटा को क्वेरी करते हैं, तो boolविकल्प होता है। और यदि आप इसका उपयोग करते हैं, तो यह वापस आ जाएगा CHAR, जो अनुमत मानों के सरणी के रूप में डिफ़ॉल्ट मान है:

'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED'

जहां NUMERICपर रीसेट हो जाएगा SIGNED

डिबगिंग

ऐसे कई फ़िल्टर हैं जो पोस्ट सेव प्रक्रिया को प्रभावित कर सकते हैं, इसलिए पहली बात यह है कि कुछ लूप के अंदर विभिन्न मूल्यों की जांच कर रहे हैं:

var_dump( get_post_meta( get_the_ID(), '_price_rented', true ) );

फिर, वापसी मान के आधार पर, आप या तो उपयोग करना होगा SIGNED, अगर परिणाम है 0या 1, या "true"या "false"अगर परिणाम एक श्रृंखला है। यदि यह वास्तव में बूलियन है, तो मैं अभी भी stringयह सुनिश्चित करने के लिए उपयोग करने का सुझाव दूंगा कि यह गुजरता है $GLOBALS['wpdb'], जो केवल %sस्ट्रिंग और %dअंकों को पारित कर सकता है ।

अतिरिक्त नोट्स

मैं तो बस अद्यतन के रूप में के लिए कोडेक्स प्रवेशWP_Meta_Query आज, मैंने देखा कि वहाँ अलग अलग निर्गम की बहुत सारे हैं (अनावश्यक की संख्या भारी मात्रा जोड़ने JOINS, जिस पर चर्चा कर रहे हैं, Trac यहाँ और यहाँ के साथ बाहर संभव एक भी पैच कोर में चले गए)। ( यहाँAND भागों के लिए टिकट का पालन करें ) बिंदु यह है कि सरणी और इसके उप- भागों के meta_*साथ तर्कों के संयोजन का उपयोग करना संभव है meta_query। जब तक आप इसे डंप नहीं करते, तब तक परिणाम बहुत अधिक अज्ञात है, इसलिए IMHO आप इनपुट को जोड़ने के एक या दूसरे तरीके का उपयोग करके बेहतर हैं। खासकर तब जब आप केवल होका उपयोग करते हुए meta_key, यह कुछ मामलों में "कुंजी केवल क्वेरी" के परिणामस्वरूप होता है।

समाधान

जैसा कि टिप्पणियों में बताया गया है:

(...) var_dumpएक उपलब्ध, गैर-किराए के अपार्टमेंट के लिए निम्नलिखित रिटर्न देता है: string(0) ""और एक गैर-उपलब्ध, किराए पर, अपार्टमेंट के लिए:string(1) "1"

अब meta_queryउपयोग करना है

'meta_query' => array( 'relation' => 'OR', array(
    'meta_key'     => '_price_rented',
    'meta_value'   => '1',
    'meta_compare' => '='
) );

यदि आप "गैर-उपलब्ध, किराए के अपार्टमेंट" प्राप्त करना चाहते हैं या '!='"गैर-किराए पर" अपार्टमेंट प्राप्त करने के लिए उपयोग करना चाहते हैं।

नोट: संभावित मान meta_compareहैं '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'NOT EXISTS', 'REGEXP', 'NOT REGEXP'या हैं 'RLIKE'। डिफ़ॉल्ट मान है '='


3

मैंने उसी समस्या का सामना किया और एक घंटे की खोज के बाद मूल्य "NOT EXISTS"और "EXISTS"मूल्य पाया ( only in WP >= 3.5 )। तो मेटा वैल्यू मौजूद है या नहीं, इसके लिए मेटा मान पूछने की कोई आवश्यकता नहीं है:

'meta_key'     =>   '_price_rented'  ,
'meta_compare' =>   'NOT EXISTS'     ,

यह मेरे लिए पूरी तरह से काम कर रहा है।


3

टीएल; डीआर: यह समस्या संभवत : तब होती है जब बूलियन फ़ील्ड को वैकल्पिक के रूप में बनाया जाता है। आप इसे आवश्यक बनाकर या डिफ़ॉल्ट केस को पुनः प्राप्त करने के लिए अधिक जटिल क्वेरी का उपयोग करके इसे ठीक कर सकते हैं।

अधिक जानकारी:

यहां दो डेटा प्रतिनिधित्व समस्याएं चल रही हैं: एक वह है जो डेटा मानों का उपयोग सही / गलत का प्रतिनिधित्व करने के लिए किया जा रहा है और दूसरा यह है कि क्या डिफ़ॉल्ट (आमतौर पर गलत) मान है या नहीं, क्षेत्र को संग्रहीत किया जा रहा है या नहीं।

भाग 1: मैंने WP_Meta_Queryसत्य और असत्य की तुलना के लिए उत्पन्न SQL को देखा , और पाया कि सच्चे के लिए यह '1' और असत्य '' (खाली स्ट्रिंग) के विकल्प के लिए है। इसलिए आप डेटाबेस में जो कुछ भी लिखते हैं, उससे सहमत होने की आवश्यकता है यदि आप वास्तविक वास्तविक और झूठे मूल्यों की तुलना में प्रश्न करने जा रहे हैं। विशेष रूप से, आप असत्य के लिए '0' लिखना नहीं चाहते हैं। इसके बजाय 0 और 1 के लिए लिखना और परीक्षण करना अधिक मूर्खतापूर्ण हो सकता है (और कई फॉर्म बिल्डर्स ऐसा करते हैं)। लेकिन डेटाबेस में क्या लिखा जा रहा है यह देखने के लिए जांचें और अपनी क्वेरी बनाते समय इसे ध्यान में रखें।

भाग 2: मान लें कि गलत डिफ़ॉल्ट मान है, जिसका रिकॉर्ड सही है, उसे खोजना आसान है:

... 'meta_key' => 'my_key', 'meta_value' => 1 (या सच)

लेकिन दूसरा पक्ष चुनौतीपूर्ण है: एक गलत मूल्य हो सकता है, या कोई भी मूल्य नहीं हो सकता है। यह तब हो सकता है जब मान को एक रूप में वैकल्पिक के रूप में सूचीबद्ध किया गया था --- फिर जब तक उपयोगकर्ता स्पष्ट रूप से इसे सेट या परिवर्तित नहीं करता है, तब तक इसे डेटाबेस में नहीं जोड़ा जाएगा। ध्यान दें कि यदि आप केवल get_post_metaइसका उपयोग कर रहे हैं तो यह इस तरह से ठीक काम करेगा: एक गलत मान लौटाता है और कोई मूल्य नहीं लौटाता है।

लेकिन जब आप उपयोग कर रहे हैं WP_Query, यह इतना आसान नहीं है। (या यदि यह है, तो मुझे अभी तक पता नहीं चला है)।

आपके पास दो (या शायद तीन) विकल्प हैं:

  1. सुनिश्चित करें कि फ़ील्ड को हमेशा वास्तविक मूल्य से स्पष्ट रूप से प्रारंभ किया गया है। कुछ फॉर्म बिल्डरों में, आप फ़ील्ड को आवश्यक बनाकर और उसे डिफ़ॉल्ट मान देकर ऐसा करते हैं। तब आप ...'meta_value' => 0 मज़बूती से परीक्षण कर सकते हैं ।

  2. दो प्रश्न करें, पहला जो गलत मान के लिए परीक्षण करता है और दूसरा जो बिना मूल्य के परीक्षण करता है। इन्हें इस तरह एकल WP_Query में जोड़ा जा सकता है:

    meta_query => {
        relation => 'OR'
        array(
            'key'     => 'my_key',
            'value'   => 0,
            'compare' => '='
        ),
        array(
            'key'     => 'my_key',
            'compare' => 'NOT EXISTS',
        ),
    )

यह शायद एक कुशल प्रश्न नहीं है। बहुत सारे कारकों के आधार पर, सभी वस्तुओं को वापस करना और उन्हें अपने कोड में फ़िल्टर करना बेहतर हो सकता है।

  1. असत्य का अर्थ करने के लिए 'कोई मूल्य नहीं' का उपयोग करना संभव है। ऐसा करने के लिए, जब भी मान को गलत पर सेट किया जाना चाहिए, तो आपको इसे अपडेट करने के बजाय मेटा मान को हटाना होगा।

उस स्थिति में, एक एकल 'NOT EXISTS'क्वेरी मज़बूती से सही ऑब्जेक्ट लौटाएगी। (मुझे नहीं लगता कि कई फॉर्म बिल्डरों या प्लगइन्स इस व्यवहार का समर्थन करते हैं, इसलिए मैं केवल शुद्ध रूप से कस्टम कोड में इसका उपयोग करूंगा।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.