Cara me-cache json dengan cache wp-super

15

Dalam proyek baru kami menggunakan wp-super-cache (plugin pilihan klien) untuk membuat file html statis untuk tipe konten khusus. Tapi kami berusaha mencari tahu apakah semuanya di-cache dengan benar.

Ini adalah pertanyaan 2 bagian.

1) Tema yang kami buat menggunakan templat halaman untuk menampilkan json yang dicerna melalui panggilan ajax. yaitu. jika Anda menekan halaman: theurl.com/sample - Anda akan mendapatkan json murni. Meskipun ada versi non-javascript dari setiap halaman dan posting, Ajax menggerakkan ujung depan tema ini. Kami telah menghapus header dan footer di file-file ini sehingga itu adalah json murni, dan kami mencoba mencari cara untuk menentukan apakah json sedang di-cache. Secara teori data akan di-cache karena secara teknis halaman ini dilayani oleh wordpress. Tapi, bagaimana kita mencari tahu apakah itu sedang di-cache?

2) Kami menggunakan plugin json api untuk menyajikan data posting tertentu juga. http://wordpress.org/extend/plugins/json-api/ Untuk contoh ini, katakanlah kita menggunakan metode output plugin default dan mengenai halaman ini: url.com/category/news?json=1 - Apakah ada yang tahu bagaimana kami dapat memverifikasi jika output ini di-cache? Jika tidak di-cache, metode apa yang akan membuat ini terjadi?

Sepertinya tidak ada banyak informasi tentang ini secara online, jadi dengan semangat menciptakan situs wordpress yang menarik dan dioptimalkan, bantu seorang saudara

Starfs
sumber

Jawaban:

9

Tampaknya json tidak di-cache oleh wp-super-cache, tetapi kami memutuskan untuk mengambil pendekatan yang berbeda. Dengan menggunakan api sementara , kami dapat melakukan cache palsu pada semua json, dan secara drastis mengurangi pengenaan pajak pada basis data. Kemudian di sisi ajax, kita caching html yang dibuat dari json semi-cache ini. Semuanya sangat cepat! Ini adalah versi kode dan konsep yang diperkecil.

    $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;
Starfs
sumber
bagus, acungan jempol !!!
Dipesh KC
6

WP Super Cache memeriksa halaman situs WordPress Anda untuk beberapa tag HTML sebelum di-cache.

Halaman Anda kemungkinan besar tidak memiliki </html>tag (masalah umum), dalam hal ini, coba tambahkan sesuatu seperti //</html>- itu solusinya, dan WP Super Cache kemudian harus menghasilkan versi cache halaman Anda.

Mengapa WP Super Cache melakukannya seperti itu? Lihat, tidak ada cara yang jelas untuk memeriksa apakah halaman hanya setengah dimuat, daripada memeriksa apakah semua tag HTML dasar ada dan ditutup dengan benar.

Dalam kata-kata Donncha (pengembang WP Super Cache) sendiri , "Ini untuk menghentikan setengah halaman yang dihasilkan di-cache."

ini aku
sumber
Saya berharap mereka memiliki opsi untuk men-cache json secara khusus, atau tipe data lainnya. Begitu banyak pilihan dan bukan yang kami butuhkan untuk proyek ini. Tapi, ini adalah solusi yang keren. Saya akan mencobanya.
Starfs
3

CATATAN KEAMANAN: Ini (dan solusi lainnya) tidak boleh digunakan kecuali jika Anda memiliki cara untuk mengganti Content-Type: text/htmlheader yang dikirim WP Super Cache dengan nilai yang sesuai application/json. Mengirim JSON text/htmlakan menyebabkan browser merendernya sebagai HTML, yang berpotensi menjadi vektor XSS.

Sepertinya itu perlu dilakukan pada lapisan server, karena WPSC tidak menyediakan kait yang diperlukan.


Beginilah cara saya melakukannya. Ini mirip dengan pendekatan Liang, tetapi tidak perlu memodifikasi plugin secara langsung, dan memiliki pola regex yang lebih tepat.

Jika Anda menggunakan v2 dari REST API, Anda harus menggunakan REST_REQUESTbukan JSON_REQUEST.

Akan lebih baik untuk berlangganan ke 22 dan # 79 jika terjadi perubahan dalam 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' );
Ian Dunn
sumber
Hai. Saya menggunakan filter wp_cache_eof_tags, tetapi sekarang (dan hanya ketika caching diaktifkan) saya memiliki kesalahan: XMLHttpRequest cannot load http://api.mywebsite.com/wp-json/wp/v2/posts. Origin http://mywebsite.com is not allowed by Access-Control-Allow-Origin.Bagaimana cara memperbaikinya?
Łukasz Florczak
Karena Anda memiliki REST API pada domain terpisah, situs utama Anda mungkin mengekspor Access-Control-Allow-Originheader untuk membolehkan permintaan lintas asal. Saya menduga bahwa halaman yang di-cache tidak menampilkan header itu.
Ian Dunn
0

Saya juga menemui masalah ini. Saya telah menulis beberapa kode saya menjadi API. Saat tipe respons adalah XML, cache berfungsi. Tetapi ketika tipe respons adalah json, itu tidak berhasil.

Butuh beberapa jam saya untuk memperbaiki bug ini.

Ini bekerja untuk saya.

masukkan deskripsi gambar di sini

Cukup perbarui kode Anda seperti perubahan saya.

Ini bekerja untuk saya sekarang.

Liang Rongze
sumber
5
Silakan kirim kode nyata dan bukan gambar kode.
Pieter Goosen
1
Anda harus menggunakan wp_cache_eof_tagsfilter alih-alih memodifikasi plugin secara langsung.
Ian Dunn