मेटालाइज़ के रूप में मेटा मानों को क्रमबद्ध सरणियों के रूप में


37

मैं एक ऐसी परियोजना पर काम कर रहा हूं जिसमें मैं एक कस्टम पोस्ट प्रकार बना रहा हूं और कस्टम डेटा मेरे कस्टम पोस्ट प्रकार से जुड़े मेटा बॉक्स के माध्यम से दर्ज किया गया है। जो भी कारण के लिए मैंने मेटा बॉक्स को इस तरह से कोड करने का फैसला किया है कि प्रत्येक मेटाबॉक्स में इनपुट एक सरणी का हिस्सा हैं। उदाहरण के लिए, मैं देशांतर और अक्षांश का भंडारण कर रहा हूँ:

<p> 
    <label for="latitude">Latitude:</label><br /> 
    <input type="text" id="latitude" name="coordinates[latitude]" class="full-width" value="" /> 
</p> 
<p>     
    <label for="longitude">Longitude:</label><br /> 
    <input type="text" id="longitude" name="coordinates[longitude]" class="full-width" value="" /> 
</p>

जो भी कारण हो, मुझे प्रत्येक मेटाबॉक्स के लिए एक विलक्षण पोस्टमैटा प्रविष्टि होने का विचार पसंद आया। पर save_postहुक, मैं बचाने डेटा इतना चाहते:

update_post_meta($post_id, '_coordinates', $_POST['coordinates']);

मैंने ऐसा इसलिए किया क्योंकि मेरे पास तीन मेटाबॉक्सेज़ हैं और मुझे प्रत्येक पोस्ट के लिए सिर्फ 3 पोस्टमैटा वैल्यूज़ पसंद हैं; हालाँकि, मुझे अब इसके साथ एक संभावित मुद्दे का एहसास हो गया है। मैं इन मेटा मूल्यों के आधार पर केवल कुछ पोस्ट को बाहर निकालने के लिए WP_Query का उपयोग करना चाह सकता हूं। उदाहरण के लिए, मैं उन सभी पोस्टों को प्राप्त करना चाहता हूं जिनमें अक्षांश मान 50 से ऊपर हो। यदि मेरे पास डेटाबेस में व्यक्तिगत रूप से यह डेटा होता है, तो शायद कुंजी का उपयोग करते हुए latitude, मैं कुछ ऐसा करूंगा:

$args = array(
    'post_type' => 'my-post-type',
    'meta_query' => array(
        array(
            'key' => 'latitude',
            'value' => '50',
            'compare' => '>'
        )
    )
 );
$query = new WP_Query( $args );

चूँकि मेरे पास _coordinatesपोस्टमैटा के हिस्से के रूप में अक्षांश है , इसलिए यह काम नहीं करेगा।

इसलिए, मेरा प्रश्न meta_queryयह है कि क्या इस परिदृश्य में मेरे जैसे क्रमबद्ध सरणी का उपयोग करने का कोई तरीका है?

जवाबों:


37

नहीं, यह संभव नहीं है, और खतरनाक भी हो सकता है।

मैं दृढ़ता से आपको अपने डेटा को अनसुना करने और अपनी नियमित दिनचर्या को संशोधित करने की सलाह देता हूं। इसके समान कुछ को अपने डेटा को नए प्रारूप में बदलना चाहिए:

$args = array(
    'post_type' => 'my-post-type',
    'meta_key' => '_coordinates',
    'posts_per_page' => -1
 );
$query = new WP_Query( $args );
if($query->have_posts()){
    while($query->have_posts()){
        $query->the_post();
        $c = get_post_meta($post->id,'_coordinates',true);
        add_post_meta($post->ID,'_longitude',$c['longitude']);
        add_post_meta($post->ID,'_latitude',$c['latitude']);
        delete_post_meta($post->ID,'_coordinates',$c);
    }
}

फिर आप अलग-अलग कुंजियों के साथ क्वेरी कर सकेंगे

यदि आपको कई अक्षांशों और कई अक्षांशों को संग्रहीत करने की आवश्यकता है, तो आप एक ही नाम से कई पोस्ट मेटा स्टोर कर सकते हैं। बस के तीसरे पैरामीटर का उपयोग करें get_post_meta, और यह उन सभी को एक सरणी के रूप में वापस कर देगा

आप सीरियल डेटा के अंदर क्वेरी क्यों नहीं कर सकते?

MySQL इसे सिर्फ एक स्ट्रिंग के रूप में देखता है, और इसे संरचित डेटा में अलग नहीं कर सकता है। इसे संरचित डेटा में विभाजित करना ठीक वैसा ही है जैसा कि ऊपर दिया गया कोड है

आप आंशिक रूप से दिनांक के लिए क्वेरी करने में सक्षम हो सकते हैं, लेकिन यह सुपर अविश्वसनीय, महंगा, धीमा और बहुत नाजुक होगा, जिसमें बहुत सारे किनारे मामले होंगे। सीरियल डेटा SQL प्रश्नों के लिए अभिप्रेत नहीं है, और एक नियमित और निरंतर तरीके से स्वरूपित नहीं किया गया है।

आंशिक स्ट्रिंग खोजों की लागतों के अलावा, पोस्ट मेटा क्वेरीज़ धीमी हैं, और क्रमबद्ध डेटा चीजों की लंबाई, सामग्री की लंबाई के आधार पर बदल सकते हैं, अविश्वसनीय रूप से महंगी खोज कर सकते हैं, यदि आप जो मूल्य खोज रहे हैं उसके आधार पर असंभव नहीं है

मेटा में सीरियल ऑब्जेक्ट्स के रूप में रिकॉर्ड्स / एंटिटीज़ / ऑब्जेक्ट्स पर एक नोट

आप पोस्ट मेटा, या उपयोगकर्ता मेटा में डेटा संरचना के कुछ अन्य प्रकार में एक लेनदेन रिकॉर्ड स्टोर करना चाहते हैं, तो ऊपर समस्या में चला सकते हैं।

यहां समाधान व्यक्तिगत पोस्ट मेटा में इसे तोड़ना नहीं है, लेकिन यह महसूस करने के लिए कि इसे कभी भी शुरू करने के लिए मेटा नहीं होना चाहिए, लेकिन एक कस्टम पोस्ट प्रकार। उदाहरण के लिए, एक लॉग या रिकॉर्ड एक कस्टम पोस्ट प्रकार हो सकता है, मूल पद के साथ एक माता-पिता के रूप में, या एक वर्गीकरण शब्द के माध्यम से शामिल हो सकता है

सुरक्षा और सीरियल ऑब्जेक्ट्स

serializeफ़ंक्शन के माध्यम से क्रमबद्ध PHP ऑब्जेक्ट्स को संग्रहीत करना खतरनाक हो सकता है , जो कि वर्डप्रेस के ऑब्जेक्ट को पास करने के रूप में दुर्भाग्यपूर्ण है इसका मतलब यह होगा कि यह क्रमबद्ध हो जाता है। इसका कारण यह है कि जब ऑब्जेक्ट को डी-सीरीज़ किया जाता है, तो एक ऑब्जेक्ट बनाया जाता है, और इसके सभी जागृत तरीके और कंस्ट्रक्टर निष्पादित होते हैं। यह तब तक एक बड़ी बात नहीं लगती जब तक कि उपयोगकर्ता सावधानी से तैयार किए गए इनपुट को छीनने का प्रबंधन नहीं करता है, जब दूरस्थ डेटाबेस निष्पादन के लिए अग्रणी होता है जब डेटा डेटाबेस से पढ़ा जाता है और वर्डप्रेस द्वारा डी-सीरियल किया जाता है।

इसके बजाय JSON के उपयोग से बचा जा सकता है, जो प्रश्नों को भी आसान बनाता है, लेकिन डेटा को सही तरीके से संग्रहीत करना और शुरू करने के लिए संरचित क्रमबद्ध डेटा से बचने के लिए यह बहुत आसान / तेज़ है।


5
पास से गुजरने वाले लोगों के लिए, पढ़ना बंद न करें: अधिक उपयोगी (और हाल ही में) उत्तर नीचे दिए गए हैं
एरेनोर पज़

क्या होगा अगर मेरे पास सहेजने के लिए आईडी की एक सरणी है - और वे प्रत्येक एक अलग कुंजी का प्रतिनिधित्व नहीं करते हैं जो मैं उन्हें 'अक्षांश' आदि के तहत बचा सकता हूं, यह सभी के लिए सिर्फ एक कुंजी है (जैसे कि संबंधों को बचाने के दौरान आदि)। फिर क्या करें? @ रब्बी का हल?
ट्रिनोसियस

1
आप एक से अधिक बार कुंजी स्टोर कर सकते हैं, कुंजी मूल्य जोड़े अद्वितीय नहीं हैं। संबंधों का सवाल है, कि क्या taxonomies, के लिए कर रहे हैं आप कुछ पर कई चीजों को मैप करने के मेटा उपयोग कर रहे हैं, उन्हें एक वर्गीकरण अवधि में बजाय डाल
टॉम जम्मू नॉवेल

24

मैं भी इस स्थिति में दौड़ता हूं। यहाँ मैंने क्या किया:

$args = array(
    'post_type' => 'my-post-type',
    'meta_query' => array(
        array(
            'key' => 'latitude',
            'value' => sprintf(':"%s";', $value),
            'compare' => 'LIKE'
        )
    )
);

उममीद है कि इससे मदद मिलेगी


1
मुझे यह समाधान वास्तव में पसंद आया। दुर्भाग्यवश, यह तब लागू नहीं होता जब $valueआईडी भी होती है। उस स्थिति में, मैं डेटा को सहेजने से पहले प्रत्येक सरणी तत्व में एक चरित्र जोड़ने के लिए फ़ंक्शन बनाने के लिए सुझाव देता हूं और डेटा का उपयोग करने से पहले चरित्र को निकालने के लिए एक और फ़ंक्शन करता हूं। यह वाट, i:2अनुक्रमित सूचकांक i:D2"वास्तविक" डेटा के साथ भ्रमित नहीं होगा । मेटा क्वेरी पैरामीटर तब बनना चाहिए 'value' => sprintf(':"D%s";', $value),और आप इस अद्भुत उत्तर की सही कार्यक्षमता रखेंगे!
एरेनोर पज़

यह समाधान मेरे लिए काम कर रहा है
विशाल

इसने भी मेरे लिए पूरी तरह से काम किया। मिनी घबराहट तब हुई जब मैंने स्वीकृत समाधान देखा
शेन जोन्स

@ Erenor Paz, मैंने अभी एक समाधान पोस्ट किया है जो ID और स्ट्रिंग्स दोनों के साथ अच्छी तरह से काम करता है: wordpress.stackexchange.com/a/299325/25264
पाब्लो एसजी पचेको

का उपयोग कर LIKEअपने सर्वर डाउन (झूठे सकारात्मक उल्लेख करने के लिए नहीं) तो आप बेहतर एक बहुत अच्छा कैशिंग है लाने के लिए एक महान और तेज़ तरीका है।
मार्क कप्लुन

10

WP डेटाबेस में प्रविष्टियों को क्रमबद्ध करते समय आप वास्तव में किसी भी कुशल तरीके से अपने डेटा को क्वेरी करने की क्षमता खोने जा रहे हैं।

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

इसके बजाय, डेटा के लिए क्रमांकन को सहेजें जो आप उस प्रकृति में क्वेरी करने का इरादा नहीं रखते हैं, बल्कि इसके बजाय केवल सीधे WP API कॉल द्वारा एक निष्क्रिय फैशन में पहुंचेंगे get_post_meta()- उस फ़ंक्शन से आप इसके सरणी गुणों को भी एक्सेस करने के लिए क्रमबद्ध प्रविष्टि को अनपैक कर सकते हैं।

वास्तव में के रूप में सच का मूल्य सौंपा ;

$meta = get_post_meta( $post->ID, 'key', true );

एक सरणी के रूप में डेटा लौटाएगा, आपके लिए सामान्य के अनुसार पुनरावृति करने के लिए सुलभ है।

आप अन्य डेटाबेस / साइट ऑप्टिमाइज़ेशन जैसे कैशिंग, सीएसएस और जेएस मिनिमाइज़ेशन पर ध्यान केंद्रित कर सकते हैं और यदि आवश्यक हो तो सीडीएन के रूप में ऐसी सेवाओं का उपयोग कर सकते हैं। नाम के लिए लेकिन कुछ .... वर्डप्रेस कोडेक्स एक अच्छा प्रारंभिक बिंदु है जो उस विषय पर और अधिक उजागर करेगा: यहां


3

मैंने सिर्फ़ अनुक्रमित फ़ील्ड्स के साथ काम किया है और उन्हें क्वेरी कर सकता हूं। मेटा_क्वरी का उपयोग नहीं कर रहा है, लेकिन SQL क्वेरी का उपयोग कर रहा है।

global $wpdb; 

$search = serialize('latitude').serialize(50);

$query = $wpdb->prepare("SELECT `post_id`
FROM `wp_postmeta`
WHERE `post_id` IN (SELECT `ID` FROM `wp_posts` WHERE `post_type` = 'my-post-type')
AND `meta_key` = '_coordinates'
AND `meta_value` LIKE '%s'",'%'.$search.'%');

$ids = $wpdb->get_col($query);

$args = array(
    'post__in' => $ids
    'post_type' => 'team' //add the type because the default will be 'post'
);

$posts = get_posts($args);

क्वेरी पहली बार पोस्टिंग के साथ पोस्टिंग के लिए खोज करती है ताकि wp_postmeta रिकॉर्ड की मात्रा फ़िल्टर करने के लिए कम हो। फिर मैंने आगे फ़िल्टर करके पंक्तियों को कम करने के लिए एक स्टेटमेंट जोड़ा हैmeta_key

Get_posts के लिए आवश्यक सरणी में ID अच्छी तरह से समाप्त हो जाते हैं।

पुनश्च। अच्छे सबकुछ प्रदर्शन के लिए MySQL v5.6 या उच्चतर की आवश्यकता होती है


1

इस उदाहरण ने वास्तव में मेरी मदद की। यह विशेष रूप से S2Members प्लगइन (जो उपयोगकर्ता मेटाडेटा को क्रमबद्ध करता है) के लिए है। लेकिन यह आपको meta_key के भीतर क्रमबद्ध सरणी के एक हिस्से को क्वेरी करने की अनुमति देता है।

यह MySQL REGEXP फ़ंक्शन का उपयोग करके काम करता है।

यहाँ स्रोत है

यहां वह कोड है जो यूएस में रहने वाले सभी उपयोगकर्ताओं से पूछताछ करता है। मैंने अपने कस्टम पंजीकरण फ़ील्ड में से एक को क्वेरी करने के लिए आसानी से संशोधित किया और कुछ ही समय में यह काम कर रहा था।

  <?php
global $wpdb;
$users = $wpdb->get_results ("SELECT `user_id` as `ID` FROM `" . $wpdb->usermeta . 
          "` WHERE `meta_key` = '" . $wpdb->prefix . "s2member_custom_fields' AND 
           `meta_value` REGEXP '.*\"country_code\";s:[0-9]+:\"US\".*'");
if (is_array ($users) && count ($users) > 0)
    {
        foreach ($users as $user)
            {
                $user = /* Get full User object now. */ new WP_User ($user->ID);
                print_r($user); /* Get a full list of properties when/if debugging. */
            }
    }
?>

1

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

array(37,87);

इस तरह एक क्रमबद्ध सरणी के रूप में संग्रहीत किया जाता है

a:2:{i:0;i:37;i:1;i:87;}

i:0सरणी की पहली स्थिति और i:37पहले मान के रूप में ध्यान दें । पैटर्न एक ही है। लेकिन चलो समाधान के लिए चलते हैं


1) REGEXP समाधान

यह समाधान मेरे लिए काम करता है, भले ही मेटा मूल्य को स्ट्रिंग या संख्या / आईडी के रूप में सहेजा जा रहा हो। हालाँकि यह उपयोग करता है REGEXP, जो उपयोग करने में उतना तेज़ नहीं हैLIKE

$args = array(
    'post_type' => 'my-post-type',
    'meta_query' => array(
        array(
            'key' => 'latitude',
            'value' => '\;i\:' . $value . '\;|\"' . $value . '\";',
            'compare' => 'REGEXP'
        )
    )
);

2) समाधान समाधान

मैं प्रदर्शन अंतर के बारे में निश्चित नहीं हूं, लेकिन यह एक समाधान है जो LIKEसंख्या और तार दोनों के लिए उपयोग करता है और काम भी करता है

 $args = array(
        'post_type' => 'my-post-type',
        'meta_query' => array(
            'relation' => 'OR',
            array(
                'key' => 'latitude',
                'value' => sprintf(':"%s";', $value),
                'compare' => 'LIKE'
            ),
            array(
                'key' => 'latitude',
                'value' => sprintf(';i:%d;', $value),
                'compare' => 'LIKE'
            )
        )
    );

REGEXPकुछ स्थितियों में अच्छा है, लेकिन अगर आप उपयोग कर सकते हैं LIKE, तो मुझे लगता है कि यह बेहतर तरीका है। एक पुराना लिंक, लेकिन अभी भी काफी उपयोगी है, मेरी राय में: thingsilearn.wordpress.com/2008/02/28/… :-)
Erenor Paz

@ErenorPaz आप सही हैं। LIKEज्यादा तेज़ है। लेकिन यह एक समाधान है जो तार और संख्या दोनों के लिए काम करता है
पाब्लो एसजी पाचेको

हां..तो, जवाब है (हमेशा की तरह): स्थिति के आधार पर, यदि आप "LIKE" का उपयोग कर सकते हैं; यह बेहतर है, अन्यथा REGEXP के रूप में अच्छी तरह से करेंगे :-)
Erenor पाज़

@ ErenorPaz, मैंने अपने उत्तर को एक नया समाधान जोड़कर संपादित किया जो उपयोग करता है LIKEलेकिन संख्या और तार दोनों के लिए काम करता है। मैं प्रदर्शन के बारे में निश्चित नहीं हूं क्योंकि इसका उपयोग परिणामों की तुलना करना हैOR
पाब्लो एसजी पाचेको

ठीक ठीक !!! जो मुझे इस तरह से परिणाम प्राप्त करने की आवश्यकता है .... धन्यवाद आदमी !!!
कुलदीप मकडिया

0

WP_Queryक्रमबद्ध सरणियों द्वारा एक फ़िल्टरिंग चलाने के लिए युक्तियों का एक गुच्छा पढ़ने के बाद , यहां बताया गया है कि मैंने आखिरकार यह कैसे किया: अनुरोधित मूल्य के लिए अल्पविराम से अलग सूची की खोज $wpdbकरने के FIND_IN_SETलिए कस्टम SQL क्वेरी के साथ संयोजन में अल्पविराम से अलग किए गए अल्पविराम से अलग मानों की एक सरणी बनाकर ।

(यह टॉमस के उत्तर के समान है, लेकिन SQL क्वेरी के लिए इसका प्रदर्शन थोड़ा कम है)

1. कार्यों में।

अपने functions.php फ़ाइल में (या जहाँ भी आप मेटा बॉक्स सेट कर रहे) yourname_save_post()समारोह का उपयोग करें

update_post_meta($post->ID, 'checkboxArray', implode(",", $checkboxArray)); //adding the implode

अल्पविराम से अलग मान वाले सरणी बनाने के लिए।

आप yourname_post_meta()व्यवस्थापक मेटा बॉक्स निर्माण फ़ंक्शन में अपना आउटपुट चर भी बदलना चाहते हैं

$checkboxArray = explode(",", get_post_custom($post->ID)["checkboxArray"][0]); //adding the explode

2. टेम्पलेट PHP फ़ाइल में:

परीक्षण: यदि आप चलाते हैं, तो आपको एक सरणी के रूप में get_post_meta( $id );देखना चाहिए checkboxArrayजिसमें क्रमबद्ध सरणी के बजाय आपके अल्पविराम से अलग मान हैं।

अब, हम अपने कस्टम SQL क्वेरी का उपयोग करके निर्माण करते हैं $wpdb

global $wpdb;

$search = $post->ID;

$query = "SELECT * FROM wp_posts
          WHERE FIND_IN_SET( $search, (
              SELECT wp_postmeta.meta_value FROM wp_postmeta
              WHERE wp_postmeta.meta_key = 'blogLocations'
              AND wp_postmeta.post_id = wp_posts.ID )
          )
          AND ( wp_posts.post_type = 'post' )
          AND ( wp_posts.post_status = 'publish' );";

$posts = $wpdb->get_results($query);

foreach ($posts as $post) {
    //your post content here
}

ध्यान दें FIND_IN_SET, कि जहां जादू होता है।

अब ... जब से मैं SELECT *यह सब पोस्ट डेटा का उपयोग कर रहा हूं और आपके भीतर से foreachआप जो चाहते हैं, उससे गूंज सकते हैं ( print_r($posts);यदि आपको पता नहीं है कि क्या शामिल है। यह "लूप" सेट नहीं करता है) आप (मैं इसे इस तरह से पसंद करता हूं), लेकिन यदि आप चाहें तो लूप सेट करने के लिए इसे आसानी से संशोधित किया जा सकता है ( setup_postdata($post);कोडेक्स पर एक नज़र डालें , आपको संभवतः SELECT *केवल पोस्ट आईडी और $wpdb->get_resultsसही $wpdbप्रकार का चयन करने के लिए बदलना होगा - - उस विषय $wpdbपर जानकारी के लिए कोडेक्स भी देखें )।

Whelp, इसमें थोड़ा प्रयास किया गया, लेकिन चूंकि wp_queryयह 'compare' => 'IN'क्रमबद्ध या अल्पविराम से अलग किए गए मूल्यों का समर्थन नहीं करता है , इसलिए यह शिम आपका सबसे अच्छा विकल्प है!

आशा है कि यह किसी की मदद करता है।


0

यदि आप likeअपनी मेटा क्वेरी में तुलना ऑपरेटर का उपयोग करते हैं , तो इसे क्रमबद्ध सरणी के अंदर देखने के लिए ठीक काम करना चाहिए।

$wp_user_search = new WP_User_Query(array(
    'meta_query' => array(
        array(
            'key'     => 'wp_capabilities',
            'value'   => 'subscriber',
            'compare' => 'not like'
            )
        )
    )
);

का परिणाम:

[query_where] => WHERE 1=1 AND (
  ( wp_usermeta.meta_key = 'wp_capabilities' 
  AND CAST(wp_usermeta.meta_value AS CHAR) NOT LIKE '%subscriber%' )

0

यदि मेरा मेटा डेटा सरणी प्रकार है, तो मैं मेटा द्वारा क्वेरी के लिए इस विधि का उपयोग करता हूं:

$args = array(
    'post_type' => 'fotobank',
    'posts_per_page' => -1,
    'meta_query' => array(
            array(
                   'key' => 'collections',
                   'value' => ':"'.$post->ID.'";',
                   'compare' => 'LIKE'
            )
     )
);
$fotos = new WP_Query($args);

यह अवांछित परिणाम पैदा कर सकता है जब एक पोस्ट आईडी में
अनुक्रमित

0

मैं उपरोक्त उत्तरों के बारे में उत्सुक हो गया, जहां meta_queryकुंजी को latitudeइसके बजाय लक्षित किया गया था _coordinates। जाना और परीक्षण करना था अगर यह वास्तव में मेटा क्वेरीज़ में संभव था कि एक क्रमबद्ध सरणी के अंदर एक विशिष्ट कुंजी को लक्षित करें। :)

जाहिर है कि ऐसा नहीं था।

इसलिए, ध्यान दें कि लक्ष्य की _coordinatesबजाय सही कुंजी है latitude

$args = array(
     'post_type' => 'my-post-type',
     'meta_query' => array(
         array(
             'key' => '_coordinates',
             'value' => sprintf(':"%s";', $value),
             'compare' => 'LIKE'
         )
     )
 );

टिप्पणियाँ:

  1. यह दृष्टिकोण केवल सटीक मैचों को लक्षित करना संभव बनाता है। तो 50 से अधिक सभी अक्षांश जैसी चीजें संभव नहीं हैं।

  2. सबस्ट्रिंग मैचों को शामिल करने के लिए, कोई भी उपयोग कर सकता है 'value' => sprintf(':"%%%s%%";', $value),। (परीक्षण नहीं किया गया है)


-1

मेरे पास भी वही प्रश्न है। शायद आपको 'टाइप' पैरामीटर की आवश्यकता है? इस संबंधित प्रश्न को देखें: कस्टम फील्ड क्वेरी - मेटा वैल्यू एरे है

शायद कोशिश करें:

    $ args = सरणी (
    'post_type' => 'my-post-type',
    'मेटा_क्वारी' => सरणी (
        सरणी (
            'कुंजी' => 'अक्षांश',
            'मान' => '50',
            'तुलना' => '>',
            'टाइप' => 'न्यूमेरिक'
        )
    )
    );

सुझाव के लिए धन्यवाद, लेकिन यह काफी नहीं है कि मैं क्या कर रहा हूँ। समस्या यह है कि मैं जिस मूल्य का मिलान करने की कोशिश कर रहा हूं, वह उस सरणी का एक हिस्सा है जो डेटाबेस के भीतर क्रमबद्ध होता है।
टोलमेनज़

हाँ, तुम सही हो। मैंने आज सुबह कोशिश की और यह मेरे लिए भी काम नहीं किया। मेरे साथ भी वही दिक्कत है। एक सरणी के रूप में मेटा कुंजी का मान संग्रहीत करना। मुझे लगता है कि यह नहीं किया जा सकता है और मुझे इसके बजाय उन्हें एक ही नाम के साथ अलग मेटा फ़ील्ड के रूप में संग्रहीत करना पड़ सकता है ... और बस उन्हें ठीक से हटाने / अद्यतन करने का प्रबंधन करना चाहिए।
user4356

@ user4356 ... ठीक यही मैं करने जा रहा हूं। मैं उन पंक्तियों की संख्या में कटौती करने की उम्मीद कर रहा था जो मैं प्रत्येक पोस्ट के लिए डालूंगा, लेकिन मुझे लगता है कि यह संभव नहीं है।
टॉलमेनज़

-1

मैजिक फील्ड्स प्लगइन का उपयोग करते समय मैं कुछ इसी तरह भाग गया। यह चाल हो सकती है

$values_serialized = serialize(array('50'));
$args = array(
    'post_type' => 'my-post-type',
    'meta_query' => array(
        array(
            'key' => 'latitude',
            'value' => $values_serialized,
            'compare' => '>'
        )
    )
);

1
सलाह के लिये धन्यवाद! मुझे लगता है कि यह उतना ही करीब हो सकता है, लेकिन यह वास्तव में काम नहीं करेगा क्योंकि एक क्रमबद्ध सरणी की तुलना किसी अन्य क्रमबद्ध सरणी से करने से कोई मतलब नहीं है जब तक कि मैं एक सटीक मैच की तलाश में नहीं था।
टोलमेनज़

5
फिर इसे सही उत्तर के रूप में चिह्नित नहीं किया जाना चाहिए और ऐसा करना आपके लिए गैर जिम्मेदाराना है। सही जवाब इस प्रकार होगा 'नहीं, यह संभव नहीं है'
टॉम जम्मू नॉवेल

1
सहमत हूँ, WP आपके लिए क्रमबद्धता को भी संभालता है, serialize()इस उदाहरण में आवश्यक नहीं है ...
एडम

2
वास्तव में @ सेठ-स्टीवेंसन का जवाब बहुत अच्छा है जब उन्होंने "मैजिक फील्ड्स" प्लगइन का उपयोग करते हुए कहा। जैसे कि प्लगइन डिफ़ॉल्ट रूप से कुछ डेटा प्रकार को क्रमबद्ध करता है, यह एक EXACT मैच करने का सबसे अच्छा तरीका है।
zmonteca

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