WordPressが画像にloading=”lazy”を付与するメカニズム

WordPressが画像にloading=”lazy”を付与する条件は、「ファーストビュー以外の画像」でも「メインコンテンツの1枚目の画像」でもありません。ローディング属性の管理に役立つメカニズムを解説します。

WordPressは1枚目の画像にlazyを付与すると言われるが

GoogleのPageSpeed InsightsではLargest Contentful Paint(LCP)という読み込み速度に関わる指標を測定できます。LCPは、Webサイトの表示や速度を計測するCore Web Vitalsの一つです。

GoogleがCore Web VitalsをSEOランキング指標に組み込んだため、Webサイト運営者の注目を集める中、WordPressも対策を立てました。

それが、LCPを悪化させる恐れのある画像にはloading=”lazy”を付与して、より優先して読み込みを完了し表示させたい画像には付与しない、というメカニズムの開発です。

このメカニズムは一般的に「ファーストビュー以外の画像にローディング属性を付与する」でも「メインコンテンツの1枚目の画像には付与しない」と理解されることが多いですが、もっと複雑な処理が行われていることがわかりました。

2枚目にも3枚目にもローディング属性が付与されない?

WordPressのローディング属性付与のメカニズムを検証するため、WordPress 6.8.1、ブロックテーマ環境の投稿に画像をブロックを挿入し複製して4枚まで増やしました。

期待した挙動は1枚目以外にloading=”lazy”が付与されることです。しかし、すべての画像に付与されません。

ローディング属性付与のメカニズム

\wp-includes\media.phpで定義されたwp_get_loading_optimization_attributes関数を読み、試行錯誤した結果次のことがわかりました。

  • imgとiframeが付与対象
  • ファーストビューに表示される画像は付与対象外
  • 3枚目以降に付与されやすい(wp_increase_content_media_count関数で管理)
  • 独自のHTMLで<img>を出力すると対象外
  • wp_lazy_loading_enabledが無効化すると対象外

「メインコンテンツに配置された画像をカウントしている」で気付き、複製した画像ブロックを削除し、異なる画像を4枚並べたところloading=”lazy”の付与に成功しました!

ローディング属性の付与の条件には次のものがあったのです。

  • 同一の画像は1枚と数えるため、異なる画像が3枚以上ある

同一画像を並べているとloading=”lazy”はつきませんが、fetchpriority=”high”は全画像に追加されました。奥が深いですね。
リリース:WordPress 6.3 での画像パフォーマンスの強化

ローディング属性の検証のすすめ

ローディング属性の挙動を確かめたい場合は、次の条件で試してみてください。

ローディング属性は、ファーストビューに表示されず、異なる画像が3枚以上ある場合、3枚目以降に付与されやすい。

最初に勘違いをして、コアアップデートのタイミングでloading=”lazy”が非推奨になり、fetchpriority=”high”が推奨になったのかと考えたのですが、深堀りしてみることで思わぬことを発見するものです。