पृष्ठभूमिmeta_query साथ परिसर custom_field खोज
मैं उपयोग कर रहा हूँ उन्नत कस्टम फील्ड्स प्रो मेरी कस्टम फ़ील्ड का प्रबंधन करने और वे एक "पुनरावर्तक" क्षेत्र है जो कि repeatername_X_fieldname
के रूप में जमा हो जाती है उप क्षेत्रों शामिल है जहां X पंक्ति संख्या है पुनरावर्तक का।
मेरे पास एक कस्टम पोस्ट प्रकार student
है जिसमें दोहराव attendance
है जिसमें date
और class
शामिल है। 'Attendance_X_date' meta_value:: '20,170,701'
तो, जब एक छात्र एक वर्ग में आती है, यह उनकी उपस्थिति के रूप में इस प्रकार है
- meta_key स्टोर करेगा meta_value: 'इतिहास 101'
इन या किसी भी छात्र जो एक निश्चित वर्ग के लिए किया गया है, या एक निश्चित तिथि सीमा के भीतर भाग लिया के लिए खोज करने der, मैं get_meta_sql
पर हुक और मेरे meta_query
LIKE
बजाय =
उपयोग करने के लिए जब मूल्य %
function key_rewrite($parts){
foreach($parts as &$part){
$part = preg_replace("/(meta_key =)(\'[^']*[%][^']*\')/", "meta_key LIKE $2", $part);
}
return $parts;
}
add_action('get_meta_sql', 'key_rewrite');
शामिल कन्वर्ट करने के लिए है यह मैं किसी को जो इतिहास 101 या
$args = array(
'post_type' => 'student',
'meta_query' => array(
array(
'key'=>'attendance_%_date',
'compare'=>'>=',
'value'=>'20170101'
)
)
);
में भाग लिया है के लिए खोज करने के क्रम में की तरह $args = array(
'post_type' => 'student',
'meta_query' => array(
array(
'key'=>'attendance_%_class',
'compare'=>'=',
'value'=>'History 101'
)
)
);
$my_query = new WP_Query($args);
कुछ करने के लिए अनुमति देता है
इस वर्ष में शामिल किसी भी व्यक्ति की तलाश करने के लिए।
समस्या भाग 1
मैं किसी को जो 'इतिहास 101' इस साल में भाग लिया है के लिए खोज करने में सक्षम होना चाहिए।
प्रारंभ में, यह लग सकता है कि एक सरल और meta_query पर चाल करना होगा:
$args = array(
'post_type' => 'student',
'meta_query' => array(
'relation' => 'AND',
array(
'key'=>'attendance_%_class',
'compare'=>'=',
'value'=>'History 101'
),
array(
'key'=>'attendance_%_date',
'compare'=>'>=',
'value'=>'20170101'
)
)
);
हालांकि, क्योंकि वाइल्डकार्ड जुड़े हुए नहीं हैं, यह वास्तव में कोई है जो 'इतिहास 101' पिछले साल में भाग लिया लौट सकते हैं , लेकिन इस साल एक अलग वर्ग।
समस्या भाग 2
मैं वास्तव में सभी लोगों की सूची है जो 'इतिहास 101' इस साल में भाग लिया है, लेकिन पिछले सप्ताह में बिल्कुल भी वर्ग के लिए ऊपर नहीं दिखाया गया प्राप्त करने में सक्षम होने की जरूरत है । यह समस्या को और जटिल करता है क्योंकि मुझे अतिरिक्त स्थिति के साथ मेटा_क्वायरी EXISTS
और NOT EXISTS
को गठबंधन करने की आवश्यकता है।फिर से, सतह पर, यह काफी सरल नेस्ट meta_queries का उपयोग कर लगता है:
$args = array(
'post_type' => 'student',
'meta_query' => array(
'relation' => 'AND',
array(
'relation' => 'AND',
array(
//Just assume by some magic we resolved Problem part 1
'key'=>'attendance_%_class',
'compare'=>'=',
'value'=>'History 101'
),
array(
'key'=>'attendance_%_date',
'compare'=>'>=',
'value'=>'20170101'
)
),
array(
'relation' => 'AND',
array(
//again... magic!
'key'=>'attendance_%_class',
'compare'=>'=',
'value'=>'History 101'
),
array(
'key'=>'attendance_%_date',
'compare'=>'>',
'value'=>'20170821'
),
array(
'key'=>'attendance_%_date',
'compare'=>'NOT EXISTS'
)
)
)
);
जाहिर है इस तार्किक समस्याओं के साथ किए गए है, लेकिन प्रभावशाली वर्डप्रेस उनमें से ज्यादातर को हल करती है postmeta तालिका में मेटा क्वेरी में उपयोग के प्रति एक बार में शामिल होने से । दुर्भाग्य से इसका मतलब है कि> दिनांक भाग NOT EXISTS
ON
में उपयोग नहीं किया जाता है और इस प्रकार परीक्षण के लिए IS NULL
का उपयोग नहीं कर सकता है।
मुझे समझ में आया कि यह बहुत जटिल था और यदि आप मेरे पीछे आए, तो मैं पूरी तरह से प्रभावित हूं। यदि नहीं, तो कृपया प्रश्न पूछें ताकि मैं स्पष्टीकरण में सहायता कर सकूं।
हां, मुझे पता है कि मैं पूरी तरह से अपनी खुद की क्वेरी लिख सकता हूं, लेकिन मैं वर्डप्रेस टूल्स में निर्मित होने की कोशिश कर रहा हूं।
सहायता!
पहली नज़र से, यह एक अच्छा समाधान की तरह लगता है। जैसे ही मुझे मौका मिलता है, मैं इसका परीक्षण करूंगा और आपको बता दूंगा। – trex005
ठीक है। यह भाग 2 के लिए बहुत अच्छा काम करता है। हालांकि भाग 1 में अभी भी एक ही समस्या है। उदाहरण के लिए, यदि पिछले वर्ष "छात्र 1" ने "इतिहास 101" में भाग लिया, तो वह पहले 'get_posts' परिणाम में होगा। फिर, अगर वह इस वर्ष "इतिहास 102" में भाग लिया, तो वह दूसरे 'get_posts' में होगा। – trex005
दूसरे लूप में Wp_query post__not_in (https://codex.wordpress.org/Class_Reference/WP_Query) आज़माएं – GNANA