【WordPress】キャッシュ有効期限を記事と記事一覧で切り替える
問題
WordPressの記事にExpireヘッダ、Cache-Controlヘッダを付与したい。
その際、記事ページは長めの有効期限、トップページや記事一覧ページは短めの有効期限にしたい。

答え
Apacheに以下のような設定をしておくと、普段はそちらが適用される。
例)画像などは1週間キャッシュしてよい。HTMLは1日キャッシュしてよい。
ExpiresActive On
ExpiresByType text/html "access plus 1 days"
ExpiresDefault "access plus 1 weeks"
そのうえで、WordPressから必要な時だけヘッダを出力する。
コンテンツの種類に応じてヘッダを出し分けたい場合は、'template_redirect'フックがちょうどよかった。
/**
* 一覧系(単体記事以外)のキャッシュ時間を短くする
*/
function my_header_cache_control() {
if (is_home() || is_front_page() || is_archive()) {
header('Expires: ' . gmdate( 'D, d M Y H:i:s', time() + 600 ) . ' GMT');
header('Cache-Control: max-age=600, public');
age=0');
}
}
add_action('template_redirect', 'my_header_cache_control');
「600」と書いている箇所は、希望の時間(秒数)に応じて書き換える。
Cache-Controlだけだと Apacheも Cache-Controlを出力してくるので、Expireとセットで出力する。そうすると、Apacheは Cache-Control: max-age=~ を出力してこない。