- WordPressの画像キャッシュ問題により、差し替えた画像が古い状態で表示されることがあります。
- これは、ブラウザのキャッシュと画像URLの仕様が主な原因でした。
- キャッシュが読み込まれないように、functions.phpに管理者用に JavaScriptのコードを追加して、動的に画像URLにタイムスタンプを付与するようにしました。
1. WordPressの画像キャッシュ問題
WordPressでサイトを運営しているのですが、差し替えた画像ファイルをプラグイン(Media Cleaner)で削除しています。
ところが、編集画面で作業していて新しい画像を挿入すると、古い画像キャッシュが表示されることがあり困っています。
WordPressで画像の表示に関する問題が発生している要因として、以下があります。
- ブラウザのキャッシュ
- WordPressのメディア管理
- ウェブサーバ側のキャッシュ
- 画像アドレスの問題
特に、重要なのは「ブラウザのキャッシュ」です。
ブラウザは、ページの表示を速くするために、一度表示した画像データを保存しています。
このため、同じアドレス(URL)の画像を新しいものに変更しても、ブラウザが古い画像データを表示してしまうことがあります。
1-1. 画像のアドレス(URL)の問題
WordPressは画像のアドレスに更新日時などの情報を含めません。
そのため、画像を新しいものに替えても、同じアドレスの画像は同じものとして扱われがちです。
また、プラグインで画像を削除しても、ページの編集画面で使用している画像のアドレスが更新されないことがあります。
2. functions.phpで処理
そこで、functions.phpに以下のようなコードを追加してみました。
function prevent_image_cache_in_admin() {
if (!is_admin()) {
return;
}
?>
<script>
document.addEventListener('DOMContentLoaded', function() {
// メディアボタンクリック時の処理
document.querySelectorAll('.add_media').forEach(button => {
button.addEventListener('click', refreshImageUrls);
});
// クリップボードからのペースト時の処理
document.addEventListener('paste', function(e) {
setTimeout(refreshImageUrls, 1000); // ペースト完了後に実行
});
// エディタ内の画像更新処理
function refreshImageUrls() {
setTimeout(function() {
document.querySelectorAll('.attachment img, .wp-block-image img').forEach(img => {
if (img.src && !img.src.includes('?v=')) {
img.src = img.src + '?v=' + Date.now();
}
});
}, 500);
}
// DOM変更の監視(動的に追加される画像用)
const observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.addedNodes.length) {
refreshImageUrls();
}
});
});
// エディタ領域の監視を開始
const editor = document.querySelector('#editor, #content');
if (editor) {
observer.observe(editor, {
childList: true,
subtree: true
});
}
});
</script>
<?php
}
add_action('admin_footer', 'prevent_image_cache_in_admin');
2-1. URLの強制的な変更
- ブラウザは「同じURL = 同じ画像」と判断します
- URLが異なれば(パラメータが付いていても)、新しい画像として扱います
そこで、このコードではまず、画像のURLの末尾に「?v=(タイムスタンプ)」を追加します。
このパラメータが変わることで、ブラウザは「新しい画像」だと認識します。
- 例:
image.jpg
→image.jpg?v=1704631234567
タイミングの制御
画像が追加されたタイミングを3つの方法で検知したら、少し遅延(500ms)を入れて画像の読み込みが完了するのを待ちます。
- メディアボタンのクリック時
- クリップボードからのペースト時
- DOM(ページの要素)の変更時
また、MutationObserverという機能で、エディタ内の変更を常に監視します。
新しい画像が追加されるたびに、自動的にURLの更新処理が走ります
2-2. 管理者画面でだけ動作する
実際にユーザーに表示される画像URLにも影響あるんじゃない?
コードは管理画面(is_admin()が真の場合)でのみ実行されます。
一般ユーザーが見るフロントエンドページでは実行されません。
また、編集画面でのプレビュー表示のために動的にURLを変更しています。
そのために、JavaScriptのコードを追加しています。
つまり、実際のHTMLエディタ内の画像URLや、データベースに保存される画像URLか変更されているわけではないのです。
2-3. 【補足】サーバー側での一時保存の影響
WordPressで使用している機能拡張(プラグイン)が、ページや画像データを一時的に保存していることもあります。
また、高速化のための仕組み(CDN)を使用している場合、そこでも古いデータが保存されている可能性もあります。