2017-08-28 7 views
8

पृष्ठभूमिmeta_query साथ परिसर custom_field खोज

मैं उपयोग कर रहा हूँ उन्नत कस्टम फील्ड्स प्रो मेरी कस्टम फ़ील्ड का प्रबंधन करने और वे एक "पुनरावर्तक" क्षेत्र है जो कि repeatername_X_fieldname के रूप में जमा हो जाती है उप क्षेत्रों शामिल है जहां X पंक्ति संख्या है पुनरावर्तक का।

मेरे पास एक कस्टम पोस्ट प्रकार student है जिसमें दोहराव attendance है जिसमें date और class शामिल है। 'Attendance_X_date' meta_value:: '20,170,701'

  • meta_key: 'attendance_X_class'

    तो, जब एक छात्र एक वर्ग में आती है, यह उनकी उपस्थिति के रूप में इस प्रकार है

    • meta_key स्टोर करेगा meta_value: 'इतिहास 101'

    इन या किसी भी छात्र जो एक निश्चित वर्ग के लिए किया गया है, या एक निश्चित तिथि सीमा के भीतर भाग लिया के लिए खोज करने der, मैं get_meta_sql पर हुक और मेरे meta_queryLIKE बजाय = उपयोग करने के लिए जब मूल्य %

    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 EXISTSON में उपयोग नहीं किया जाता है और इस प्रकार परीक्षण के लिए IS NULL का उपयोग नहीं कर सकता है।

    मुझे समझ में आया कि यह बहुत जटिल था और यदि आप मेरे पीछे आए, तो मैं पूरी तरह से प्रभावित हूं। यदि नहीं, तो कृपया प्रश्न पूछें ताकि मैं स्पष्टीकरण में सहायता कर सकूं।

    हां, मुझे पता है कि मैं पूरी तरह से अपनी खुद की क्वेरी लिख सकता हूं, लेकिन मैं वर्डप्रेस टूल्स में निर्मित होने की कोशिश कर रहा हूं।

    सहायता!

  • उत्तर

    3

    मैं वहां गया हूं ... सभी को एक जटिल मेटा क्वेरी में रखने की कोशिश कर रहा हूं। अंत में आप मैन्युअल रूप से उत्पन्न एसक्यूएल कार्रवाई करने के लिए की जरूरत है - चलती कोष्ठक, ऑपरेटरों, उद्धरण, आदि

    की जगह अंत में क्वेरी बहुत जटिल है और कई postmeta तालिका यह बहुत महंगा है और धीमी हो जाती है को कार्यभार संभाला है।

    मैंने थोड़ा अलग दृष्टिकोण चुनकर इसे हासिल करना चुना है।

    /* Filter by class */ 
    $history_students_ids = get_posts(array(
        'post_type'  => 'student', 
        'fields'   => 'ids', 
        'posts_per_page' => -1, 
        'meta_query'  => array(
         array(
          'key'=>'attendance_%_class', 
          'compare'=>'=', 
          'value'=>'History 101' 
         ), 
        ) 
    )); 
    
    /* Filter by date */ 
    $students = get_posts(array(
        'post_type' => 'student', 
        'post__in' => $history_students_ids, 
        'meta_query' => array(
         array(
          'key'=>'attendance_%_date', 
          'compare'=>'>=', 
          'value'=>'20170101' 
         ) 
        ) 
    )); 
    

    ही के लिए चला जाता है: तो, आप क्या कर सकते समस्या भाग 1 के लिए कई उप प्रश्नों का क्वेरी विभाजित और post__in और post__not_in साथ बाद में उन्हें गठबंधन,

    उदाहरण के लिए है समस्या हिस्सा 2

    $not_attended_history_students_ids = get_posts(array(
        'post_type' => 'student', 
        'post__in' => $history_students_ids, 
        'fields'   => 'ids', 
        'posts_per_page' => -1, 
        'meta_query' => array(
         array(
          'key'=>'attendance_%_date', 
          'compare'=>'NOT EXISTS' 
         ) 
        ) 
    )); 
    
    $students = get_posts(array(
        'post_type' => 'student', 
        'post__in' => $not_attended_history_students_ids, 
        'meta_query' => array(
         array(
          'key'=>'attendance_%_date', 
          'compare'=>'>=', 
          'value'=>'20170101' 
         ) 
        ) 
    )); 
    

    आप उपस्थिति हालत को उल्टा कर सकते मौजूद हो सकता है औरउपयोग करने के लिए... मुझे आशा है कि आप इस विचार को समझने में कामयाब रहे हैं।

    +0

    पहली नज़र से, यह एक अच्छा समाधान की तरह लगता है। जैसे ही मुझे मौका मिलता है, मैं इसका परीक्षण करूंगा और आपको बता दूंगा। – trex005

    +0

    ठीक है। यह भाग 2 के लिए बहुत अच्छा काम करता है। हालांकि भाग 1 में अभी भी एक ही समस्या है। उदाहरण के लिए, यदि पिछले वर्ष "छात्र 1" ने "इतिहास 101" में भाग लिया, तो वह पहले 'get_posts' परिणाम में होगा। फिर, अगर वह इस वर्ष "इतिहास 102" में भाग लिया, तो वह दूसरे 'get_posts' में होगा। – trex005

    +0

    दूसरे लूप में Wp_query post__not_in (https://codex.wordpress.org/Class_Reference/WP_Query) आज़माएं – GNANA

    संबंधित मुद्दे