MagpieRSSのしつこいキャッシュに悩みました

概要

WordPress(現在バージョン3.2.1)には、RSSフィードをパースするための、MagpieRSSベースの機能がついてます。

include_once(ABSPATH . WPINC . ‘/rss.php’);
$rss = fetch_rss(‘$feedurl’);

これを利用して、WordPressで作成した別のサイトのRSSフィードを読み込んで、表示させる仕組みを作っています。
1回目の表示は簡単にできました。
2回目、本文の抜粋表示の長さと「続きを読む」の表示まわりを調整して再表示を試みましたが、さっきと全く変わりません。
ブラウザのキャッシュを消しても変わりません。

調査

出力側がおかしいのか、読み込んで表示させる方がおかしいのか・・・。

フィードはブラウザに表示させて、変更点が反映されているこをと確認したので、問題は読み込み側、どうやらキャッシュが怪しいというところまで分かりました。

その後ソースを追ったり、DBのキャッシュ(wp_optionテーブルにRSSとキャッシュの有効期限が格納されます)をチェックしたりして、定数に不適切な値をセットしたのが原因と分かりました。

まとめ

MagpieRSS(/p-includes/rss.php)のデフォルト設定では、「キャッシュを使用」、「有効期限はセットしてから3600秒」になっています。

define(‘MAGPIE_CACHE_ON’, 1);
define(‘MAGPIE_CACHE_AGE’, 3600);

この値は、呼び出し側で上書きできます。
キャッシュの有効期限がすぐくるように、

define('MAGPIE_CACHE_AGE', 0);

と書きました。表示内容に変化は起こりません。その後 MAGPIE_CACHE_AGE に別の値を入れても、何も変わりません。
理由は以下のコードにあります。

class RSSCache {
var $BASE_CACHE; // where the cache files are stored
var $MAX_AGE = 43200; // when are files stale, default twelve hours
var $ERROR = ”; // accumulate error messages
function RSSCache ($base=”, $age=”) {
$this->BASE_CACHE = WP_CONTENT_DIR . ‘/cache’;
if ( $base ) {
$this->BASE_CACHE = $base;
}
if ( $age ) {
$this->MAX_AGE = $age;
}
}

RSSCache のコンストラクタの引数$ageに MAGPIE_CACHE_AGE が渡されます。
$ageに0が渡されると$MAX_AGEはデフォルトの43200(12時間)になります。
一度12時間後にセットされてしまったので、その後キャッシュの有効期限をいくら小さい値に変えても影響しないわけです。

DBのキャッシュを消して、新たに作成したキャッシュの保存期限を念のため調べてみたら12時間後。
これを見て、何が起こっているのか理解することができました。

ここまできたところで、「MAGPIE_CACHE_AGE」で検索したら、同じ目にあっている方を発見しました。
もう少し早く発見できればよかった・・・。

MagpieRSSのキャッシュとConditional GETについて – F.Ko-Jiの「一秒後は未来」
F.Ko-Jiの「一秒後は未来」