Cách cache json với wp-super cache


15

Trong một dự án mới, chúng tôi đang sử dụng wp-super-cache (plugin ưa thích của khách hàng) để tạo các tệp html tĩnh cho các loại nội dung tùy chỉnh. Nhưng chúng tôi đang cố gắng tìm hiểu xem mọi thứ có được lưu trữ đúng cách hay không.

Đây là một câu hỏi gồm 2 phần.

1) Chủ đề chúng tôi đã tạo sử dụng các mẫu trang để xuất json được nhập thông qua các lệnh gọi ajax. I E. nếu bạn nhấn trang: theurl.com/sample - bạn sẽ nhận được json thuần túy. Mặc dù có một phiên bản không phải là javascript của mỗi trang và bài đăng, Ajax điều khiển mặt trước của chủ đề này. Chúng tôi đã xóa tiêu đề và chân trang trong các tệp này để nó hoàn toàn là json và chúng tôi đang cố gắng tìm ra cách xác định xem json có được lưu trong bộ nhớ cache hay không. Về lý thuyết, dữ liệu sẽ được lưu trong bộ nhớ cache vì về mặt kỹ thuật đó là một trang được phục vụ bởi wordpress. Nhưng, làm thế nào chúng ta có thể tìm ra nếu nó đang được lưu trữ?

2) Chúng tôi đang sử dụng plugin json api để phục vụ dữ liệu bài đăng nhất định. http://wordpress.org/extend/plugins/json-api/ Ví dụ này, giả sử chúng tôi đang sử dụng phương thức đầu ra mặc định của plugin và nhấn trang này: url.com/carget/news?json=1 - Có bất cứ ai biết làm thế nào chúng ta có thể xác minh nếu đầu ra này đang được lưu trữ? Nếu nó không được lưu vào bộ nhớ cache, phương pháp nào sẽ khiến điều này xảy ra?

Dường như không có nhiều thông tin về trực tuyến này, vì vậy trên tinh thần tạo ra các trang web wordpress hấp dẫn và tối ưu hóa, hãy giúp đỡ một người anh em

Câu trả lời:


9

Có vẻ như json đã không được lưu trữ bởi wp-super-cache, nhưng chúng tôi đã quyết định thực hiện một cách tiếp cận khác. Bằng cách sử dụng api thoáng qua , chúng tôi có thể thực hiện một bộ đệm giả trên tất cả json và giảm đáng kể việc đánh thuế cơ sở dữ liệu. Sau đó, về phía ajax của mọi thứ, chúng tôi đang lưu bộ đệm html được tạo từ json bán bộ nhớ cache này. Mọi thứ là siêu tốc độ! Đây là một phiên bản thu nhỏ của mã và khái niệm.

    $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;

tốt đẹp, ngón tay cái lên !!!
Dipesh KC

6

WP Super Cache kiểm tra các trang của trang WordPress của bạn để tìm một số thẻ HTML trước khi lưu trữ chúng.

Các trang của bạn hầu như không có </html>thẻ (vấn đề phổ biến), trong trường hợp đó, hãy thử thêm một cái gì đó như //</html>- đó là một cách giải quyết và WP Super Cache sau đó sẽ tạo các phiên bản được lưu trong bộ nhớ cache của các trang của bạn.

Tại sao WP Super Cache lại làm như vậy? Xem, không có cách rõ ràng nào để kiểm tra xem một trang chỉ được tải một nửa, hơn là kiểm tra xem tất cả các thẻ HTML cơ bản có tồn tại và được đóng đúng không.

Trong (nhà phát triển WP Super Cache của) Donncha của từ riêng , "Đó là để ngăn chặn một nửa trang được tạo được lưu trữ."


Tôi ước họ có tùy chọn để lưu trữ json cụ thể hoặc các loại dữ liệu khác. Vì vậy, nhiều lựa chọn và không phải là một trong những chúng tôi cần cho dự án này. Nhưng, đây là một cách giải quyết tuyệt vời. Tôi sẽ thử.
Starfs

3

LƯU Ý BẢO MẬT: Không nên sử dụng giải pháp này (và các giải pháp khác) trừ khi bạn có cách ghi đè Content-Type: text/htmltiêu đề mà WP Super Cache gửi với application/jsongiá trị phù hợp . Gửi JSON như text/htmlsẽ khiến trình duyệt hiển thị dưới dạng HTML, có khả năng là một vectơ XSS.

Có vẻ như điều đó cần phải được thực hiện ở lớp máy chủ, vì WPSC không cung cấp các hook cần thiết.


Đây là cách tôi đã làm nó. Nó tương tự như cách tiếp cận của Liang, nhưng không yêu cầu sửa đổi plugin trực tiếp và có mẫu regex chính xác hơn.

Nếu bạn đang sử dụng v2 của API REST, bạn nên sử dụng REST_REQUESTthay vì JSON_REQUEST.

Sẽ tốt hơn nếu bạn đăng ký 22# 79 trong trường hợp có gì đó thay đổi trong 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' );

Chào. Tôi sử dụng bộ lọc wp_cache_eof_tags, nhưng bây giờ (và chỉ khi bật bộ đệm ẩn) tôi mới gặp lỗi: XMLHttpRequest cannot load http://api.mywebsite.com/wp-json/wp/v2/posts. Origin http://mywebsite.com is not allowed by Access-Control-Allow-Origin.Làm cách nào tôi có thể sửa nó?
Łukasz Florczak

Vì bạn đã có API REST trên một tên miền riêng, trang web chính của bạn có thể đang xuất một Access-Control-Allow-Origintiêu đề để cho phép yêu cầu xuất xứ chéo. Tôi đoán rằng các trang được lưu trong bộ nhớ cache không xuất ra tiêu đề đó.
Ian Dunn

0

Tôi đã gặp vấn đề này quá. Tôi đã viết một số mã của tôi là API. Khi loại phản hồi là XML, bộ đệm đã hoạt động. Nhưng khi kiểu phản hồi là json, nó không hoạt động.

Phải mất vài giờ để sửa lỗi này.

Đây là công việc cho tôi.

nhập mô tả hình ảnh ở đây

Chỉ cần cập nhật mã của bạn như những thay đổi của tôi.

Nó làm việc cho tôi bây giờ.


5
Xin vui lòng gửi mã thực sự và không phải là một hình ảnh của mã.
Pieter Goosen

1
Bạn nên sử dụng wp_cache_eof_tagsbộ lọc thay vì sửa đổi plugin trực tiếp.
Ian Dunn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.