ผลฟิลด์เมตาโพสต์ที่กำหนดเองเกี่ยวกับประสิทธิภาพของโพสต์


10

ฉันมีโพสต์ที่มีเขตข้อมูลเมตาที่กำหนดเองจำนวนมาก get_post_metaในโพสต์ฉันกำลังเรียกพวกเขาอยู่กับความต้องการใช้ หมายถึงเขตข้อมูลเมตา 10 ช่องที่ฉันใช้อยู่ 10 ครั้ง

ฉันทำถูกไหม? หมายถึงมีปัญหาประสิทธิภาพการทำงานด้วยวิธีการดังกล่าวข้างต้นและถ้าใช่แล้ววิธีการลดจำนวนการโทร

ฉันตระหนักถึงคำตอบที่มีอยู่ที่นี่: ฟิลด์ที่กำหนดเองและประสิทธิภาพซึ่งอธิบายว่าการใช้ 'แบบสอบถามเดียว' แต่มันไม่ชัดเจนและมีเสียงดังนั้นขอให้อีกครั้งถ้าใครรู้และต้องการแบ่งปันในรายละเอียด

คำตอบ:


25

เพื่อตอบคำถามนี้ฉันได้ไปและทำการทดสอบเกี่ยวกับเรื่องนี้แล้วและผลลัพธ์ก็ออกมาอย่างน่าเหลือเชื่อ

นี่คือการทดสอบของฉัน

ด้วยตัวคุณเองตั้งค่าตัวเองด้วยหน้าทดสอบ เพียงแค่คัดลอก page.php เปลี่ยนชื่อแล้วลบลูป ตอนนี้เพียงแค่สร้างหน้าใหม่ในส่วนหลัง ก่อนที่คุณจะเริ่มให้ทดสอบตัวจับเวลาด้วยข้อมูลว่างเปล่าก่อนเพื่อรับจำนวนข้อความค้นหาที่ไม่มีข้อมูลใด ๆ

ฉันสร้างเมตาทั้งหมด 5 ฟิลด์สำหรับการทดสอบโพสต์

  • enclosure,
  • First name,
  • Last name,
  • packages และ
  • post_views_count

โพสต์การทดสอบของฉันมี ID 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>

ซึ่งให้ผลลัพธ์ต่อไปนี้แก่ฉัน

1 ข้อความค้นหาใน 0.00195 วินาที

การทดสอบครั้งที่สองของฉันเป็นดังนี้:

<?php               
       timer_start();       

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

ซึ่งน่าแปลกใจที่ให้ผลลัพธ์เดียวกัน

1 ข้อความค้นหาใน 0.00195 วินาที

ถ้าคุณดูที่รหัสที่มาสำหรับget_post_meta()คุณจะเห็นว่าเป็นเพียงแค่กระดาษห่อสำหรับget_post_meta() get_metadata()ดังนั้นนี่คือคุณต้องดู รหัสที่มาสำหรับget_metadata()คุณจะเห็นว่าเมตาดาต้าได้รับการเก็บไว้ชั่วคราว

ดังนั้นสำหรับคำถามของคุณเกี่ยวกับการใช้และประสิทธิภาพคำตอบนั้นขึ้นอยู่กับคุณ คุณได้เห็นหลักฐานในผลลัพธ์

ในความเห็นส่วนตัวของฉันหากคุณต้องการดึง 10 เขตข้อมูล meta (หรือในกรณีของฉัน 5) ใช้วิธีที่สองในคำตอบของฉัน

$a = get_post_meta(530);

ไม่เพียง แต่เขียนได้เร็วเท่านั้น แต่คุณไม่ควรทำซ้ำรหัสอีกด้วย อีกประเด็นที่ควรทราบที่นี่คือแนวทางที่สองจะเก็บเขตข้อมูลเมตาทั้งหมดในอาร์เรย์ซึ่งสามารถเข้าถึงและเรียกใช้ได้อย่างง่ายดาย

เช่นเดียวกับตัวอย่างนี่คือผลลัพธ์ของฉันจาก$aถ้าฉันทำvar_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
สิ่งนี้เรียกว่า 'Walk the Talk' คำตอบที่ยอดเยี่ยม
Akhilesh

1
ความสุขของฉันดีใจที่ได้ผลสำหรับคุณ สนุก :-)
Pieter Goosen

1
นี่เป็นสิ่งที่ดีมาก ฉันชอบที่จะเห็นการทดสอบที่คล้ายกันโดยมุ่งเน้นไปที่เมตาของผู้ใช้ที่กำหนดเองแทน
Christine Cooper

1
คุ้มค่าแน่นอนที่จะทำ ;-) จะเห็นสิ่งที่ฉันสามารถทำได้ในอีกไม่กี่วันข้างหน้ามีสองสามวันข้างหน้าเร่งด่วนในขณะนี้ @ChristineCooper
Pieter Goosen

1
ดี! โปรดติดแท็กฉันในกระทู้นี้ด้วยลิงก์ในกรณีที่คุณลงมือทำ!
Christine Cooper

0

คุณสามารถใช้get_post_metaเพื่อดึงค่าเขตข้อมูลเมตาทั้งหมดในครั้งเดียว

$meta = get_post_meta( get_the_ID() );

วิธีนี้จะดึงค่าเมตาทั้งหมดของโพสต์ที่ระบุ ใช้อาร์เรย์นั้นแทนที่จะดึงข้อมูลทีละรายการ


0

ตามที่ระบุไว้ใน Pieter Goosen ข้อมูลเมตาทั้งหมดสำหรับหนึ่งโพสต์จะถูกแคชเมื่อคุณร้องขอเมตาดาต้าเป็นครั้งแรก

สิ่งนี้เป็นจริงสำหรับการโทรใด ๆWP_Queryด้วย ทันทีที่คุณโทรออกWP_QueryWordPress จะดึงข้อมูลเมตาสำหรับโพสต์ที่ดึงมาทั้งหมดในแบบสอบถามเดียว

สถานการณ์กรณีที่เลวร้ายที่สุดคือคุณต้องโทรget_post_metaหารหัสโพสต์แต่ละรายการที่ WordPress ไม่เคยเรียกคืนมาก่อน ในกรณีนี้การเรียกแต่ละครั้ง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โพสต์ซึ่งเป็นผลมาจากเดิม

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