มีวิธีในการแยกเนื้อหาจากตัวแปรโพสต์เพื่อบันทึกในการใช้ RAM หรือไม่?


9

ดังนั้นฉันพบสิ่งที่ดูเหมือนปัญหาการใช้ WP RAM และฉันกำลังมองหาวิธีแก้ปัญหา

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

โดยพื้นฐานแล้วหน้าแผนที่เว็บไซต์นี้ฉันมีรายการทั้งหมดpostsและpagesบนเว็บไซต์ของฉัน องค์ประกอบเดียวของตัวแปร $ post ที่ฉันต้องการเข้าใช้ในหน้านี้คือชื่อและความคิดเห็น น่าเสียดายที่แบบสอบถามที่ฉันใช้ส่งคืนโพสต์ทั้งหมดพร้อมข้อมูลทั้งหมดในตัวแปร $ post แต่ละรายการ

ต่อไปนี้เป็นตัวอย่างของแบบสอบถามที่ฉันใช้ในหน้าแผนผังเว็บไซต์นี้สำหรับผลิตภัณฑ์ที่มีcustom-post-typeชื่อว่า "ผลิตภัณฑ์" ที่มีอนุกรมวิธานที่กำหนดเองของ "อาหารเสริม" และคำว่า "อาหารเสริมทั้งหมด" หน้าแผนผังเว็บไซต์ของฉันมีหลายข้อความค้นหา แต่เพื่อจุดประสงค์ในการอธิบายฉันรวมเฉพาะรหัสสำหรับข้อความค้นหาเดียวนี้

 $varArray= array(
      'post_type' => 'products',
      'post_status' => 'publish',
      'supplements' => 'all-supplements',
      'posts_per_page' => -1,
      'orderby' => 'title',
      'order' => 'ASC'
 );
 $myProducts= new WP_Query($varArray);

ข้อมูลส่วนใหญ่ที่บันทึกไว้ในตัวแปร $ post (สำหรับเว็บไซต์ของฉันและฉันคาดเดาว่าแนวโน้มนี้เห็นได้สำหรับการใช้งานทั่วไป) พบได้ใน "เนื้อหา" การใช้ RAM ทั่วไปสำหรับหน้าแผนที่ไซต์ของฉันคือ ~ 140MB (รายงานโดย Debug Bar) ในขณะที่การใช้งานสำหรับหน้าทั่วไปอื่น ๆ ในเว็บไซต์ของฉันคือ 50-60MB แตกต่างใหญ่ เมื่อวานนี้หน้า Site Map หยุดทำงาน (WSOD) และเพื่อแก้ไขฉันต้องเพิ่ม RAM สูงสุดที่ WP ใช้ ดังนั้นฉันจึงเพิ่มทรัพยากรระบบที่จำเป็นโดยรวมเพราะหน้าเดียว

ดังนั้นฉันมาถึงคำถามของฉัน

มี pathway / options ใน Wordpress หรือไม่ว่าฉันหายไปซึ่งจะดึงข้อมูลposts/ pagesเหมือนกับข้อความค้นหาปกติ แต่ไม่ได้รับเนื้อหาสำหรับการดึงข้อมูลโพสต์

หรืออีกวิธีหนึ่งมีวิธีที่ง่ายกว่าสำหรับฉันที่จะจับองค์ประกอบเฉพาะภายในแบบสอบถามที่ระบุ (ชื่อเรื่อง / Permaklink / Slug / ฯลฯ ... ) แทนที่จะได้รับตัวแปร $ post shebang ทั้งหมดหรือไม่

สำหรับฉันแล้วดูเหมือนว่าสำหรับแอปพลิเคชั่น WP หลายแห่งสถานที่เดียวที่ "เนื้อหา" ของโพสต์ / หน้าจะต้องอยู่บนนั้นpageหรือpostหน้า (เห็นได้ชัดว่ามีข้อยกเว้นที่นี่) และการเข้าถึงเนื้อหาแบบเต็มสำหรับโพสต์ / หน้าดึงโดยแบบสอบถามในหน้าอื่น ๆ เป็นเรื่องง่ายมาก หากมีวิธีหลีกเลี่ยงการโหลดเนื้อหาแบบเต็มสำหรับหน้ารายการโพสต์แสดงว่ามีการบันทึกการใช้ RAM จำนวนมาก

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม

คำตอบ:


8

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

ดูที่ปัญหาการใช้หน่วยความจำของ get_permalinkสำหรับการให้เหตุผลโดยละเอียด


วิธีนี้ใช้ได้ผลดีมาก หลังจากถกเถียงกันเล็กน้อยนั่นก็คือ :) ฉันต้องคิดวิธีรวม taxonomy / term ที่กำหนดเองของฉันกับแบบสอบถาม แต่นี่เป็นความช่วยเหลือที่ยิ่งใหญ่ หน้าแผนผังเว็บไซต์ตอนนี้ใช้ RAM 70MB (ตาม Debug Bar) ขอบคุณสำหรับตัวชี้ที่ยอดเยี่ยม
โปรแกรมเมอร์ Dan

4

คุณอาจลองเพิ่มสิ่งนี้ลงในอาร์เรย์ของคุณ:

'nopaging' => true,
'no_found_rows' => true,
'update_post_meta_cache' => false,
'update_post_term_cache' => false

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


2

โปรแกรมเมอร์ Dan, mah man!

มาเริ่มต้นกันกับSELECTแบบสอบถามที่กำหนดเองโดยใช้$wpdbโกลบอล Codex มีรายการที่ดีในการแสดงโพสต์โดยใช้กำหนดเองเลือกแบบสอบถาม หากคุณใช้ประโยชน์จากsetup_postdata()คุณสามารถวนลูปผ่านผลราวกับว่าคุณกำลังนั่งอยู่ในลูป Wordpress มาตรฐาน:

global $wpdb;

$sitemap_query = "
    SELECT $wpdb->posts.ID, $wpdb->posts.post_title, $wpdb->posts.guid
    FROM $wpdb->posts
    WHERE $wpdb->posts.post_status = 'publish' 
    AND $wpdb->posts.post_type IN ('post','supplement','another_post_type')
    ORDER BY $wpdb->posts.post_type, $wpdb->posts.post_title DESC
    ";

$sitemap_nodes = $wpdb->get_results($sitemap_query, OBJECT);

if( $sitemap_nodes ):
    global $post;
    foreach ( $sitemap_nodes as $post ):
        setup_postdata( $post );
        ?>

<!-- //Use standard Wordpress template tags for SELECT'd data within The Loop here -->
    <?php the_title() ?>
    <?php the_permalink() ?>

        <?php
    endforeach;
endif;

แบบสอบถามนี้ดึง ID ของบทความชื่อและ GUID ของโพสต์ (ใช้เพื่อกำหนดความคิดเห็นของโพสต์) ในขณะที่ไม่สนใจทุกอย่าง มันยิ่งกว่าคำสั่งผลครั้งแรกโดยpost_typeแล้วpost_titleแต่คุณอาจต้องการที่จะใช้การสอบถามหลายที่จะแยกประเภทการโพสต์ของคุณ (ในทางทฤษฎีที่ตีประสิทธิภาพเล็ก)

เห็นได้ชัดว่าคุณอาจต้องการข้ามการใช้setup_postdata()และเพียงแค่วนไป$sitemap_nodesมาหรือทำเล่น ๆ กับคำถามเพื่อให้ได้ผลลัพธ์ที่คุณต้องการ

หากคุณโทรออกsetup_postdata()และเปิดใช้งานโหมดการดีบักการโทรนั้นจะมีการประกาศแยกซ้ายและขวาเกี่ยวกับข้อมูลที่ขาดหายไป (โดยเจตนา) คุณอาจต้องการที่จะโยน@ก่อนการเรียกใช้ฟังก์ชันเพื่อระงับพวกเขาหลังจากที่คุณยืนยันว่าแบบสอบถามที่กำหนดเองของคุณทำงานอย่างถูกต้อง

แต่สิ่งนี้จะช่วยให้คุณเริ่มต้นได้! คุณสามารถอ้างถึงไดอะแกรมฐานข้อมูลต่อไปนี้ (จากหน้าคำอธิบายฐานข้อมูลบน Codex) เพื่อค้นหาฟิลด์ที่คุณต้องการสอบถาม:

ไดอะแกรมฐานข้อมูล Wordpress

แก้ไข:

โซลูชันที่มีประสิทธิภาพของหน่วยความจำส่วนใหญ่มีแนวโน้มว่าจะรวมการSELECTสืบค้นที่กำหนดเองกับ protip ของ @ Rarst :)


1

WP_Query มีพารามิเตอร์ "คืนค่าฟิลด์" ที่มีลักษณะดังนี้:

$args = array(
 'fields' => 'ids'
);
$query = new WP_Query( $args );

เมื่อใช้วิธีนี้ WP_Query จะส่งคืนรหัสโพสต์เท่านั้นไม่ใช่โพสต์ออบเจ็กต์ทั้งหมด แล้วคุณก็สามารถใช้get_permalink(), get_the_title()และฟังก์ชั่นอื่น ๆ สารพัน WordPress เพื่อดึงเนื้อหาของคุณขึ้นอยู่กับการโพสต์ประจำตัวประชาชน


1
โปรดทราบว่าฟังก์ชั่นที่รับ ID ของโพสต์มักจะเรียกใช้ทันทีget_post()เพื่อดึงข้อมูลเต็มและเอาชนะวัตถุประสงค์ในการดึง ID เพียงอย่างเดียว
Rarst

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