มีข้อเสียของการใช้ wp_defer_term_counting หรือไม่


11

ฉันมีฐานข้อมูล WordPress พร้อมโพสต์กว่า 2 ล้านโพสต์ เมื่อใดก็ตามที่ฉันแทรกโพสต์ใหม่ฉันต้องโทรwp_set_object_termsซึ่งใช้เวลานานกว่าสองวินาทีในการดำเนินการ ฉันเจอโพสต์นี้ที่แนะนำให้โทรwp_defer_term_countingข้ามการนับคำ

มีผลกระทบร้ายแรงต่อการทำงานของ WordPress หรือไม่หากฉันใช้วิธีการนี้

นี่คือรหัสจากโพสต์ในกรณีที่ลิงก์เสีย:

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 คำใน taxonomy ที่เรียกว่าproduct_catID สำหรับคำเหล่านั้นคือ 1 (ชื่อคำ A), 2 (ชื่อคำ B) และ 3 (คำชื่อ C) ตามลำดับ

แต่ละคำศัพท์ข้างต้นมีการนับจำนวนคำแล้ว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)หลังจากการดำเนินการของคุณการนับจำนวนคำจึงไม่ได้รับการอัปเดตสำหรับข้อกำหนดที่ใช้บังคับ (คำ A, B หรือ C)

ดังนั้นนั่นคือผลลัพธ์ของการโทรwp_defer_term_counting(true)โดยไม่ต้องเรียกwp_defer_term_counting(false)หลังจากการดำเนินการของคุณ

แน่นอนว่าคำถามนี้มีผลกับคุณหรือไม่ ถ้าคุณไม่จำเป็นต้องโทรget_the_termsหรือดำเนินการบางอย่างที่ดึงคำที่คุณใช้countค่าเพื่อดำเนินการอื่น ๆ ดีในกรณีที่ดีไม่มีปัญหาสำหรับคุณ

แต่ ... จะเกิดอะไรขึ้นถ้ามีใครบางคนติดอยู่กับset_object_termsการกระทำในwp_set_object_terms()ฟังก์ชั่นและพวกเขาก็พึ่งการนับคำที่ถูกต้อง? ตอนนี้คุณจะเห็นว่าผลกระทบที่อาจเกิดขึ้น

หรือจะเกิดอะไรขึ้นถ้าหลังจากที่คำขอถูกยกเลิกคำขออื่นจะถูกดำเนินการเพื่อดึงคำศัพท์อนุกรมวิธานและใช้ประโยชน์จากcountทรัพย์สินในตรรกะทางธุรกิจของพวกเขา? นั่นอาจเป็นปัญหา

แม้ว่าอาจฟังดูแล้วว่าcountค่าอาจเป็นอันตรายมาก แต่เราไม่สามารถสรุปได้ว่าข้อมูลดังกล่าวจะถูกนำไปใช้บนพื้นฐานของปรัชญาของเราเองอย่างไร

เช่นเดียวกับที่กล่าวไว้ในคำตอบอื่นการนับตามที่เห็นในตารางรายการ taxonomy จะไม่ถูกอัพเดตเช่นกัน

ในความเป็นจริงวิธีเดียวที่จะอัปเดตการนับคำหลังจากที่คุณเลื่อนการนับคำและการร้องขอของคุณสิ้นสุดลงคือการโทรwp_update_term_count($terms, $taxonomy)หรือรอด้วยตนเองจนกว่าจะมีคนเพิ่มคำสำหรับอนุกรมวิธานที่กำหนดโดยผ่าน UI taxonomy หรือโดยทางโปรแกรม

อาหารสมอง.


1
ฉันคิดว่าคุณสรุปสิ่งนี้ได้อย่างยอดเยี่ยม ทุกอย่างขึ้นอยู่กับว่าคุณจะใช้ประโยชน์จากจำนวนเทอมที่แท้จริงเท่าที่ฉันจะสามารถขุดได้โดยใช้ซอร์สโค้ดที่เกี่ยวข้อง
Pieter Goosen

3
ใช่ฉันคิดว่านี่เป็นคำถามที่น่าสนใจดังนั้นฉันต้องขุดให้ลึกกว่านี้ ... ดูเหมือนว่าปัญหาเดียวคือถ้าคุณต้องการการนับระยะที่แม่นยำระหว่างการร้องขอเดียวกันและแม้กระทั่งหลังจากที่คำขอนั้นสิ้นสุดลง ลองคิดดูสิถ้าใครเคยใช้คำศัพท์สำหรับตรรกะทางธุรกิจที่จริงจังคุณก็ไม่อาจรับประกันได้ว่าสิ่งที่คุณกำลังดูนั้นเป็นความจริงที่ถูกต้อง คุณต้องลองและอัปเดตการนับ (เช่นwp_update_term_count()) ด้วยตนเองก่อนที่จะใช้ค่า ฉันไม่รู้ว่าจะเป็นอย่างนั้น
Adam

คำตอบที่ครอบคลุมมาก เนื่องจากฉันกำลังทำเม็ดมีดจำนวนมากจากสิ่งที่คุณได้อธิบายไปแล้วฉันจะต้องวนซ้ำตามข้อกำหนดหลังจากนั้นและโทรหา wp_update_term_count($terms, $taxonomy)แต่ละรายการให้ถูกต้อง?
KalenGi

2
WordPress ไม่เคยล้มเหลวที่จะตื่นขึ้นมาอย่างหยาบคาย ฉันต้องยอมรับว่าบางครั้งเรียนรู้การตอบคำถามแบบนี้มากกว่าแค่การบรรจุเป็นหลักโดยทั่วไป ;-)
Pieter Goosen

1
ถ้าคุณกำลังทำแทรกมวลฉันจะเพียงแค่wp_defer_term_counting(true), DO MASS INSERTwp_defer_term_counting(false)แล้ว เหตุผลเดียวที่คุณจะโทรติดต่อwp_update_term_count()โดยตรงคือถ้าคุณเก็บ term_ids ใน transient แล้วเลื่อนการนับทั้งหมด แต่ยกตัวอย่างเช่นออกจากคำขอ AJAX ที่อยู่เบื้องหลัง, คว้า transient แล้วโทรด้วยตนเองwp_update_term_count()หรือใช้ cron-job หรือคล้ายกัน หากคุณอยู่ในคำขอเดียวกัน (ก่อนที่การดำเนินการจะสิ้นสุดลงอย่างสมบูรณ์) ให้ทำการwp_defer_term_counting(false)โทรwp_update_term_count()ภายใต้ประทุน
Adam

0

สิ่งนี้ควรมีความปลอดภัยในการใช้งาน นี่เป็นการชะลอการนับจำนวนคำที่ปรากฏในหน้าแก้ไข Taxonomy ดังนั้นจึงไม่ปรากฏว่าจะมีผลกระทบร้ายแรงใด ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.