WordPressのサイドバーにカレンダーウィジェットを表示しています。今日の日付のセル(<td id=”today”>)は、cssで背景色を変えています。でも時々今日の日付ではないところの背景色が変わっていることに気がつきました。
APC(Alternative PHP Cache)とAPC Object Cacheを入れているのですが、日付が変わってもカレンダー部分のキャッシュが更新されず、昨日のセルにid=”today”が付いた状態だからでした。WordPressのソースコードを調べてみると、wp-includes/general-template.php
のdelete_get_calendar_cache()
をコールすれば良いようです。現状のコードでは記事の保存/削除、週の始まりやタイムゾーンの設定を行ったときにはカレンダーキャッシュが削除されるのですが、それ以外にトリガーはなさそうです。
どのようにすれば良いかはわかったのですが、コアファイルに手を入れるのもいやなので、簡単なプラグインを作ってみました。
試したバージョン
- APC 3.1.9
- WordPress 3.9 日本語版
- APC Object Cache 2.0.6
下記ファイルを作ってWordPressのプラグイン管理画面を開くと、’Daily delete get_calendar cache.’というプラグインが表示されるのでそれを有効にします。すると日付が変わって初めてアクセスがあったときに、get_calendarキャッシュが削除されるようになります。
専用のアクションフックを作って、wp-cronで00:00に実行されるようにしています。このサーバーで動けばOK程度に考えて作ったので、もしまずいところがあれば教えていただけると嬉しいです。
wp-content/plugins/daily-delete-calendar-cache/daily-delete-calendar-cache.php
<?php /* Plugin Name: Daily delete get_calendar cache. Plugin URI: https://blog.glatts.com/blog/imai/ Description: 日付が変わったらget_calendarキャッシュを削除する。 Version: 0.1 Author: Imai Author URI: https://blog.glatts.com/blog/imai/ */ register_activation_hook( __FILE__, 'daily_delete_calendar_cache_activate' ); register_deactivation_hook( __FILE__, 'daily_delete_calendar_cache_deactivate' ); add_action( 'daily_delete_calendar_cache', 'delete_get_calendar_cache' ); function daily_delete_calendar_cache_activate() { wp_schedule_event(strtotime(get_option('timezone_string') . ' tomorrow'), 'daily', 'daily_delete_calendar_cache'); } function daily_delete_calendar_cache_deactivate() { wp_clear_scheduled_hook('daily_delete_calendar_cache'); }