1. ตั้งค่าคิวรีก่อนที่จะรัน WP_Query
สิ่งนี้ดูเหมือนจะเป็นสิ่งที่สำคัญที่สุดที่ควรคำนึงถึงเมื่อพยายามที่จะรักษาแบบสอบถามฐานข้อมูลให้น้อยที่สุดเนื่องจากโอกาสเดียวในการแก้ไขแบบสอบถามคือแน่นอนก่อนที่จะมีการเรียกใช้ในฐานข้อมูล SQL
ปกติแบบสอบถาม
สำหรับแบบสอบถามปกติ WordPress ใช้ฟังก์ชั่นซึ่งในการเปิดสายwp()
$wp->main( $query_vars )
"ตัวแปร is_" จากแท็กแบบมีเงื่อนไขจะถูกตั้งค่าก่อนที่จะส่งไปยังWP_Query->get_posts()
ซึ่งจะแปลงเป็นแบบสอบถามฐานข้อมูล MySQL และในที่สุดก็เก็บไว้ในวัตถุ $ wp_query มันเป็นไปได้ที่จะกรองแบบสอบถามก่อนที่จะมีการเรียกใช้จริงในฐานข้อมูล SQL
pre_get_posts
กระทำ hooks WP_Query->get_posts()
เข้าสู่กระบวนการนี้ช่วยให้คุณสามารถเปลี่ยนแบบสอบถามก่อนที่มันจะถูกส่งไปยัง
ตัวอย่างเช่นหากคุณต้องการกรองข้อความค้นหาสำหรับโพสต์ในหมวดหมู่ "วิดีโอเด่น" คุณจะต้องใช้add_action( 'pre_get_posts', 'your_function_name' );
และรวมin_category
แท็กที่มีเงื่อนไขไว้your_function_name
ด้วย
function your_function_name( $query ) {
if ( $query->in_category( 'featured' ) && $query->is_main_query() ) {
// Replace 123 with the category ID of the featured category.
$query->set( 'cat', '123' );
}
}
add_action( 'pre_get_posts', 'your_function_name' );
ดูปลั๊กอิน API / ข้อมูลอ้างอิงการกระทำ / รับโพสต์ก่อนหน้า« WordPress Codex
การร้องขอหน้า
สำหรับเทมเพลตหน้าเช่นหน้าการเก็บถาวรสำหรับหมวดหมู่ "คุณสมบัติ" แท็กแบบมีเงื่อนไขจะไม่ทำงานจากpre_get_posts
ตัวกรอง ตัวอย่างเช่นคุณไม่สามารถใช้is_category
เพื่อตรวจสอบหน้าเก็บถาวรเพราะ WP_Query ไม่ได้ทำงาน
แต่คุณจะต้องเปลี่ยนข้อความค้นหาหลักสำหรับคำขอหน้าเว็บที่มีnew WP_Query
หน้าตาคล้าย$query = new WP_Query( 'cat=123' );
กัน สิ่งนี้จะทำการสืบค้นด้วยชุดอาร์กิวเมนต์ที่เหมาะสมตั้งแต่เริ่มต้น
ดูClass Reference / WP Query « WordPress Codex
2. บันทึกลงในฐานข้อมูล
คุณสามารถใช้ตัวกรองwp_insert_post_data
เพื่อให้มั่นใจว่าเพียง $ wp_insert_post
ข้อมูลที่เกี่ยวข้องกับประเภทโพสต์ที่กำหนดเองของคุณจะถูกส่งกลับไปยัง ตรวจสอบให้แน่ใจว่าได้รวมคำสั่งแบบมีเงื่อนไขเพื่อตรวจสอบประเภทโพสต์ที่คุณกำหนดเอง
ปลั๊กอิน API / อ้างอิงตัวกรอง / wp แทรกข้อมูลโพสต์« WordPress Codex
เบ็ดนี้เรียกว่าโดยwp_insert_post
ฟังก์ชั่นซึ่งเรียกว่าโดยwp_update_postเมื่อคุณอัปเดตประเภทโพสต์ที่คุณกำหนดเองโดยปกติจะบันทึกร่างจดหมายหรือเผยแพร่โพสต์
คุณจะต้องสร้างมาตรฐานด้วยตัวเองแม้ว่าฉันจะไม่สามารถพูดถึงความสำคัญในการเพิ่มประสิทธิภาพของการลดข้อมูลที่อัพเดทในฐานข้อมูล
3. ประเภทโพสต์ที่กำหนดเองมีผลต่อประสิทธิภาพหรือไม่
จากประสบการณ์ของฉันประเภทโพสต์ที่กำหนดเองเป็นเครื่องมือที่มีประสิทธิภาพสำหรับการจัดการเนื้อหา ฉันไม่ทราบวิธีอื่นใดในการจัดการโพสต์ในทุกรูปแบบที่อนุญาตในลักษณะที่จะใช้ทรัพยากรน้อยลง ฉันจะมุ่งเน้นไปที่การหาวิธีที่จะลดจำนวนการค้นหาตามที่เป็นไปได้
เคยมีปัญหาด้านประสิทธิภาพที่เกี่ยวข้องกับโครงสร้าง Permalink ทำให้มันฮิตเมื่อเริ่มต้นด้วยข้อความแทนที่จะเป็นตัวเลข 3สิ่งนี้เป็นปัญหาโดยเฉพาะอย่างยิ่งสำหรับเว็บไซต์ที่โฮสต์หน้าจำนวนมาก แต่ได้รับการแก้ไขตั้งแต่รุ่น WordPress 3.3
ฉันเพิ่งจะเพิ่มลิงก์ถาวรที่นี่เพราะกระสุนมักจะเป็นส่วนแรกของโครงสร้างลิงก์ซึ่งอาจหรืออาจไม่ได้รับผลกระทบต่อประสิทธิภาพการทำงานก่อนรุ่น 3.3 นอกเหนือจากนั้นฉันไม่ทราบถึงปัญหาประสิทธิภาพใด ๆ ที่เกิดขึ้นจากการใช้โพสต์แบบกำหนดเอง
ตัวเลือกประสิทธิภาพอื่น ๆ
Transients
นี่ไม่ใช่การแทนที่เพื่อรักษาข้อความค้นหาให้น้อยที่สุดในรหัสของคุณ แต่คุณสามารถใช้set_transientเพื่อจัดเก็บแบบสอบถามในบางครั้งเพื่อให้แบบสอบถามใหม่ไม่จำเป็น นี่คือตัวอย่างที่ใช้ในการเดฟเคลเมนท์โพสต์ นอกจากนี้โปรดทราบว่าเขาแนะนำให้เพิ่มการsave_post
กระทำเพื่อลบชั่วคราวเมื่อใดก็ตามที่มีการอัปเดตประเภทโพสต์ที่กำหนด
<?php // IN THE SPOTLIGHT QUERY
if( false === ( $its_query = get_transient( 'its_query' ) ) ) {
$pttimestamp = time() + get_option('gmt_offset') * 60*60;
$its_query = new WP_Query( array(
'post_type' => 'spotlight',
'posts_per_page' => 1,
'post__not_in' => $do_not_duplicate,
'meta_query' => array(
array(
'key' => '_hpc_spotlight_end_time',
'value' => $pttimestamp,
'compare' => '>'
)
)
) );
set_transient( 'its_query', $its_query, 60*60*4 );
}
if( have_posts() ) { // HIDE SECTION IF NO CURRENT ITS FEATURE ?>
// LOOP GOES HERE: NOT IMPORTANT TO EXAMPLE
<?php } ?>
การเพิ่มประสิทธิภาพการค้นหาเพิ่มเติม
Thomas Griffin มีเคล็ดลับดี ๆ บางส่วนในบทช่วยสอนการเพิ่มประสิทธิภาพ WordPressของเขา นี่คือรายการสั้น ๆ ของคำแนะนำของเขา:
ตั้งค่า'cache_results' => false
ในแบบสอบถามแบบใช้ครั้งเดียวหากเซิร์ฟเวอร์ของคุณไม่ได้ใช้แคชถาวรเช่น Memcached แบบสอบถามแบบใช้ครั้งเดียวมีคำอธิบายว่า "แบบสอบถามที่ใช้ในการแสดงข้อมูลจำนวนเล็กน้อยอาจเป็นได้ว่าคุณเพียงแค่ต้องการแสดงชื่อโพสต์ที่เชื่อมโยงที่เกี่ยวข้องกับโพสต์ปัจจุบันหรือคุณอาจต้องการแสดงรายการแบบเลื่อนลงเพื่อเลือก การตั้งค่าตัวเลือกเฉพาะ "
ตัวอย่างของเขา: $query = get_posts( array( 'posts_per_page' => 1,
'cache_results' => false ) );
ตั้งค่า'no_found_rows' => true
ที่ไม่ต้องการเลขหน้า สิ่งนี้จะ "เลี่ยง MySQL ที่จะนับผลลัพธ์เพื่อดูว่าเราต้องการเลขหน้าหรือไม่"
ตัวอย่างของเขา: $query = new WP_Query( array( 'posts_per_page' => 1,
'no_found_rows' => true ) );
คำถามสำหรับรหัสโพสต์เพียงว่านี่คือสิ่งที่คุณต้องการใน'fields' => 'ids'
get_posts
สิ่งนี้ควรลดจำนวนข้อมูลที่จะถูกส่งคืนซึ่งค่อนข้างมากต่อการโพสต์ถ้าคุณดูที่
คำอธิบายฐานข้อมูล« WordPress Codex
ตัวอย่างของเขา: $query = get_posts( array( 'posts_per_page' => 1,
'fields' => 'ids' ) );
นอกจากนั้นปลายที่ผ่านมาเหตุผลเดียวกันสามารถนำไปใช้เมื่อคุณต้องการเพียงหนึ่งหรือโพสต์ไม่กี่สาขาโดยใช้get_post_field
การมีความเข้าใจอย่างถ่องแท้เกี่ยวกับการทำงานของแบบสอบถามเป็นสิ่งจำเป็น ยิ่งคุณมีข้อสงสัยมากเท่าไหร่คุณก็ยิ่งต้องการงานจากฐานข้อมูล SQL น้อยลงเท่านั้น ซึ่งหมายความว่ามีความเป็นไปได้มากมายสำหรับการจัดการคิวรีของฐานข้อมูล ระมัดระวังแบบสอบถามที่กำหนดเองเท่าที่พวกเขาเรียกใช้ (มันเป็นหน้าผู้ดูแลระบบหรือไม่) ใช้การฆ่าเชื้อที่เหมาะสมในการสอบถามโดยตรงและพยายามใช้ฟังก์ชั่น WordPress ดั้งเดิมที่ช่วยให้คุณบรรลุประสิทธิภาพเดียวกัน