क्या wp_defer_term_counting का उपयोग करने का एक नकारात्मक पहलू है?


11

मेरे पास 2 मिलियन से अधिक पोस्ट के साथ एक वर्डप्रेस डेटाबेस है। जब भी मैं एक नया पोस्ट डालता हूं मुझे कॉल करना wp_set_object_termsहोता है जिसे निष्पादित करने में दो सेकंड लगते हैं। मुझे इस पोस्ट के बारे में पता चला है wp_defer_term_countingजो शब्द की गिनती को छोड़ने के लिए कॉल करने की सलाह देता है ।

यदि मैं इस दृष्टिकोण का उपयोग करता हूं तो क्या वर्डप्रेस के कामकाज के गंभीर परिणाम हैं?

यहां लिंक से मृत होने पर बस पोस्ट से कोड है:

function insert_many_posts(){
  wp_defer_term_counting(true);
  $tasks = get_default_tasks(); 
  for ($tasks as $task){
     $post = array(
       'post_title' => $task[content],
       'post_author' => $current_user->ID,
       'post_content' => '',
       'post_type' => 'bpc_default_task',
       'post_status' => 'publish'
     );
     $task_id = wp_insert_post( $post );

     if ( $task[category] )
        //Make sure we're passing an int as the term so it isn't mistaken for a slug
        wp_set_object_terms( $task_id, array( intval( $category ) ), 'bpc_category' );
  }
}

जवाबों:


8

इस मुद्दे पर कुछ विचार दिए गए हैं, लेकिन कृपया ध्यान दें कि यह कोई निर्णायक जवाब नहीं है क्योंकि कुछ चीजें हो सकती हैं जिनकी मैंने अनदेखी की है, लेकिन यह आपको संभावित गोचरों को एक अंतर्दृष्टि देनी चाहिए।


हां, तकनीकी रूप से इसके परिणाम हो सकते हैं।

जहां कॉलिंग wp_defer_term_counting(true)वास्तव में फायदेमंद हो जाती है, उदाहरण के लिए जब आप पदों के डेटाबेस में एक बड़े पैमाने पर सम्मिलन कर रहे हैं और प्रक्रिया के हिस्से के रूप में प्रत्येक ऑब्जेक्ट को शर्तें सौंपी जाती हैं।

ऐसे मामले में आप निम्न कार्य करेंगे:

wp_defer_term_counting(true); //defer counting terms

//mass insertion or posts and assignment of terms here

wp_defer_term_counting(false); //count terms after completing business logic

अब आपके मामले में, यदि आप एक समय में केवल एक ही पोस्ट डाल रहे हैं, तो टर्म काउंटिंग समाप्त हो जाएगी, फिर भी wp_defer_term_counting(false)आपके ऑपरेशन के बाद आपको कॉल न करने से लाभ होगा, और यदि आप पर भरोसा करते हैं, तो आप और या अन्य पक्षों को बाध्य कर सकते हैं। किसी अन्य तर्क / प्रसंस्करण, सशर्त या अन्यथा के लिए शब्द गणना।

आगे समझाने के लिए, आप कहते हैं कि आप निम्नलिखित कार्य करते हैं:

मान लें कि हमारे पास एक टैक्सोनॉमी नामक 3 शब्द हैं product_cat, उन शर्तों के लिए आईडी क्रमशः 1 (शब्द का नाम ए), 2 (शब्द का नाम बी) और 3 (शब्द का नाम सी) है।

उपरोक्त शर्तों में से प्रत्येक में पहले से ही 5(उदाहरण के लिए) की एक शब्द गणना है ।

फिर ऐसा होता है ...

wp_defer_term_counting(true); //defer counting terms

$post_id = wp_insert_post($data);

wp_set_object_terms($post_id, array(1, 2, 3), 'product_cat');

फिर बाद में आपके तर्क में आप शब्द लाने का फैसला करते हैं क्योंकि आप उस शब्द से जुड़ी वस्तुओं की मात्रा का आकलन करना चाहते हैं और परिणाम के आधार पर कुछ अन्य कार्रवाई करते हैं।

तो आप ऐसा करें ...

$terms = get_the_terms($post_id, 'product_cat');

//let's just grab the first term object off the array of returned results
//for the sake of this example $terms[0] relates to term_id 1 (A)
echo $terms[0]->count; //result 5

//dump output of $terms above
array (
  0 => 
  WP_Term::__set_state(array(
     'term_id' => 1,
     'name' => 'A',
     'slug' => 'a',
     'term_group' => 0,
     'term_taxonomy_id' => 1,
     'taxonomy' => 'product_cat',
     'description' => '',
     'parent' => 0,
     'count' => 5, //notice term count still equal to 5 instead of 6
     'filter' => 'raw',
  )),
)

हमारे उदाहरण के मामले में, हमने कहा कि नाम A (term_id 1) में पहले से ही 5 ऑब्जेक्ट्स जुड़े हुए हैं, दूसरे पासवर्ड में पहले से ही 5 की एक टर्म काउंट है।

इसलिए हम countउपरोक्त ऑब्जेक्ट पर पैरामीटर को 6 होने की उम्मीद करेंगे, लेकिन क्योंकि आपने wp_defer_term_counting(false)अपने ऑपरेशन के बाद कॉल नहीं किया था , तो लागू शब्द टर्म ए (बी या सी) के लिए अपडेट नहीं किए गए थे।

इसलिए यह आपके ऑपरेशन के बाद कॉल किए बिना कॉल करने का परिणाम है ।wp_defer_term_counting(true)wp_defer_term_counting(false)

अब सवाल यह है कि क्या इसका प्रभाव आप पर पड़ता है? क्या होगा यदि आपको कॉल करने get_the_termsया कुछ कार्रवाई करने की आवश्यकता नहीं है जो उस शब्द को पुनर्प्राप्त करता है जहां आप countकुछ अन्य ऑपरेशन करने के लिए मूल्य का उपयोग करते हैं? वैसे उस मामले में महान, आपके लिए कोई समस्या नहीं है

लेकिन ... क्या होगा अगर किसी और को फ़ंक्शन set_object_termsमें कार्रवाई पर आदी किया जाता है wp_set_object_terms()और वे टर्म काउंट सही होने पर भरोसा कर रहे हैं? अब आप देखें कि परिणाम कहां से उत्पन्न हो सकते हैं।

या क्या होगा यदि अनुरोध समाप्त होने के बाद, एक अन्य अनुरोध किया जाता है जो एक वर्गीकरण अवधि को पुनः प्राप्त करता है और countसंपत्ति का उपयोग अपने व्यापार तर्क में करता है? यह एक समस्या हो सकती है।

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

जैसा कि वैकल्पिक उत्तर में उल्लेख किया गया है, टैक्सोनॉमी सूची तालिका में देखी गई गणना को भी अपडेट नहीं किया जाएगा।

वास्तव में आप टर्म काउंटिंग को स्थगित करने के बाद टर्म काउंट को अपडेट करने का एकमात्र तरीका है और आपका अनुरोध समाप्त हो गया है, wp_update_term_count($terms, $taxonomy)तब तक मैन्युअल रूप से कॉल या प्रतीक्षा करें जब तक कि कोई व्यक्ति टैक्सोनोमी यूआई या प्रोग्राम के माध्यम से दिए गए टैक्सोनॉमी के लिए कोई शब्द नहीं जोड़ता है।

सोच के लिए भोजन।


1
मुझे लगता है कि आप इसे शानदार ढंग से जोड़ते हैं। यह सब इस बात पर निर्भर करता है कि क्या आप वास्तविक शब्द गणना का उपयोग करने जा रहे हैं, जहां तक ​​मैं संबंधित स्रोत कोड के माध्यम से खुदाई कर सकता हूं
Pieter Goosen

3
हाँ, मुझे लगा कि यह एक दिलचस्प सवाल है, इसलिए मुझे गहराई से खुदाई करनी थी ... लगता है कि केवल एक ही मुद्दा है यदि आपको एक ही अनुरोध के दौरान और अनुरोध समाप्त होने के बाद भी एक सटीक गणना की आवश्यकता होती है। इसके बारे में सोचने के लिए आओ, अगर कोई भी किसी भी गंभीर व्यावसायिक तर्क के लिए गणना शब्द पर भरोसा कर रहा है तो आपको गारंटी नहीं दी जा सकती है कि आप जो देख रहे हैं वह वास्तव में सही गणना है। आपको wp_update_term_count()अपने मान का उपयोग करने से पहले गिनती (जैसे ) को मैन्युअल रूप से आज़माना और अपडेट करना होगा । मुझे अंदाजा नहीं था कि ऐसा ही होगा।
एडम

बहुत व्यापक जवाब। जब से मैं वास्तव में एक मास इन्सर्ट कर रहा हूँ, आपने जो बताया है उससे मुझे शर्तों के माध्यम से लूप करने की आवश्यकता है और wp_update_term_count($terms, $taxonomy)प्रत्येक पर कॉल करें , सही?
कालेंजी

2
वर्डप्रेस कभी एक अशिष्ट जागृति देने में विफल रहता है। मैं मानता चाहिए, एक कभी कभी अधिक सिर्फ सामान्य रूप में कोर में चारों ओर भरने से ;-) इस तरह के सवालों का जवाब दे सीख
पीटर गूसेन

1
यदि आप बड़े पैमाने पर इंसर्ट कर रहे हैं, तो मैं करूंगा wp_defer_term_counting(true), फिर इनसेट करेंwp_defer_term_counting(false) । केवल कारण जिसे आप wp_update_term_count()सीधे कॉल करेंगे यदि आपने term_ids को एक क्षणिक में संग्रहीत किया है, तो पूरी तरह से गिनती को स्थगित कर दें, लेकिन उदाहरण के लिए पर्दे के पीछे एक AJAX अनुरोध को बंद कर दें, क्षणिक को पकड़ें, फिर मैन्युअल रूप से कॉल करें wp_update_term_count()या क्रोन-जॉब या समान का उपयोग करें । तो कॉल करते समय एक ही अनुरोध में हैं (से पहले निष्पादन पूरी तरह से समाप्त हो जाता है) wp_defer_term_counting(false)कॉल wp_update_term_count()हुड के नीचे वैसे भी।
एडम

0

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

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