wp-superキャッシュでJSONをキャッシュする方法


15

新しいプロジェクトでは、wp-super-cache(クライアントの優先プラグイン)を使用して、カスタムコンテンツタイプの静的htmlファイルを作成しています。しかし、すべてが適切にキャッシュされているかどうかを把握しようとしています。

これは2部構成の質問です。

1)作成したテーマは、ページテンプレートを使用して、ajax呼び出しを介して取り込まれたjsonを出力します。すなわち。ページにアクセスすると:theurl.com/sample-純粋なjsonが得られます。すべてのページおよび投稿の非JavaScriptバージョンがありますが、Ajaxはこのテーマのフロントエンドを駆動します。これらのファイルのヘッダーとフッターを削除して純粋なjsonにし、jsonがキャッシュされているかどうかを判断する方法を見つけようとしています。理論的には、データはワードプレスが提供するページであるため、データはキャッシュされます。しかし、キャッシュされているかどうかはどうすればわかりますか?

2)json apiプラグインを使用して、特定の投稿データも提供しています。 http://wordpress.org/extend/plugins/json-api/ この例では、プラグインのデフォルトの出力方法を利用して、このページにアクセスするとします。myurl.com/category/news?json=1-はこの出力がキャッシュされているかどうかを確認する方法は誰でも知っていますか?キャッシュされていない場合、これを実現する方法は何ですか?

このオンラインに関する情報はあまりないようです。そのため、魅力的で最適化されたワードプレスサイトを作成するという精神で、兄弟を助けてください。

回答:


9

jsonはwp-super-cacheによってキャッシュされていないように見えましたが、別のアプローチを取ることにしました。transient apiを使用することで、すべてのjsonでfaux-cacheを実行し、データベースの負担を大幅に削減できました。次に、Ajax側では、このセミキャッシュjsonから作成されたhtmlをキャッシュしています。物事は超高速です!これは、コードと概念の縮小版です。

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

いいね!
ディペシュ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は必要なフックを提供しないため、サーバー層でそれを行う必要があるようです。


これは私がやった方法です。Liangのアプローチに似ていますが、プラグインを直接変更する必要はなく、より正確な正規表現パターンがあります。

REST APIのv2を使用している場合は、のREST_REQUEST代わりに使用する必要がありますJSON_REQUEST

WP Super Cacheで何かが変更された場合に備えて、22#79をサブスクライブすることをお勧めします。

/**
 * 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.どうすれば修正できますか?
ルカシュFlorczak

REST APIは別のドメインにあるため、メインサイトはおそらくAccess-Control-Allow-Originヘッダーをエクスポートしてクロスオリジンリクエストを許可します。キャッシュされたページがそのヘッダーを出力していないと推測しています。
イアン・ダン

0

私もこの問題に出会いました。私は自分のコードをいくつかAPIとして書きました。応答タイプがXMLの場合、キャッシュは機能していました。しかし、応答タイプがjsonの場合、動作しませんでした。

このバグを修正するには数時間かかります。

これは私の仕事です。

ここに画像の説明を入力してください

私の変更のようにコードを更新するだけです。

今はうまくいきます。


5
コードの画像ではなく、実際のコードを投稿してください。
ピーターグースン

1
wp_cache_eof_tagsプラグインを直接変更する代わりに、フィルターを使用する必要があります。
イアン・ダン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.