【PHP】画像をブラウザキャッシュさせない!

WordPressのプラグイン開発時のPHPの覚書です。

【PHP】画像をブラウザキャッシュさせない!

キャッシュクリアという考え方はない

PHPからキャッシュクリアすることはできないようです。あらかじめキャッシュさせないが正解です。

PHPのヘッダーでブラウザキャッシュを無効にする方法は使えない

画像をキャッシュする場合、次のようなコードは使えません。

function add_no_cache_headers() {
    $headers = array(
        "Cache-Control: no-store, no-cache, must-revalidate, max-age=0",
        "Cache-Control: post-check=0, pre-check=0",
        "Pragma: no-cache",
        "Expires: 0"
    );
    foreach ($headers as $header) {
        header($header);
    }
}
add_action('send_headers', 'add_no_cache_headers');

add_no_cache_headers 関数は画像のキャッシュには直接関係ありません。この関数は主にHTMLページ全体のキャッシュを制御するものであり、個別の画像ファイルには影響しません。この関数はサイト全体のキャッシュに影響を与えるため、アイキャッチ画像だけを対象とするプラグインには適していません。すべてのページでキャッシュを無効にすることは、サイトのパフォーマンスに悪影響を与える可能性があります。

SRCにパラメーターを付与して別の画像として認識させる

Stack Overflowにパラメーターを付与させる方法が案内があり、それに習いました。なお、最初はうまくいかず、次のように調整したらうまくいきました。

function update_featured_image_src($html, $post_id, $post_thumbnail_id, $size, $attr) {
    // DOMDocumentを使用せず、単純な文字列置換を行います
    $timestamp = time(); // 現在のタイムスタンプを取得
    
    // src属性を更新
    $html = preg_replace(
        '/src="([^"]*)"/',
        'src="$1?v=' . $timestamp . '"',
        $html
    );
    
    // srcset属性を更新(存在する場合)
    $html = preg_replace_callback(
        '/srcset="([^"]*)"/',
        function($matches) use ($timestamp) {
            $srcset = explode(',', $matches[1]);
            foreach($srcset as &$src) {
                $src = trim($src);
                $src = preg_replace('/^(\S+)/', '$1?v=' . $timestamp, $src);
            }
            return 'srcset="' . implode(', ', $srcset) . '"';
        },
        $html
    );
    
    return $html;
}
add_filter('post_thumbnail_html', 'update_featured_image_src', 99, 5);

いくつか補足しておきます。

  • DOMDocument の使用は、HTML 全体を解析する必要があり、オーバーヘッドが大きくなる可能性があります。文字列置換の方が処理が軽量で高速です。
  • uniqid() を使用する方法もありますが、time()の方がわかりやすいでしょう。
  • src 属性と srcset 属性の更新としました。

ご参考になれば幸いです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする