ฉันมีปัญหาที่คล้ายกันเมื่อไม่นานมานี้เมื่อมีการนำเข้า CSV ที่กำหนดเอง แต่ฉันลงเอยด้วยการใช้ SQL ที่กำหนดเองสำหรับการแทรกจำนวนมาก แต่ตอนนี้ฉันไม่เห็นคำตอบนี้:
เพิ่มประสิทธิภาพการแทรกโพสต์และลบสำหรับการดำเนินการจำนวนมาก?
เพื่อใช้wp_defer_term_counting()
เพื่อเปิดใช้งานหรือปิดใช้งานการนับคำ
นอกจากนี้หากคุณตรวจสอบแหล่งที่มาของปลั๊กอินตัวนำเข้า WordPress คุณจะเห็นฟังก์ชั่นเหล่านี้ก่อนการนำเข้าจำนวนมาก:
wp_defer_term_counting( true );
wp_defer_comment_counting( true );
แล้วหลังจากแทรกจำนวนมาก:
wp_defer_term_counting( false );
wp_defer_comment_counting( false );
ดังนั้นนี่อาจเป็นสิ่งที่ควรลอง ;-)
การนำเข้าโพสต์เป็นแบบร่างแทนที่จะเผยแพร่จะทำให้เร็วขึ้นเช่นกันเมื่อกระบวนการช้าในการค้นหากระสุนที่ไม่ซ้ำกันสำหรับแต่ละรายการจะถูกข้าม ใครสามารถทำได้เช่นเผยแพร่ในภายหลังในขั้นตอนเล็ก ๆ แต่ทราบว่าวิธีการนี้จะต้องทำเครื่องหมายโพสต์นำเข้าอย่างใดดังนั้นเราจึงไม่เพียงแค่เผยแพร่ร่างในภายหลัง! สิ่งนี้จะต้องมีการวางแผนอย่างรอบคอบและมีแนวโน้มที่จะเขียนโค้ดเอง
หากมีpost_name
การนำเข้าชื่อโพสต์ที่คล้ายกัน (เดียวกัน) จำนวนมากเช่นนั้นwp_unique_post_slug()
อาจช้าเนื่องจากการวนซ้ำการค้นหาแบบวนซ้ำเพื่อค้นหาทากที่มีอยู่ สิ่งนี้อาจสร้างเคียวรี db จำนวนมากได้
เนื่องจาก WordPress 5.1 มีpre_wp_unique_post_slug
ตัวกรองเพื่อหลีกเลี่ยงการวนซ้ำสำหรับทาก ดูตั๋วหลัก# 21112 นี่คือตัวอย่าง:
add_filter( 'pre_wp_unique_post_slug',
function( $override_slug, $slug, $post_id, $post_status, $post_type, $post_parent ) {
// Set a unique slug value to shortcircuit the slug iteration loop.
// $override_slug = ...
return $override_slug;
}, 10, 6
);
หากมีใครลองเช่น$override_slug = _truncate_post_slug( $slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix"
ด้วย$suffix
ขณะ$post_id
นั้นเราจะทราบว่า$post_id
จะมี0
การโพสต์ใหม่เสมอตามที่คาดไว้ มีหลายวิธี แต่การสร้างตัวเลขที่ไม่ซ้ำกันใน PHP uniqid( '', true )
มีเช่น แต่ใช้ตัวกรองนี้ด้วยความระมัดระวังเพื่อให้แน่ใจว่าคุณมีทากที่ไม่ซ้ำกัน เราสามารถเรียกใช้แบบสอบถามจำนวนกลุ่มหลังจากนั้นpost_name
เพื่อให้แน่ใจ
ตัวเลือกอื่นจะใช้WP-CLIเพื่อหลีกเลี่ยงการหมดเวลา ดูเช่นคำตอบของฉันโพสต์สำหรับการสร้าง 20,000 โพสต์หรือหน้าโดยใช้ไฟล์. csv?
จากนั้นเราสามารถเรียกใช้สคริปต์นำเข้า PHP แบบกำหนดเองของเราimport.php
ด้วยคำสั่ง WP-CLI:
wp eval-file import.php
ยังหลีกเลี่ยงการนำเข้าชนิดโพสต์ลำดับชั้นจำนวนมากเนื่องจาก wp-admin UI ปัจจุบันจัดการได้ไม่ดี ดูเช่นประเภทโพสต์ที่กำหนดเอง - รายการโพสต์ - หน้าจอสีขาวแห่งความตาย
นี่คือเคล็ดลับที่ยอดเยี่ยมจาก @otto:
ก่อนแทรกจำนวนมากให้ปิดใช้งานautocommit
โหมดอย่างชัดเจน:
$wpdb->query( 'SET autocommit = 0;' );
หลังจากแทรกจำนวนมากให้รัน:
$wpdb->query( 'COMMIT;' );
ฉันยังคิดว่ามันเป็นความคิดที่ดีที่จะทำความสะอาดเช่น:
$wpdb->query( 'SET autocommit = 1;' );
ฉันไม่ได้ทดสอบนี้ในMyISAMแต่ควรจะทำงานในInnoDB
ในฐานะที่เป็นที่กล่าวถึงโดย @kovshenin เคล็ดลับนี้จะไม่ทำงานสำหรับMyISAM