APCu オブジェクトキャッシュを使ってるとキャッシュを消すのに手間が掛かります。それを簡単に行う小技、毎度馬鹿馬鹿しいお話で恐縮です。
馬鹿馬鹿しいお話とお断りして、では前置きから行きます。
オブジェクトキャッシュとそのクリア
まず APCu オブジェクトキャッシュですが、APCu Object Cache Backend という部品を使って実現しています。
https://downloads.wordpress.org/plugin/apcu.1.0.2.zip をダウンロードして、コードの冒頭に次を追加します。
if ( is_admin() ) { return false; }
または、もうちょっと凝ったほうでも。
!defined( 'ABSPATH' ) and exit; if (!function_exists('apcu_fetch')) { return false; } $arrABS = explode('/', str_replace('\\', '/', ABSPATH)); if (is_admin() && !($_SERVER["SCRIPT_NAME"] == "/" . $arrABS[count($arrABS) - 2] . "/wp-admin/site-health.php")) {return false;}
※ 詳細はこちらの記事に → APCuオブジェクトキャッシュで高速化
上記いずれかを追加してから、wp-content 内にphpファイルを置くことでキャッシュが効きます。
が、キャッシュをクリアできません。クリアの仕組みを作らないといけません。クリア自体は PHP の関数を使います。
apcu_clear_cache()
これを仕込んだHTML的な独立したページを作って、そのURLをブラウザで開くことでキャッシュがクリアされるようにしました。
それだけだとまだ面倒なので、他人様の作ったコードを半パクリして、WordPress 管理画面でポストを保存したらその時点でクリアされるコードを functions.php に仕込みます。
function my_save_post($post) { apcu_clear_cache(); } add_action('save_post', 'my_save_post');
’save_post’ により、ポストを保存したタイミングで発動します。
この関数はいい感じですが、’save_post’ が効くのが限定的なので、クリアされないこともまだまだ多く残ります。
また、そもそもキャッシュクリアの独立したページを開くやり方が全く気に入りません。
もうちょっとましなやり方はないのんか。と、ポクポク考えて思いついたのが次の小技です。
オブジェクトキャッシュの便利なクリア
とりあえずこれまで使っていた独立したページを辞めます。その代わり、WordPress のテーマの中にテンプレファイルをひとつ作りましょう。
- テンプレートファイルを作って簡単なPHPを仕込む
- 固定ページを作ってショートコードで埋め込む
- その固定ページを呼び出すメニューを作ってWidgetに置く
クリアキャッシュをテンプレートファイルとして作成
apcu-cache-clear.php というそれらしい名前のファイルを作って、次の簡単なコードを書いて保存しました。
<?php apcu_clear_cache(); ?> <p>APCu cache cleared.</p> <p><input type="button" onclick="window.history.back();" value="もどる"></p>
単刀直入にこれだけです。最初にPHPのクリア関数、一言テキスト書いて、最後 input タグで javascript の「もどる」ボタンを設置しております。HTMLの独立したページを作るより断然シンプル。
固定ページに仕込む
apcu-cache-clear.php をショートコートで固定ページに読み込みます。
あ。ショートコードで PHP ファイルを読み込む仕掛けが必要でした。この仕組みを作っていない人向けに一言説明しておきます。以下を functions.php に書きます。
function php_file_Include($params = array()) { extract(shortcode_atts(array( 'file' => 'default' ), $params)); ob_start(); include(STYLESHEETPATH . "/$file.php"); return ob_get_clean(); } add_shortcode('php', 'php_file_Include');
[ php file = ‘テーマからの相対パス’ ] と、ショートコードを書くことで php ファイルをどこにでも読み込めます。
[ php file = 'apcu-cache-clear' ] // ショートコードをここに書くとマズいのでスペース空けてます
固定ページをひとつ作って、ショートコードだけを書いて、非公開で公開します。
![APCu キャッシュをクリアする非公開ページ](https://www.digitalboo.net/main/wp-content/uploads/2024/07/apcuクリア非公開ページ.png)
Widget に仕込む
さてこれだけで済ましません。このページを開くメニューを作り、それをウィジェットに表示させます。
おっとまた前提を忘れてた。ウィジェットの表示非表示を管理する Widget Logic という古いプラグインを使用しています。他の同じ目的のプラグインがあるのかどうか知りません。ざっと探したところ面倒くさそうなのが一つヒットしたくらいで良い代替が見つからないので Widget Logic、古いけど使い続けてます。
Widget Logic でログインしてる人間にだけ表示するようにしておきます。is_user_logged_in() です。
![is_user_logged_in を設定したwidget](https://www.digitalboo.net/main/wp-content/uploads/2024/07/apcuクリアwidget-288x320.png)
このwidgetを最も手を伸ばしやすい場所に配置します。
以上です。
カスタマイズ中、テンプレファイルやCSSを弄ってるとキャッシュクリアをすごい頻度で行います。生半可な簡単操作では我慢ならないので、我ながらこれは良くやったなと。たとえ APCu Manager などのプラグインが正しく動いていたとしても、ここまでかんたん操作でキャッシュクリアできることはちょっとないです。
そんなこんなで、馬鹿馬鹿しい小技のお話にお付き合いありがとうございました。