क्या wp_query एक ही अनुरोध में मेटा में रिटर्न पोस्ट कर सकता है?


22

मैं एक wp_query बनाना चाहूंगा जो पोस्ट्स को मेटा के अंदर लौटा दे posts

$args = array (
    'post_type' => 'page',
    'meta_key' => 'someMetaKeyName',
);

// The Query
$query = new WP_Query( $args );

यह कुछ इस तरह देता है:

यहाँ छवि विवरण दर्ज करें

जैसा कि आप देख सकते हैं कि पोस्टों में कोई मेटा डेटा नहीं है, क्या मेटा डेटा को वापस दिए गए सरणी में शामिल करना संभव है?

PS मुझे प्रदर्शन कारणों से अतिरिक्त wp_queries नहीं चाहिए।


2
मानक WP_Query मेटा डेटा पोस्ट नहीं करता है। आपके पास एकमात्र विकल्प हैं: 1) get_post_metaअलग-अलग कुंजियों पर चलाने के get_post_customलिए , 2) एक पोस्ट में सभी कस्टम फ़ील्ड प्राप्त करने के लिए चलाएं , या 3) get_results()अपनी खुद की वापसी वस्तु बनाने के लिए $ wpdb वर्ग ( ) का उपयोग करके अपनी खुद की क्वेरी बनाएं। । ($ wpdb वर्ग प्रलेखन: codex.wordpress.org/Class_Reference/wpdb )
Boda82

जवाबों:


20

डिफ़ॉल्ट रूप से, पदों के लिए WP_Queryमानक WP_Postवस्तुओं को वापस किया जा रहा है। मेरा मानना ​​है कि कुछ चतुर पुन: लिखने और WP_Queryआपके द्वारा दिए गए फिल्टर के उपयोग से वस्तुओं को लौटे WP_Postऑब्जेक्ट सरणी में जोड़ा जा सकता है ।

क्या यह प्रदर्शनकारी होगा? मेरी राय में, यह प्रदर्शन और अधिक नुकसान होगा के रूप में आप अपने प्रश्न में परिणाम में शामिल होने के रूप में कस्टम फ़ील्ड में बचाया नहीं गया है की आवश्यकता होगी wp_postsमेज, लेकिन में wp_postmetaतालिका

पोस्ट मेटा को पुनः प्राप्त करना वास्तव में तेज़ है और इसके लिए किसी भी अतिरिक्त उदाहरण की आवश्यकता नहीं है WP_Query। आप बस कस्टम फ़ील्ड के साथ कॉल कर सकते हैं get_post_meta()। कस्टम फ़ील्ड पेश किए जाने पर वर्डप्रेस बहुत विचारशील था। उन्होंने उन्हें कैश करने के लिए एक कैश जोड़ा, इसलिए चाहे आप 1 या 100 कस्टम फ़ील्ड को क्वेरी कर रहे हों, आप एक बार डेटाबेस को मार रहे हैं, सुपरफास्ट। एक पूर्ण परीक्षण और स्पष्टीकरण के लिए, इस पोस्ट को मैंने हाल ही में इस विषय पर किया है।

मेरी राय में, अतिरिक्त डेटाबेस कॉल और खर्च किया गया वास्तविक समय इसके लायक है और WP_Queryइस तरह से पुनर्लेखन की तुलना में तेजी से मानक पोस्ट ऑब्जेक्ट में कस्टम फ़ील्ड शामिल करना है।$posts


ठीक है, धन्यवाद, मैं इसे एक के रूप में स्वीकार करूँगा, लेकिन ईमानदारी से get_post_meta()हर एक पोस्ट के लिए कॉल करने में बहुत परेशानी होती है .. मैं बल्कि अतिरिक्त डेटा को सीधे wp_postsतालिका में संग्रहीत करने का एक तरीका था , या एक में संबंधित तालिका जो मन की बात नहीं है * ck जितना wp_postsmetaहै।
यमसाल्ट

खैर, ईमानदार होने के लिए, चाहे वह कॉलिंग हो get_post_meta()या पोस्ट ऑब्जेक्ट के रूप में, आपको इसे हर पोस्ट पर कॉल करना होगा। यह टेम्प्लेट टैग के साथ समान है the_content(), आपको इसे हर पोस्ट पर कॉल करना होगा।
पीटर गोएन्स ने

2
इसका मतलब है कि अगर आपको 120 पोस्ट दिखाने हैं तो आपके पेज में 120 अतिरिक्त प्रश्न होंगे?
चिफ्लिइआइ

सभी पोस्टडेटा कैश में सहेजे जाते हैं, इसलिए कैल होने पर आपके पास अतिरिक्त प्रश्न नहीं होंगे; पोस्टिंग मेटा
पीटर गोएप

तुम सही हो। मैं post_thumbnails का जिक्र कर रहा था लेकिन मुझे हाल ही में अपडेट_पोस्ट_थंबनेल_चे ($ the_query) मिला। स्पष्टीकरण के लिए वैसे भी धन्यवाद
chifliiiii

4

यह प्रश्न 1 वर्ष से अधिक पुराना है, लेकिन मेरे पास एक ही प्रोब्लोमलेम है, और यहां फ़ंक्शन है जो प्रत्येक मेटा_वल्यू और मेटा_की को $ wp_query ऑब्जेक्ट में जोड़ देगा

लूप करते समय प्रत्येक पोस्ट मेटा के बजाय, यह फ़ंक्शन एक अतिरिक्त क्वेरी उदाहरण देगा:

"Meta_key, meta_value, post_id से $ wpdb-> postmeta WHERE post_id IN (1,2,3,4,5 ...) का चयन करें"

जहां (1,2,3,4,5 ...) $ wp_query से उत्सुकता से पोस्ट आईडी है

if(!function_exists('add_query_meta')) {
  function add_query_meta($wp_query = "") {

      //return In case if wp_query is empty or postmeta already exist
      if( (empty($wp_query)) || (!empty($wp_query) && !empty($wp_query->posts) && isset($wp_query->posts[0]->postmeta)) ) { return $wp_query; }

      $sql = $postmeta = '';
      $post_ids = array();
      $post_ids = wp_list_pluck( $wp_query->posts, 'ID' );
      if(!empty($post_ids)) {
        global $wpdb;
        $post_ids = implode(',', $post_ids);
        $sql = "SELECT meta_key, meta_value, post_id FROM $wpdb->postmeta WHERE post_id IN ($post_ids)";
        $postmeta = $wpdb->get_results($sql, OBJECT);
        if(!empty($postmeta)) {
          foreach($wp_query->posts as $pKey => $pVal) {
            $wp_query->posts[$pKey]->postmeta = new StdClass();
            foreach($postmeta as $mKey => $mVal) {
              if($postmeta[$mKey]->post_id == $wp_query->posts[$pKey]->ID) {
                $newmeta[$mKey] = new stdClass();
                $newmeta[$mKey]->meta_key = $postmeta[$mKey]->meta_key;
                $newmeta[$mKey]->meta_value = maybe_unserialize($postmeta[$mKey]->meta_value);
                $wp_query->posts[$pKey]->postmeta = (object) array_merge((array) $wp_query->posts[$pKey]->postmeta, (array) $newmeta);
                unset($newmeta);
              }
            }
          }
        }
        unset($post_ids); unset($sql); unset($postmeta);
      }
      return $wp_query;
  }
}

Additioanal "postmeta" प्रत्येक $ wp_query-> पोस्ट [$ i] को लिखा जाएगा

$wp_query->posts[0]->postmeta

उदाहरण के लिए 'someMetaKeyName' डॉन के साथ रखना मत भूलना

add_query_meta() आपके विषय के लिए

$args = array (
    'post_type' => 'page',
    'meta_key' => 'someMetaKeyName',
);

// The Query
$query = new WP_Query( $args );
if($wp_query->have_posts()) {
  $wp_query = add_query_meta($wp_query);
    $i = 0;
    while($wp_query->have_posts()) {
      $wp_query->the_post();
      $post_id = get_the_id();

      //Get $someMetaKeyName in current post
      foreach($wp_query->posts[$i]->postmeta as $k => $v) {
        switch($v->meta_key) {
          case('someMetaKeyName') : {
            $someMetaKeyName = $v->meta_value;
            break;
          }
        }
      }

      //Your Code here
      //Example 
      echo isset($someMetaKeyName) ? '<h3>'.$someMetaKeyName.'</h3>' : '';


      $i++;
    }
}

मुझे यह समाधान पसंद है।
आर्मस्ट्रांगेस्ट

3

मुझे हाल ही में इसी तरह की समस्या थी, मुझे कस्टम पोस्ट प्रकार से मेटाडेटा के 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' भी जोड़ता हूं, और पोस्ट_स्टैटस के लिए जो ड्राफ्ट नहीं हैं। (इसलिए केवल प्रकाशित पोस्ट)

अंत में मैं क्लॉज द्वारा 'ऑर्डर' जोड़ देता हूं।

यह तेजी से और वर्डप्रेस में अंतर्निहित इंडेक्स के साथ काम करता है, इसलिए यह कुशल लगता है।

पता नहीं अगर कुछ इस से बेहतर है, लेकिन अगर यह है, तो मैं इसका इस्तेमाल करना पसंद करूंगा।

उम्मीद है की यह मदद करेगा।

मार्कस


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

0

हे कृपया इसे आज़माएं मुझे लगता है कि यह ठीक काम करता है।

$args = array(
            'post_type' => 'page',
            'meta_key' => 'someMetaKeyName',
            'meta_query' => array(
                array(
                        'key' => 'someMetaKeyName',
                        'type' => 'CHAR',
                   ),
                ),
        );

    $query = new WP_Query( $args );

क्या कारण है कि आपने इस्तेमाल किया meta_keyऔर meta_query[]['key']साथ ही साथ?
कैसर

1
नहीं, यह काम नहीं करता है और उनके साथ जुड़े मेटा के बिना पदों की सरणी को वापस लाता है।
यमसाल्ट

3
meta_keyऔर / या meta_queryलौटाए गए परिणामों के प्रकार को संशोधित न करें, केवल क्वेरी ही।
बोडा8282
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.