मुझे हाल ही में इसी तरह की समस्या थी, मुझे कस्टम पोस्ट प्रकार से मेटाडेटा के 7 टुकड़े प्राप्त करने की आवश्यकता थी, लेकिन मेटाडेटा के टुकड़े के आधार पर पोस्ट प्राप्त करने की भी आवश्यकता थी।
इसलिए मैंने निम्नलिखित एसक्यूएल स्टेटमेंट बनाया, मैं अक्सर इसका उपयोग करता हूं। उम्मीद है कि यह किसी और की मदद करेगा। मैं कोशिश करता हूं और इसे सबसे अच्छा समझा सकता हूं।
global $wpdb;
$pt = 'clients';
$mk = 'trainerid';
$mv = $pid;
$mk1 = 'email';
$mk2 = 'phone';
$mk3 = 'gender';
$mk4 = 'dob';
$mk5 = 'photo';
$mk6 = 'registrationts';
$mk7 = 'activationts';
$ord = 'p.post_name ASC';
$sql = "
SELECT p.ID, p.post_title AS fullname, pm1.meta_value AS email, pm2.meta_value AS phone, pm3.meta_value AS gender, pm4.meta_value AS dob, pm5.meta_value AS photo, pm6.meta_value AS regts, pm7.meta_value AS actemailts
FROM {$wpdb->posts} p
LEFT JOIN {$wpdb->postmeta} pm ON pm.post_id = p.ID
AND pm.meta_key = '{$mk}'
LEFT JOIN {$wpdb->postmeta} pm1 ON pm1.post_id = p.ID
AND pm1.meta_key = '{$mk1}'
LEFT JOIN {$wpdb->postmeta} pm2 ON pm2.post_id = p.ID
AND pm2.meta_key = '{$mk2}'
LEFT JOIN {$wpdb->postmeta} pm3 ON pm3.post_id = p.ID
AND pm3.meta_key = '{$mk3}'
LEFT JOIN {$wpdb->postmeta} pm4 ON pm4.post_id = p.ID
AND pm4.meta_key = '{$mk4}'
LEFT JOIN {$wpdb->postmeta} pm5 ON pm5.post_id = p.ID
AND pm5.meta_key = '{$mk5}'
LEFT JOIN {$wpdb->postmeta} pm6 ON pm6.post_id = p.ID
AND pm6.meta_key = '{$mk6}'
LEFT JOIN {$wpdb->postmeta} pm7 ON pm7.post_id = p.ID
AND pm7.meta_key = '{$mk7}'
WHERE pm.meta_value = '{$mv}'
AND p.post_type = '{$pt}'
AND p.post_status NOT IN ('draft','auto-draft')
ORDER BY {$ord}
";
$clients = $wpdb->get_results( $wpdb->prepare( $sql ), OBJECT );
सबसे पहले मुझे वर्डप्रेस डेटाबेस फ़ंक्शन वैश्विक $ wpdb के साथ मिलते हैं। फिर मैंने $ pt के साथ पोस्टपाइप सेट किया। सही पोस्ट पाने के लिए जो post_meta में एक विशिष्ट मूल्य से मेल खाता है, मैंने $ mk (meta_key) सेट किया
तब मैंने $ mv (meta_value) var सेट किया। (इस मामले में मेटा वैल्यू एक पोस्टिड से मेल खाता है)
$ mk1- $ mk7 मेटाटेक हैं जिन्हें मैं प्रत्येक पोस्ट से चाहता हूं। (मैं चुनिंदा स्टेटमेंट में मान ले लूंगा)
मैं $ ord को सेट करके 'a' से 'a' ऑर्डर भी करता हूं
चयन विवरण इस प्रकार है: मैं पोस्ट आईडी और पोस्ट_ पोस्ट को पोस्ट या 'पी' से चुनता हूं।
फिर मैं सभी मेटाडेटा का चयन करता हूं जिन्हें मुझे pm1 के साथ चुनने की आवश्यकता है। -> pm.7 और मेटा_वेल्यू को हथियाने और उन्हें (एएस) का नाम बदलने से इसलिए यह अधिक पठनीय है जब मेरी वस्तु के लिए डेटा पुनर्प्राप्त किया जाता है।
मैं मेटा डेटा के लिए एक LEFT JOIN बनाता हूं जिसकी मुझे पोस्ट से मिलान करने की आवश्यकता है। (बजे)
मैं प्रत्येक मेटा डेटा को पुनः प्राप्त करने के लिए 7 लेफ्ट जॉइन बनाता हूं। (PM1-PM7)
WHERE का स्टेटमेंट पहले LEFT JOIN (pm) पर आधारित है, ताकि यह पता चले कि मुझे केवल उन्हीं पोस्ट्स की आवश्यकता है जहाँ मेटाडेटा का मिलान होता है।
मैं पोस्ट प्रकार के लिए एक 'AND' भी जोड़ता हूं, और पोस्ट_स्टैटस के लिए जो ड्राफ्ट नहीं हैं। (इसलिए केवल प्रकाशित पोस्ट)
अंत में मैं क्लॉज द्वारा 'ऑर्डर' जोड़ देता हूं।
यह तेजी से और वर्डप्रेस में अंतर्निहित इंडेक्स के साथ काम करता है, इसलिए यह कुशल लगता है।
पता नहीं अगर कुछ इस से बेहतर है, लेकिन अगर यह है, तो मैं इसका इस्तेमाल करना पसंद करूंगा।
उम्मीद है की यह मदद करेगा।
मार्कस
get_post_meta
अलग-अलग कुंजियों पर चलाने केget_post_custom
लिए , 2) एक पोस्ट में सभी कस्टम फ़ील्ड प्राप्त करने के लिए चलाएं , या 3)get_results()
अपनी खुद की वापसी वस्तु बनाने के लिए $ wpdb वर्ग ( ) का उपयोग करके अपनी खुद की क्वेरी बनाएं। । ($ wpdb वर्ग प्रलेखन: codex.wordpress.org/Class_Reference/wpdb )