मैं मेटा_फील्ड के रूप में एक सरणी के साथ एक मेटा_क्वेरी कैसे बना सकता हूं?


16

यहाँ मेरी क्वेरी के लिए args हैं:

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        array(
            'key' => 'topics',
            'value' => 'sports',
        )
    )
);

यह topicsएक स्ट्रिंग है जब काम करता है, लेकिन नहीं जब यह एक सरणी है। मैं topicsउदाहरण के लिए काम करना चाहता हूंarray( 'sports', 'nonprofit', etc. )

क्या meta_key के रूप में सरणियों के साथ मेटा क्वेरीज़ बनाने का कोई तरीका है?


कृपया स्पष्ट करें - क्या आपका मतलब है कि "विषयों" का संग्रहीत मूल्य एक सरणी है? या कि संग्रहीत मूल्य एक स्ट्रिंग है, और आप एक सरणी में क्वेरी के लिए कई शर्तें पारित करना चाहते हैं?
मठसमठ

@MathSmath, मेरा मतलब है कि संग्रहीत मूल्य एक सरणी है।
mike23

जवाबों:


31

क्वेरी को संभावित मानों की एक सरणी खिला रहा है

यदि डेटाबेस में मान एक स्ट्रिंग है और आप क्वेरी को कई मानों को खिलाना चाहते हैं:

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        array(
            'key' => 'topics',
            'value' => array ( 'sports', 'nonprofit', 'community' ),
            'compare' => 'IN'
        )
    )
);

डेटा के क्रमबद्ध सरणी में एक विशिष्ट मान की खोज करना

यदि डेटाबेस में मान कई विषयों की एक सरणी है और आप उस सरणी के भीतर एक ही विषय की खोज करना चाहते हैं (ध्यान दें कि डेटाबेस में एक सरणी को इस तरह से पुनर्प्राप्त किया जा सकता है, लेकिन डेटाबेस में क्रमबद्ध रूप में रहता है, जो एक है स्ट्रिंग भी):

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        array(
            'key' => 'topics',
            'value' => 'sports',
            'compare' => 'LIKE'
        )
    )
);

तुलना के रूप में 'LIKE' का उपयोग करना एक निर्देश के रूप में स्पष्ट नहीं है, जैसा कि आप के लिए उम्मीद कर सकते हैं, लेकिन यह सबसे अच्छा विकल्प है।

इसके बाद, आपका एकमात्र अन्य विकल्प उन सभी पोस्टों को पुनर्प्राप्त करना होगा, जिनमें मेटा_की "विषय" सेट हैं और मैन्युअल रूप से उन पर पुनरावृति करते हैं, या दूसरे शब्दों में, लूप के भीतर मूल्य की जांच करें और उक्त शर्त पर पोस्ट प्रदर्शित करें।


14

जोहान्स की प्रतिक्रिया से दूर जाने के लिए, क्योंकि यह एक क्रमबद्ध सरणी है, यदि आप उपयोगकर्ता आईडी (जो मेरा मामला था) जैसी किसी चीज़ का भंडारण करते हैं, तो आपको इसे थोड़ा अलग तरीके से संभालने की आवश्यकता हो सकती है।

पोस्ट मेटा को बचाया जा रहा था जैसे:

array( "1", "23", "99");

तो हाँ वे पूर्णांक हैं, लेकिन update_post_metaउनके माध्यम से तार के रूप में सहेजा जा रहा था।

'meta_query' => array(
            array(
                    'key'     => 'my_meta_key',
                    'value'   => serialize( strval( 1 ) ),
                    'compare' => 'LIKE'
                )
            )

तो आप वास्तव में आप क्या देख रहे हैं के क्रमबद्ध स्ट्रिंग संस्करण के साथ एक तुलना कर रहे हैं। मैंने काम करने के लिए कुछ अच्छा करने की कोशिश में कुछ अच्छे घंटे बिताए और अब तक यह सबसे अच्छा था जिसके साथ मैं आ सका।


serialize (strval (1)) हल मेरी समस्या, धन्यवाद
Behzad

संयोग से आज इस पुराने जवाब में आया। मुझे आपका जोड़ पसंद है। +1
जोहान्स पिल

मैं अभी भी इस पर आया हूं, मेरी बात यह है कि मुझे उन सभी पोस्टों को प्राप्त करने की आवश्यकता है जहां user_id सरणी में नहीं है, लेकिन उपरोक्त समाधान काम नहीं करता है इसलिए मैंने इसे इस तरह बनाया है: 'meta_query' => array( array( 'key' => 'my_meta_key', 'value' => ':' . $user_id . ';', 'compare' => 'NOT LIKE' ) ) क्योंकि जब क्रमबद्ध सभी मान सहेजे जाते हैं जैसे: ' : मूल्य, '
बोबज़

4

@ शैली के उत्तर से एक और मामूली सुधार।

मेरे पास ऐसे मामले हैं जहां आईडी को स्ट्रिंग्स के रूप में संग्रहीत किया गया है (जैसे कि जब एक फॉर्म इनपुट से लिया जाता है) और पूर्णांक (जैसे update_post_meta($post_id, authorized_users', array(get_current_user_id()));)। यह उस तरह के जाने-माने मुद्दे की तरह है, जिसके साथ wp_set_object_terms()आप टर्म आईडी का इस्तेमाल कर सकते हैं, ताकि आप शब्द सेट कर सकें, लेकिन अगर आप उन्हें पूर्णांक के रूप में नहीं डालते हैं, तो आप उन नामों के साथ उन संख्याओं के साथ नए शब्द बनाने की 50% संभावना रखते हैं। बजाय।

इसका परिणाम उन्हें अलग-अलग क्रमबद्ध सरणी में संग्रहीत किया जा सकता है, जैसा कि मेरे परीक्षण स्थल के डेटाबेस से ऐसे मामले के अंश से देखा जा सकता है:

a:1:{i:0;s:1:"1";} // 's' for 'string', also note the double quotes
a:1:{i:0;i:1;} // 'i' for 'integer', no quotes

उपरोक्त दोनों, जब के माध्यम से खिलाया print_r()जाएगा के रूप में प्रस्तुत करना होगा

Array
(
    [0] => 1
)

इसे ठीक करने के लिए, मैंने एक स्ट्रिंग के बजाय एक पूर्णांक के रूप में मान डालने वाले क्वेरी के meta_queryएक relationऔर संस्करण को जोड़कर एक मामूली घुमाव बनाया ।

यहाँ अंतिम परिणाम है:

        'meta_query' => array(
            'relation' => 'OR', // Lets it know that either of the following is acceptable
            array(
                'key' => 'bcm_enm_authorized_users',
                'value'   => serialize(strval(get_current_user_id())), // Saved as string
                'compare' => 'LIKE'
            ),
            array(
                'key' => 'bcm_enm_authorized_users',
                'value'   => serialize(intval(get_current_user_id())), // Saved as integer
                'compare' => 'LIKE'
            ),
        ),

संपादित करें: बस एहसास हुआ कि यह विधि सरणी अनुक्रमित के साथ टकराव के जोखिम को चला सकती है, जो किसी व्यक्ति को सामग्री में अवैध पहुंच की अनुमति दे सकती है यदि वे सरणी में नहीं हैं, लेकिन उनकी उपयोगकर्ता आईडी एक सूचकांक के रूप में दिखाई देती है। इस तरह से, जबकि यह काम करता है यदि आपके पास इस मुद्दे पर चर्चा की गई है, तो बेहतर अभ्यास यह सुनिश्चित करना है कि आप जिन मूल्यों को खोजना चाहते हैं, उन्हें सहेजने से पहले तार के रूप में ढाला जाए ताकि आप @ स्टाइल विधि का उपयोग कर सकें।


यह चयनित उत्तर होना चाहिए, सबसे विश्वसनीय
अमीन

2

मैं जोहान्स के जवाब के लिए जाऊंगा। हालाँकि, मैं इसे सुधारना चाहता हूं क्योंकि उस मेटा_क्वेरी का उपयोग करने पर, आप इस तरह के एक मामले को पूरा करेंगे

आपका मूल्य है

array('sports','movies', 'sports2');

जब आप खोज करते हैं

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        array(
            'key' => 'topics',
            'value' => 'sports',
            'compare' => 'LIKE'
        )
    )
);

फिर परिणाम 'स्पोर्ट' और 'स्पोर्ट 2' दोनों को लौटाएगा।

इसे ठीक करने के लिए, मेटा_क्वेरी आर्ग में बदलें

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        array(
            'key' => 'topics',
            'value' => 'sports";',
            'compare' => 'LIKE'
        )
    )
);

ऐसा इसलिए है क्योंकि मूल्य डेटाबेस में क्रमबद्ध है, और प्रत्येक आइटम एक अर्धविराम द्वारा अलग किया जाएगा। इस प्रकार, ऊपर आर्ग्स काम करेगा

यदि मूल्य में आइटम संख्या हैं, तो आपको बस दोहरे उद्धरण को निकालने की आवश्यकता है "

$args = array(
        'post_type' => 'news',
        'meta_query' => array(
            array(
                'key' => 'topics',
                'value' => '1;',
                'compare' => 'LIKE'
            )
        )
    );

1

मैं आज कुछ इसी तरह से लड़खड़ा गया। मुझे कई संबंधित उपयोगकर्ताओं (सरणी) के साथ एक ACF (एडवांस्ड कस्टम फील्ड्स) संबंध क्षेत्र को क्वेरी करना होगा।

Php द्वारा फ़ील्ड को अपडेट करने के बाद क्वेरी काम नहीं करती है। ACF UI द्वारा इसे अपडेट करने के बाद क्वेरी ने काम किया।

समस्या यह थी, कि मेरे php कोड ने संबंधों के मूल्यों को अंतर-मूल्यों के लिए निर्धारित किया, UI ने इसे स्ट्रिंग-मानों के लिए सेट किया। यह सुनिश्चित करने के लिए कि दोनों काम मैं अब इस क्वेरी का उपयोग करता हूँ (यहाँ उदाहरण के लिए फिट है):

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'topics',
            'value' => '1;',  // works for int-array
            'compare' => 'LIKE'
        ),
        array(
            'key' => 'topics',
            'value' => '"1"',  // works for string-array
            'compare' => 'LIKE'
        ),
    )
);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.