新しいプロジェクトでは、カスタムコンテンツタイプの静的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 - この出力がキャッシュされているかどうかを確認する方法を誰かが知っていますか?キャッシュされていない場合は、どのような方法でこれを実現できますか?
このオンラインについての情報はそれほど多くないように思われるので、説得力があり最適化されたワードプレスサイトを作成するという精神で、兄弟を助けてください。
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;
WP Super Cacheは、キャッシュする前に、WordPressサイトのページのHTMLタグを調べます。
あなたのページはおそらく</html>
タグを持っていないでしょう(よくある問題です)、その場合は//</html>
のようなものを追加してみてください - それは回避策です、そしてWP.
なぜWP Super Cacheがそんなことをするのですか? 参照してください。基本的なHTMLタグがすべて存在し、正しく閉じられているかどうかを確認するよりも、ページが半分しかロードされていないかどうかを確認する明確な方法はありません。
Donnchaの(WP Super Cacheの開発者) 自身の言葉 で、「半分生成されたページがキャッシュされるのを止めることです。」
セキュリティメモ: 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' );