पोस्ट पर प्रदर्शन पर कस्टम पोस्ट मेटा फ़ील्ड प्रभाव


10

मेरे पास ऐसे पोस्ट हैं जिनमें कई कस्टम परिभाषित मेटा फ़ील्ड हैं। पोस्ट पर मैं उन्हें आवश्यकता के आधार पर बुला रहा हूं get_post_meta। 10 मेटा फ़ील्ड्स के लिए इसका मतलब मैं 10 बार उपयोग कर रहा हूं।

क्या मैं यह ठीक कर रहा हूँ? मतलब, क्या उपरोक्त विधि के साथ कोई प्रदर्शन समस्या है और यदि हाँ तो कॉल की संख्या कैसे कम करें।

मैं यहां उपलब्ध उत्तर से अवगत हूं: कस्टम फील्ड्स और प्रदर्शन जो बताते हैं कि 'सिंगल क्वेरी' का उपयोग। लेकिन यह स्पष्ट नहीं है और ध्वनि फिर से पूछ रही है कि क्या कोई जानता है और विस्तार से साझा करना चाहता है।

जवाबों:


25

इसका उत्तर देने के लिए, मैंने इस पर कुछ परीक्षण किए हैं, और परिणाम वास्तव में मन उड़ाने वाले थे।

यहाँ मेरी परीक्षा है

अपने आप को, एक परीक्षण पृष्ठ के साथ खुद को स्थापित करें। बस copy.php कॉपी करें, इसका नाम बदलें और लूप को हटा दें। अब बस बैक एंड में एक नया पेज बनाएं। प्रारंभ करने से पहले, किसी भी डेटा के बिना प्रश्नों की मात्रा प्राप्त करने के लिए पहले खाली जानकारी के साथ अपने टाइमर का परीक्षण करें

मैंने टेस्ट पोस्ट के लिए पूरी तरह से 5 मेटा फ़ील्ड बनाए हैं,

  • enclosure,
  • First name,
  • Last name,
  • packages तथा
  • post_views_count

मेरे टेस्ट पोस्ट की एक आईडी थी 530। एक पोस्ट के अंदर आप बस पोस्ट आईडी का उपयोग $post->IDया get_the_ID()सेट कर सकते हैं

तो मेरा पहला परीक्षण इस प्रकार था:

<?php               
       timer_start();       

       $a = get_post_meta(530, 'enclosure', true);
       $b = get_post_meta(530, 'First name', true);
       $c = get_post_meta(530, 'Last name', true);
       $d = get_post_meta(530, 'packages', true);
       $e = get_post_meta(530, 'post_views_count', true);
?>
<p><?php echo get_num_queries(); ?> queries in <?php timer_stop(1, 5); ?> seconds. </p>

जिससे मुझे निम्नलिखित परिणाम मिले

0.00195 सेकंड में 1 प्रश्न।

मेरा दूसरा परीक्षण इस प्रकार था:

<?php               
       timer_start();       

       $a = get_post_meta(530);
?>
<p><?php echo get_num_queries(); ?> queries in <?php timer_stop(1, 5); ?> seconds. </p>

जो, आश्चर्यजनक रूप से एक ही परिणाम दिया

0.00195 सेकंड में 1 प्रश्न।

यदि आप स्रोत कोड को get_post_meta()देखते हैं, तो आप देखेंगे कि get_post_meta()बस के लिए एक आवरण है get_metadata()। तो यह आप को देखने की जरूरत है स्रोत कोड के लिए get_metadata(), आपको लगता है कि मेटाडाटा इसे साफ़ कर देखेंगे।

तो आपके प्रश्न पर किसके उपयोग के बारे में और प्रदर्शन के बारे में, इसका उत्तर होगा, यह आप पर निर्भर है। आपने परिणामों में प्रमाण देखा है

मेरी व्यक्तिगत राय में, यदि आपको 10 मेटा डेटा फ़ील्ड को पुनः प्राप्त करने की आवश्यकता है, (या मेरे मामले में 5), मेरे उत्तर में दूसरे दृष्टिकोण का उपयोग करें।

$a = get_post_meta(530);

यह न केवल लिखने के लिए तेज है, बल्कि आपको कोड भी नहीं दोहराना चाहिए। यहां ध्यान देने का एक और बिंदु, दूसरा दृष्टिकोण एक सरणी में सभी मेटा फ़ील्ड रखता है जिसे बहुत आसानी से एक्सेस और पुनर्प्राप्त किया जा सकता है

उदाहरण के रूप में, यहाँ से मेरा आउटपुट है $aअगर मैं avar_dump( $a );

array(9) {
  ["_edit_lock"]=>
  array(1) {
    [0]=>
    string(12) "1414838328:1"
  }
  ["_edit_last"]=>
  array(1) {
    [0]=>
    string(1) "1"
  }
  ["_custom_sidebar_per_page"]=>
  array(1) {
    [0]=>
    string(7) "default"
  }
  ["post_views_count"]=>
  array(1) {
    [0]=>
    string(1) "0"
  }
  ["packages"]=>
  array(1) {
    [0]=>
    string(1) "0"
  }
  ["repeatable_names"]=>
  array(1) {
    [0]=>
    string(79) "a:1:{i:0;a:3:{s:4:"role";s:4:"fool";s:4:"name";s:6:"Pieter";s:3:"url";s:0:"";}}"
  }
  ["enclosure"]=>
  array(1) {
    [0]=>
    string(105) "http://localhost/wordpress/wp-content/uploads/2014/09/Nissan-Navara-Tough-City.avi
13218974
video/avi
"
  }
  ["First name"]=>
  array(1) {
    [0]=>
    string(3) "Tom"
  }
  ["Last name"]=>
  array(1) {
    [0]=>
    string(5) "Storm"
  }
}

अब आप अपनी पोस्ट में दिए गए किसी भी मेटा डेटा को इस प्रकार एक्सेस कर सकते हैं:

echo $a['First name'][0] . " " . $a['Last name'][0] . "<br>";

जो प्रदर्शित करेगा

टॉम तूफान


4
इसे 'वॉक द टॉक' कहा जाता है। अद्भुत जवाब।
अखिलेश

1
मेरी खुशी, खुशी है कि यह आपके लिए काम किया। आनंद लें :-)
Pieter

1
यह बहुत अच्छा है। मैं कस्टम उपयोगकर्ता मेटा के बजाय एक समान परीक्षण देखना पसंद करूंगा।
क्रिस्टीन कूपर

1
निश्चित रूप से यह करने के लायक; ;-) देखेंगे कि मैं अगले कुछ दिनों में क्या कर सकता हूं, अभी कुछ दिन पहले की व्यस्त जोड़ी है @ क्रिसिनकोपर
पीटर गोएल

1
अच्छा! कृपया मुझे इस धागे पर एक लिंक के साथ टैग करें यदि आप इसे कर रहे हैं!
क्रिस्टीन कूपर

0

आप get_post_metaएक बार में सभी मेटा फ़ील्ड मान प्राप्त करने के लिए उपयोग कर सकते हैं ।

$meta = get_post_meta( get_the_ID() );

यह दिए गए पोस्ट के सभी मेटा मानों को लाएगा। व्यक्तिगत रूप से लाने के बजाय उस सरणी का उपयोग करें।


0

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

यह किसी भी कॉल के लिए भी सही है WP_Query। जैसे ही आप कॉल करते हैं WP_Query, वर्डप्रेस एक ही क्वेरी में सभी पुनर्प्राप्त पदों के लिए मेटा डेटा प्राप्त करता है।

सबसे खराब स्थिति यह है कि आप get_post_metaव्यक्तिगत पोस्ट आईडी के लिए कॉल करते हैं जिसे पहले वर्डप्रेस द्वारा पुनर्प्राप्त नहीं किया गया है। इस स्थिति में, प्रत्येक कॉल के get_post_metaपरिणामस्वरूप एक ही क्वेरी होगी।

एक क्वेरी के wp_postmetaअंदर से एक नमूना ट्रेस WP_Query:

SELECT post_id, meta_key, meta_value 
    FROM wp_postmeta 
    WHERE post_id IN (491,347) 
    ORDER BY meta_id ASC

#0 /wp-includes/wp-db.php(1567): wpdb->_do_query('SELECT post_id,...')
#1 /wp-includes/wp-db.php(1958): wpdb->query('SELECT post_id,...')
#2 /wp-includes/meta.php(814): wpdb->get_results('SELECT post_id,...', 'ARRAY_A')
#3 /wp-includes/post.php(5546): update_meta_cache('post', Array)
#4 /wp-includes/post.php(5529): update_postmeta_cache(Array)
#5 /wp-includes/query.php(3614): update_post_caches(Array, 'post', true, true)
#6 /wp-includes/query.php(3836): WP_Query->get_posts()
#7 /wp-includes/query.php(3946): WP_Query->query(Array)
#8 /wp-content/plugins/***/***.php(134): WP_Query->__construct(Array)

जैसा कि आप देख सकते हैं, कॉल भीतर से उत्पन्न होती है get_postsऔर 2 पदों के लिए मेटा डेटा को पुनर्प्राप्त करती है, जो मूल का परिणाम है WP_Query

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