【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);

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

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

この記事を書いた人

コメント

コメントする

目次