web-dev-qa-db-ja.com

Wp-super cacheでjsonをキャッシュする方法

新しいプロジェクトでは、カスタムコンテンツタイプの静的HTMLファイルを作成するために、wp-super-cache(クライアントが推奨するプラグイン)を使用しています。しかし、すべてが正しくキャッシュされているかどうかを判断しようとしています。

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

1)私たちが作成したテーマは、ページテンプレートを利用して、Ajax呼び出しによって取り込まれたjsonを出力します。すなわち。 theurl.com/sampleというページをクリックすると、純粋なjsonが表示されます。すべてのページと投稿にはJavaScript以外のバージョンがありますが、Ajaxはこのテーマのフロントエンドを推進します。純粋なJSONになるようにこれらのファイルのヘッダーとフッターを削除し、JSONがキャッシュされているかどうかを判断する方法を見つけようとしています。理論的には、データは技術的にはワードプレスによって提供されるページであるため、キャッシュに入れられます。しかし、それがキャッシュされているかどうかはどうすればわかりますか?

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

このオンラインについての情報はそれほど多くないように思われるので、説得力があり最適化されたワードプレスサイトを作成するという精神で、兄弟を助けてください。

14
Starfs

JSONはwp-super-cacheによってキャッシュされていないようですが、別のアプローチをとることにしました。 transient api を使用することで、すべてのJSONで偽キャッシュを実行でき、データベースの負担を大幅に減らすことができました。それから物事の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;
9
Starfs

WP Super Cacheは、キャッシュする前に、WordPressサイトのページのHTMLタグを調べます。

あなたのページはおそらく</html>タグを持っていないでしょう(よくある問題です)、その場合は//</html>のようなものを追加してみてください - それは回避策です、そしてWP.

なぜWP Super Cacheがそんなことをするのですか? 参照してください。基本的なHTMLタグがすべて存在し、正しく閉じられているかどうかを確認するよりも、ページが半分しかロードされていないかどうかを確認する明確な方法はありません。

Donnchaの(WP Super Cacheの開発者) 自身の言葉 で、「半分生成されたページがキャッシュされるのを止めることです。」

6
its_me

セキュリティメモ: WP Super Cacheが適切なContent-Type: text/html値で送信する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' );
3
Ian Dunn

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

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

これは私の仕事です。

enter image description here 

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

それは今私のために働きます。

0
Liang Rongze