W3 Total CacheのLazy Loadingでエラーが起きる場合の対処方法

W3 Total CacheのLazy Loadingでエラーが起きる場合の対処方法
W3 Total CacheのLazy Loadingでエラーが起きる場合の対処方法

 

 
読了目安:212

Are you want to translate this page to English? Please click this link to translate via ‘©Google Translate'!

ganohr.net favicon

みなさんこんにちは、ガノー(Twitter:Ganohr)です。

 

以前ホットリンク対策として、悪質なサイトからホットリンクされた画像に404や403を返却してしまうと、実際に自サイトへ訪問された際にその画像に対するステータスコードがキャッシュされてしまうことで、自サイト内での画像が表示できない不具合とその対処コードを共有しました。

サムネイル画像のホットリンク対策決定版!直リンクは404,承認済みサイトは通常通り表示!不審なサイトは画像差し替え!自サイトでの正常表示も実現!ホットリンクとはよく直リンクと表現され他サーバのコンテンツを抜き取り配信する卑劣行為.承認済みサイトは通常通り表示/不審サイトは画像差し替え/且つ自サイト&有用なボットで正常表示を実現 ... 続きを読むganohr.net2023-01-17

 

これと似た現象で『W3 Total Cache』を有効化したサイトで、Lazy Loadingオプションを利用している際に、誤ったステータスコードがキャッシュされている画像の読み込みが失敗してしまう現象を発見しました。

今回は先述の内容を流用し、対処するコードを共有します。

サムネイルW3 Total CacheSearch Engine (SEO) & Performance Optimization (WPO) via caching. Integrated caching: CDN, Page, Minify, Object, Fragment, Database support. ... 外部サイトへアクセスwordpress.org

W3 Total CacheのLazy Loadingを対処するコード

虫眼鏡を除きこむスーツ姿の女性
W3 Total CacheのLazy Loadingは画像の読み込みに失敗した場合クラス名に「error」を付与するので、これを参照することで簡単に対処できます。
setInterval(
    () => {
        const lazyErrors = document.querySelectorAll("img.lazy.error");
        if (lazyErrors.length === 0) {
            return;
        }
        lazyErrors.forEach(
            e => {
                e.src += "?cachecontroll=1";
                e.classList.remove("error");
                e.classList.add("loaded");
            }
        )
    }, 1000
);

今回のコードでは、1秒おきに『W3 Total Cache』のLazy Loadingがimgタグへ付与するクラス名lazy.errorがある要素を全てピックアップし、そのsrc属性に?cachecontroll=1というオプションパラメータを付与することで、誤ったキャッシュを迂回して画像をリロードさせます。

 

また、そのリロードの結果にかかわらず、クラス名からerrorを除去し、Lazy Loading成功を示すクラス名loadedを付与することで、何度も同じ画像のリロードを試さないよう配慮しています。

このコードであれば、必要十分なリソースでLazy Loadingにてエラーの起こったリソースを対処できます。

最後に

オシャレな部屋で読書をしている眼鏡の女性
今後独自実装のLazy Loadingの必要性は下がると思いますが、もしもの際にでも参考になれば嬉しいです

現在多くのブラウザがimgタグ自体にloading='lazy'属性によるLazy Loadingに対応し、decoding='async'によるブロッキング解消機能を有しています。

今後はW3 Total Cacheの独自実装のLazy Loadingを採用するパターンは少なくなってくると思いますが、いざという時にこの記事が役に立てば幸いです。

参考になったら、SNSへシェアしたり、ブックマークしてくだされば励みになります。

 

以上、ガノー(Twitter:Ganohr)でした!

WordPressの不具合対応/カスタマイズ¥15,000~

PC歴25年超、SE歴10年超、WordPress運営歴7年超、WordPressエンジニア歴5年超のスキルとノウハウを提供します

当サイト管理人の「ガノー」(Ganohr)は、日本最大手且つ東証一部上場企業が運営するクラウドソーシングサイト『Lancers』にて、認定ランサーとして活動しています。


※ 認定ランサーとはLancersにより様々な能力 ( 高い仕事遂行率・高い顧客満足度・多くの実績、など ) を評価したプロフェッショナルを認定する制度です。

 

WordPressカテゴリの最新記事