最近、Litespeedを使っているサイトが増えてきています。例えば、mixhostやcolorfullbox、ロリポップのハイスピードプランなどです。Litespeedを使っているサイトではLitespeed cacheというキャッシュプラグインが使えます。

このプラグインは便利なのですが、なんでもキャッシュしてしまうので動的なコンテンツが更新されなくなります。
部分的にキャッシュしないようなディレクティブがあるのかと調べましたが、ありませんでした。
ESIという仕組みを使うと部分キャッシュ除外を実現できましたので、ご紹介いたします
キャッシュから除外した方が良い場合
訪問者ごとに表示内容が異なり、かつ、リアルタイム性が強い部分は、キャッシュしてしまうと意味がなくなります。
例えば、最近見た記事などは、ユーザーごとに違いますし、サイトを回遊している間は常に更新されるべき内容です。
記事のランキングなどは、全体キャッシュと同じ管理でパージするのであれば除外する必要はないです。
ESIを使うと部分キャッシュ除外が実現できる
litespeed cacheでは、ESIという仕組みがあります。ESIを使うと、ウィジェットやショートコードはキャッシュ対象から除外できます。
ESIを設定から有効にする
litespeed cahceのESI設定からESIを有効化します。
widgetでESI設定からキャッシュ対象から除外する
ESIを有効化するとウィジェットにESIの設定項目が追加されるので、非公開にしてttlを0にすればそのウィジェットの出力はキャッシュから除外されます。
ショートコードをESIでキャッシュから除外する
キャッシュしたくないPHPをショートコードとして定義します。もとからショートコードの場合は特に何もしなくてよいです。
以下は、hogehogeというショートコードを呼び出して、キャッシュしない時の例です。
先頭にesiをつけて、後ろに、cache=”private” ttl=”0″をつければOKです。
<?php
do_shortcode('[ esi hogehoge cache="private" ttl="0"]');
PHPコードの一部をキャッシュから除外する
PHPコードの一部をキャッシュから除外したいことが多いと思います。そのPHPの一部をショートコード化したり、ウィジェットにすれば今まで説明した方法で対応できます。
しかし、そんな方法は面倒すぎて耐えられません。
公式にPHPコードの一部をESIブロックにする方法が書かれていました。
WordPressに慣れていないとかなりわかりにくいのですが、基本そのままコピペして書き換えれば大丈夫です。
パラメータを渡さない例
<?php
add_action( 'litespeed_esi_load-my_esi_block', 'my_esi_block_esi_load' );
function my_esi_block_esi_load()
{
//do_action( 'litespeed_control_set_ttl', 300 );
do_action( 'litespeed_control_set_nocache' );
echo "Hello world".rand (1,99999);
}
some_code_here
<div>
<?php
echo apply_filters( 'litespeed_esi_url', 'my_esi_block', 'Custom ESI block' );
?>
</div>
some_code_here
パラメータを渡す例
公式の例だとパラメータを渡すことができないので、以下のようにすればパラメータを渡すことができました。
ただし、パラメータを渡すときは、パラメータによって動作が変わるような処置は、パラメータがキャッシュされている場合、うまくいかないと思います。
通常の使用ではパラメータを渡して動きを変えるという使い方はしないのかもしれません。ESIブロックの中で閉じて動きを変えられるようにブロックの切り口を考える必要があります。
some_code_here
<div>
<?php
$params = array(
'meta_titles' => $meta_titles,
'terms' => $terms
) ;
echo apply_filters( 'litespeed_esi_url', 'my_esi_block', 'Custom ESI block',$params );
?>
</div>
some_code_here
<?php
add_action( 'litespeed_esi_load-my_esi_block', 'my_esi_block_esi_load' );
function my_esi_block_esi_load($params)
{
// $params['terms']['term_id']とかで参照する
//do_action( 'litespeed_control_set_ttl', 300 );
do_action( 'litespeed_control_set_nocache' );
echo "Hello world".rand (1,99999);
}
不要なコメントを出力しない設定
litespeed cacheはHTMLコメントを結構出力してきます。ショートコードの場合にもコメントがくっついてくるので、それが邪魔になる場合は以下の設定で出力OFFにできます。
add_filter( 'litespeed_comment', '__return_false' );
if ( ! defined( 'LSCACHE_ESI_SILENCE' ) ) {
define( 'LSCACHE_ESI_SILENCE', true );
}
通常、上記の設定で消えますが、ショートコードを呼び出すタイミングによってはコメント出力が止まりません。
その場合は最終手段で、すべて出力した後にHTML上でコメントを削除します。
// the_content置換
function call_back($buffer) {
$outtxt = do_shortcode('[esi hogehoge cache="private" ttl="0"]');
$outtxt = preg_replace('/<!--[\s\S]*?-->/s', '', $outtxt);
$buffer = preg_replace('/https:\/\/www\.xxxx\.com\/mail\//s',
$outtxt,$buffer); //HTML出力で置き換える処理
return $buffer;
}
function buf_start() {
ob_start("call_back");
}
function buf_end() {
}
if(!is_admin()){
add_action('after_setup_theme', 'buf_start');
add_action('shutdown', 'buf_end');
}
まとめ
この記事は、Litespeed cacheの部分キャッシュ除外の方法についてご紹介しました。おそらく必要な場面は結構あると思います。