วิธีการแคช json ด้วย wp-super cache


15

ในโครงการใหม่เราใช้ wp-super-cache (ปลั๊กอินที่ลูกค้าต้องการ) เพื่อสร้างไฟล์ html แบบคงที่สำหรับประเภทเนื้อหาที่กำหนดเอง แต่เรากำลังพยายามหาว่าทุกอย่างถูกแคชอย่างเหมาะสมหรือไม่

นี่เป็นคำถาม 2 ส่วน

1) ชุดรูปแบบที่เราสร้างขึ้นใช้เทมเพลตหน้าเพื่อส่งออก json ที่ติดเครื่องผ่านการโทร ajax กล่าวคือ หากคุณเข้าชมหน้าเว็บ: theurl.com/sample - คุณจะได้รับ json บริสุทธิ์ ในขณะที่มีทุกรุ่นและไม่ใช่จาวาสคริปต์ทุกหน้าและโพสต์ Ajax ไดรฟ์ส่วนหน้าของชุดรูปแบบนี้ เราได้ลบส่วนหัวและส่วนท้ายในไฟล์เหล่านี้เพื่อให้เป็น json บริสุทธิ์และเราพยายามที่จะหาวิธีการตรวจสอบว่า json จะถูกแคช ในทางทฤษฎีข้อมูลจะถูกเก็บไว้เพราะในทางเทคนิคหน้าที่ให้บริการโดย wordpress แต่เราจะรู้ได้อย่างไรว่ามันถูกเก็บไว้?

2) เรากำลังใช้ปลั๊กอิน json api เพื่อแสดงข้อมูลโพสต์บางอย่างเช่นกัน http://wordpress.org/extend/plugins/json-api/ สำหรับตัวอย่างนี้สมมติว่าเราใช้ประโยชน์จากวิธีการเริ่มต้นของปลั๊กอินและกดหน้านี้: url.com/category/news?json=1 ใครรู้วิธีที่เราสามารถตรวจสอบว่าการส่งออกนี้จะถูกแคช? หากไม่มีการแคชวิธีการนี้จะทำให้เกิดขึ้นได้อย่างไร

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

คำตอบ:


9

ปรากฏว่า json ไม่ได้ถูกแคชโดย wp-super-cache แต่เราตัดสินใจที่จะใช้วิธีอื่น ด้วยการใช้transient apiทำให้เราสามารถทำ faux-cache บน json ทั้งหมดและลดการเก็บภาษีฐานข้อมูลได้อย่างมาก จากนั้นในอีกด้านของอาแจ็กซ์เรากำลังแคช html ที่สร้างขึ้นจาก json แบบกึ่งแคชนี้ สิ่งต่าง ๆ นั้นเร็วมาก! นี่คือโค้ดและแนวคิดที่ลดขนาดลง

    $transient_key = 'my-transient-key'; 
    $data = get_transient( $transient_key ); 

    if ( $data == '' ) { 
      $args = array(

    'post_type' => 'brand', 
    'posts_per_page' => 50

  );

  $postsArray = array();  
  // The Query
 query_posts( $args );

  // The Loop
  while ( have_posts() ) : the_post();

    $brand_id = get_the_ID();
    $slug = basename(get_permalink());
    $title = get_the_title();
    $description = get_the_content();

                $posts = array(

                   'brand_id' => $brand_id,
                   'machine_name' => $slug,
                              'postTitle' => $title,
                   'description' => $description,

                   );

    array_push($postsArray,$posts);


  endwhile;

   $data = json_encode($postsArray);


 set_transient( $transient_key, $data, 60 * 60 * 24 ); // one day
 }  // now all the brand information is cached as one table call.

echo $data;

ดียกนิ้วให้ !!!
Dipesh KC

6

WP Super Cache ตรวจสอบหน้าเว็บไซต์ WordPress ของคุณเพื่อหาแท็ก HTML ก่อนที่จะทำการแคช

หน้าเว็บของคุณส่วนใหญ่อาจไม่มี</html>แท็ก (ปัญหาทั่วไป) ในกรณีนี้ลองเพิ่มสิ่งที่ชอบ//</html>- นั่นเป็นวิธีแก้ปัญหาและ WP Super Cache ควรสร้างหน้าเว็บในเวอร์ชันที่แคชไว้

ทำไม WP Super Cache ถึงทำแบบนั้น? ดูไม่มีวิธีการที่ชัดเจนในการตรวจสอบว่าหน้าเว็บนั้นโหลดเพียงครึ่งเดียวแล้วหรือยังกว่าที่จะตรวจสอบว่ามีแท็ก HTML พื้นฐานทั้งหมดและปิดอย่างถูกต้องหรือไม่

ในคำพูดของเจ้าของ Donncha (นักพัฒนา WP Super Cache) "มันเป็นการหยุดหน้าที่สร้างครึ่งหนึ่งที่ถูกแคช"


ฉันหวังว่าพวกเขามีตัวเลือกในการแคช json โดยเฉพาะหรือประเภทข้อมูลอื่น ๆ ตัวเลือกมากมายและไม่ใช่ตัวเลือกที่เราต้องการสำหรับโครงการนี้ แต่นี่เป็นวิธีแก้ปัญหาที่ยอดเยี่ยม ฉันจะลองดู
Starfs

3

หมายเหตุการรักษาความปลอดภัย:ไม่ควรใช้ (และโซลูชันอื่น ๆ ) เว้นแต่ว่าคุณจะมีวิธีการแทนที่Content-Type: text/htmlส่วนหัวที่ WP Super Cache ส่งด้วยapplication/jsonค่าที่เหมาะสม การส่ง JSON text/htmlจะทำให้เบราว์เซอร์แสดงเป็น HTML ซึ่งอาจเป็นเวกเตอร์ XSS

ดูเหมือนว่าต้องทำที่เลเยอร์เซิร์ฟเวอร์เนื่องจาก WPSC ไม่ได้จัดเตรียม hooks ที่จำเป็น


นี่คือสิ่งที่ฉันทำ มันคล้ายกับแนวทางของเหลียง แต่ไม่ต้องการแก้ไขปลั๊กอินโดยตรงและมีรูปแบบ regex ที่แม่นยำยิ่งขึ้น

หากคุณใช้ v2 ของ REST API คุณควรใช้REST_REQUESTแทนJSON_REQUESTแทน

เป็นการดีที่จะสมัครเป็นสมาชิก22และ# 79ในกรณีที่มีการเปลี่ยนแปลงบางอย่างใน WP Super Cache

/**
 * Tell WP Super Cache to cache API endpoints
 *
 * @param string $eof_pattern
 *
 * @return string
 */
function wcorg_json_cache_requests( $eof_pattern ) {
    global $wp_super_cache_comments;

    if ( defined( 'JSON_REQUEST' ) && JSON_REQUEST ) {
        // Accept a JSON-formatted string as an end-of-file marker, so that the page will be cached
        $json_object_pattern     = '^[{].*[}]$';
        $json_collection_pattern = '^[\[].*[\]]$';

        $eof_pattern = str_replace(
            '<\?xml',
            sprintf( '<\?xml|%s|%s', $json_object_pattern, $json_collection_pattern ),
            $eof_pattern
        );

        // Don't append HTML comments to the JSON output, because that would invalidate it
        $wp_super_cache_comments = false;
    }

    return $eof_pattern;
}
add_filter( 'wp_cache_eof_tags', 'wcorg_json_cache_requests' );

สวัสดี ฉันใช้ตัวกรอง wp_cache_eof_tags แต่ตอนนี้ (และเมื่อเปิดใช้งานการแคชเท่านั้น) ฉันมีข้อผิดพลาด: XMLHttpRequest cannot load http://api.mywebsite.com/wp-json/wp/v2/posts. Origin http://mywebsite.com is not allowed by Access-Control-Allow-Origin.ฉันจะแก้ไขได้อย่างไร
Łukasz Florczak

เนื่องจากคุณมี REST API ในโดเมนแยกต่างหากเว็บไซต์หลักของคุณอาจส่งออกAccess-Control-Allow-Originส่วนหัวเพื่ออนุญาตคำขอข้ามแหล่ง ฉันคาดเดาว่าหน้าแคชจะไม่แสดงส่วนหัวนั้น
Ian Dunn

0

ฉันพบปัญหานี้ด้วย ฉันได้เขียนโค้ดเพื่อเป็น API เมื่อประเภทการตอบสนองคือ XML แคชทำงาน แต่เมื่อประเภทการตอบสนองเป็น json มันไม่ทำงาน

ฉันใช้เวลาหลายชั่วโมงในการแก้ไขข้อผิดพลาดนี้

นี่เป็นงานสำหรับฉัน

ป้อนคำอธิบายรูปภาพที่นี่

เพียงอัปเดตรหัสของคุณเช่นการเปลี่ยนแปลงของฉัน

มันเหมาะกับฉันแล้ว


5
โปรดโพสต์รหัสจริงไม่ใช่ภาพของรหัส
Pieter Goosen

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