WP-Super önbellek ile json nasıl önbelleğe alınır


15

Yeni bir projede, özel içerik türleri için statik html dosyaları oluşturmak için wp-super-cache (istemcinin tercih ettiği eklenti) kullanıyoruz. Ancak her şeyin düzgün bir şekilde önbelleğe alınıp alınmadığını anlamaya çalışıyoruz.

Bu 2 bölümlü bir soru.

1) Oluşturduğumuz tema, ajax çağrıları yoluyla alınan json çıktısı için sayfa şablonlarını kullanır. yani. Sayfayı vurursanız: theurl.com/sample - saf json elde edersiniz. Her sayfanın ve yayının javascript olmayan bir sürümü olsa da, Ajax bu temanın ön ucunu kullanır. Saf json olması için bu dosyalarda üstbilgi ve altbilgiyi kaldırdık ve json'un önbelleğe alınıp alınmadığını nasıl belirleyeceğimizi anlamaya çalışıyoruz. Teorik olarak veriler önbelleğe alınacaktır çünkü teknik olarak wordpress tarafından sunulan bir sayfadır. Ancak, önbelleğe alınıp alınmadığını nasıl anlayabiliriz?

2) Belirli post verilerini de sunmak için json api eklentisini kullanıyoruz. http://wordpress.org/extend/plugins/json-api/ Bu örnek için, eklentinin varsayılan çıktı yöntemini kullandığımızı ve bu sayfaya isabet ettiğimizi varsayalım: url.com/category/news?json=1 - kimse bu çıktının önbelleğe alındığını nasıl doğrulayabiliriz biliyor? Önbelleğe alınmazsa, bu hangi yöntemi gerçekleştirir?

Bu çevrimiçi hakkında çok fazla bilgi yok gibi görünüyor, bu yüzden zorlayıcı ve optimize edilmiş wordpress siteleri oluşturma ruhu içinde bir kardeşe yardım et

Yanıtlar:


9

Json'un wp-super-cache tarafından önbelleğe alınmadığı anlaşıldı, ancak farklı bir yaklaşım benimsemeye karar verdik. Geçici API kullanarak, tüm json üzerinde bir sahte önbellek yapmak ve veritabanının vergilendirmesini büyük ölçüde azaltabildik. Sonra şeylerin ajax tarafında, biz bu yarı-önbelleğe alınmış json oluşturulan html önbelleğe. İşler süper hızlı! İşte kodun ve kavramın ölçeklendirilmiş bir versiyonu.

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

güzel, yaşasın !!!
Dipesh KC

6

WP Süper Önbellek, WordPress sitenizin sayfalarını önbelleğe almadan önce bazı HTML etiketleri için inceler.

Sayfalarınız büyük olasılıkla </html>etiketine sahip değildir (genel sorun), bu durumda, böyle //</html>bir çözüm eklemeyi deneyin - bu bir geçici çözümdür ve WP Süper Önbellek sayfalarınızın önbelleğe alınmış sürümlerini oluşturmalıdır.

WP Super Cache neden böyle yapıyor? Bir sayfanın yalnızca yarı yüklü olup olmadığını kontrol etmenin, tüm temel HTML etiketlerinin var olup olmadığını ve düzgün bir şekilde kapatıldığını kontrol etmenin açık bir yolu yoktur.

Donncha'nın (WP Super Cache geliştiricisi) kendi sözleriyle , "Bu, oluşturulan yarı sayfaların önbelleğe alınmasını durdurmaktır."


Keşke özellikle json veya diğer veri türlerini önbellekleme seçeneği olsaydı. Bu proje için ihtiyacımız olan pek çok seçenek değil. Ancak, bu harika bir çözüm. Bir deneyeceğim.
Starfs

3

GÜVENLİK NOT: Bu (ve diğer çözümler) Content-Type: text/html, WP Süper Önbelleğin uygun application/jsondeğerle gönderdiği üstbilgiyi geçersiz kılmanın bir yolu yoksa kullanılmamalıdır . JSON'u olduğu gibi göndermek text/html, tarayıcının HTML olarak görüntülenmesine neden olur ve bu da bir XSS vektörü olabilir.

WPSC gerekli kancaları sağlamadığından, sunucu katmanında yapılması gerekiyor gibi görünüyor.


Ben böyle yaptım. Liang'ın yaklaşımına benzer, ancak eklentiyi doğrudan değiştirmeyi gerektirmez ve daha kesin bir normal ifade modeline sahiptir.

REST API'sinin v2'sini kullanıyorsanız, REST_REQUESTyerine kullanmalısınız JSON_REQUEST.

WP Super Cache'de bir değişiklik olması durumunda 22 ve # 79'a abone olmak iyi olur .

/**
 * 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' );

Selam. Ben wp_cache_eof_tags filtre kullanın, ama şimdi (ve sadece önbellek etkin olduğunda) bir hata var: XMLHttpRequest cannot load http://api.mywebsite.com/wp-json/wp/v2/posts. Origin http://mywebsite.com is not allowed by Access-Control-Allow-Origin.Nasıl düzeltebilirim?
asukasz Florczak

REST API'sını ayrı bir alanda bulunduğunuzdan, ana siteniz büyük olasılıkla Access-Control-Allow-Originçapraz kaynak isteğine izin vermek için bir başlık dışa aktarıyor. Önbelleğe alınmış sayfaların bu başlığı çıktısı olmadığını tahmin ediyorum.
Ian Dunn

0

Ben de bu problemle karşılaştım. Bazı kodumu API olarak yazmıştı. Yanıt türü XML olduğunda önbellek çalıştı. Ancak yanıt türü json olduğunda işe yaramadı.

Bu hatayı düzeltmek birkaç saatimi alıyor.

Bu benim için bir iş.

resim açıklamasını buraya girin

Kodumu değişikliklerim gibi güncelleyin.

Şimdi benim için çalışıyor.


5
Lütfen kodun resmini değil gerçek kodu gönderin.
Pieter Goosen

1
Sen kullanmalıdır wp_cache_eof_tagsyerine eklentiyi doğrudan değiştirme filtre.
Ian Dunn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.