【スポンサーリンク】

WordPressの編集画面での差し替えた画像が古い状態で表示される?(画像キャッシュ)

WordPressの編集画面での差し替えた画像が古い状態で表示される?(画像キャッシュ)
  • 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.jpgimage.jpg?v=1704631234567

タイミングの制御

画像が追加されたタイミングを3つの方法で検知したら、少し遅延(500ms)を入れて画像の読み込みが完了するのを待ちます。

  • メディアボタンのクリック時
  • クリップボードからのペースト時
  • DOM(ページの要素)の変更時

また、MutationObserverという機能で、エディタ内の変更を常に監視します。
新しい画像が追加されるたびに、自動的にURLの更新処理が走ります

2-2. 管理者画面でだけ動作する

管理者画面でだけ動作する

実際にユーザーに表示される画像URLにも影響あるんじゃない?

コードは管理画面(is_admin()が真の場合)でのみ実行されます。
一般ユーザーが見るフロントエンドページでは実行されません。

また、編集画面でのプレビュー表示のために動的にURLを変更しています。
そのために、JavaScriptのコードを追加しています。

つまり、実際のHTMLエディタ内の画像URLや、データベースに保存される画像URLか変更されているわけではないのです。

2-3. 【補足】サーバー側での一時保存の影響

WordPressで使用している機能拡張(プラグイン)が、ページや画像データを一時的に保存していることもあります。

また、高速化のための仕組み(CDN)を使用している場合、そこでも古いデータが保存されている可能性もあります。

こちらもどうぞ。
[WordPress] メディアライブラリの「添付」されたり、されなかったり?
[WordPress] メディアライブラリの「添付」されたり、されなかったり?
WordPressのメディアライブラリには「添付」という概念があり、画像と投稿・固定ページの関連付けを管理します。画像の挿入や削除により添付状態が変化しますが、URLリンクでの指定は技術的に「添付」にはなりません。メディアライブラリから画像を選択することで、管理の効率化やSEO対策、セキュリティ向上などの利点があります。WordPressのメディアライブラリにおける「添付」の意味WordPressのメディアライブラリには「添付」という概念があります。メディアライブラリでは、各...

[mac] WebP画像をPNGに変換したい【Big Surと変換アプリ】
[mac] WebP画像をPNGに変換したい【Big Surと変換アプリ】
macでWebP画像をPNG形式に変換するには、App Storeにある「WebP Converter」がオススメです。ドラッグ&ドロップで変換できるので、スムーズです。WebPは比較的 新しい画像フォーマットですが、mac OS Big Surからは標準でサポートされています。「プレビュー」アプリでも、変換して書き出すことができるようになっています。WebPは軽量画像フォーマットインターネットから画像をダウンロードすると、たまにWebPというファイル形式の場合があります。「...

WordPressにSVG画像をアップロードできるようにした(functions.php)
WordPressにSVG画像をアップロードできるようにした(functions.php)
WordPressではセキュリティ上の理由からSVGファイルのアップロードが制限されています。functions.phpにカスタム関数を追加すれば、ブログエディタでのSVGアップロードを許可できます。ただし、アップロードを許可する場合、リスクも認識しておくことが大事です。「このファイルタイプ(SVG)をアップロードする権限がありません」WordPressにSVGファイルをアップロードしようとしたらエラーになりました。このファイルタイプをアップロードする権限がありません。fun...

[WordPress]画像キャプションをalt属性を自動設定するカスタムスクリプト(functions.php)
[WordPress]画像キャプションをalt属性を自動設定するカスタムスクリプト(functions.php)
WordPressの画像ブロックにおいて、キャプションをalt属性に自動設定するカスタムスクリプトを作成しました。このスクリプトは、figcaptionタグ内のテキストを優先的にalt属性に設定します。functions.phpに追加することで、画像のアクセシビリティを向上させることができます。画像のキャプションをalt文字列に活用したいWordPressの画像ブロックには、キャプションを付けることができます。画像にAlt文字列が設定されていないときに、もしキャプションがあれ...

[WordPress] 遅延読込みのせいで印刷時に画像が消えていた(loading=”lazy”, decoding=”async”)
[WordPress] 遅延読込みのせいで印刷時に画像が消えていた(loading="lazy", decoding="async")
ブログを冊子印刷にして配布しているのですが、一部の画像が印刷されていないことがあります。画像の遅延読込み で失敗しているようです。WordPress によって自動的に付加される「loading=”lazy”」「decoding=”async”」を消すよう、functions.php を編集しました。add_filter( 'wp_lazy_loading_enabled', '__return_false' );add_filter('wp_img_tag_add_decod...

LINEのタイムライン投稿のアイキャッチ画像が表示されない? 【OGPとURLエンコード、サーバーキャッシュ】
LINEのタイムライン投稿のアイキャッチ画像が表示されない? 【OGPとURLエンコード、サーバーキャッシュ】
LINEのタイムラインにブログのURLを投稿したら、アイキャッチ画像が表示されないことがありました。原因を調べてみると、画像ファイル名に日本語文字が含まれているときに、うまくいかないことがわかりました。SNS共有のための「OGP情報」に、マルチバイト文字列が含まれると、LINEタイムラインではうまく表示できないようでした。【追記:2022-04-17】LINE VOOM Studioになって、リンクの挿入方法が変わりました。【関連】どんな問題があったの?ちいラボでは、教室前の...
QRコードを読み込むと、関連記事を確認できます。

WordPressの編集画面での差し替えた画像が古い状態で表示される?(画像キャッシュ)
【スポンサーリンク】
タイトルとURLをコピーしました