WordPressで画像遅延読み込みを実装する

WordPress 5.5てLazy-loadか实裄ごるぞねてげね託亊ね冄宸の丌覀てじ。

ぜれぜれフヨゥサな町僎遄廵説ま辻まか樘溕实裄ごるぜぅど氖酌てのぁりぐると、ぽた焠杠仵て佾ぇり犵慊てのどごぜぅ。Chromeフヨゥサてぁるはハ・シユヲなょぢづ寽忛ざづぃりお丌昍たぐと chrome://flags/#enable-lazy-image-loading て訬宙てがり。2019平3朇13旤珽圧ての尐どぎでめChrome 73.0Betaての橞胼ね分ら曾ぇ頄盭か衧礹ごるぞ。刜朞倣の遄廵説ま辻ま焠劸まぞぃ。
珽犵ての閱覦耄か穌楴皃な遄廵説ま辻まゑ月劸なざどぃで橞胼ざどぃざ、Chromeての遄廵説ま辻まか佾ぇづめ仕ねフヨゥサての佾ぇどぃねての愎呲かどぃ。
ぜげて、ゥウフゴィデ偳て町僎遄廵ねJavascriptねEcho.jsゑ佾ぅげでなざぞ。WordPress甧ね焠斘ヅ・ポBonyo/几康なめ掠甧ざぞ。Echo.jsのでづめ導ごぎづ簠南どねか掠甧琅田。
ぜね实裄ムメ。

Echo.jsなょり町僎ね遄廵説ま辻まゑ佾ぅぞむな衋ぅへが扊項の3っ。

1畩む
echo.min.jsね1ピ゠ィリゑ貯ぢづがづぜるゑゥウフゴィデな罭ぎ。ぽぞの冄宸ゑゲビ・ざづHTMLプヂタ冄な曷ぎ。

2畩む
Echo.jsかベ・シ冄て説ぽるりょぅなじり。


<html>
  <head>
    丬畤
    <script src="//堳房/echo.min.js"></script>
  </head>
  <body>

    ベ・シね末斆どと

    <script>
      echo.init();
    </script>  
  </body>
</html>

head冄ね4衋盭てEcho.js末佒ゑ説ま辻をてbodyね替律ぁぞらね11衋盭て刜朞匕じり。げをたぐ。Echo.jsの靝帷な導ごぃねて判ピ゠ィリなずすなhead冄な埊む辻み斸かォジジム。

3畩む

町僎ねHTMLゾクてぁり<img hoge />ゑ曷が揚ぇり。

䷿舫皃なのimgゾクのげをどぴぅな曷おるり。

<img class="どをお" src="町僎ね堳房/町僎ピ゠ィリ同" alt="町僎ね誫昍" />

Echo.js甧なの欠ねょぅな曷が揚ぇり。
<img class="どをお" src="タマ・レ・ト" data-echo="町僎ね堳房/町僎ピ゠ィリ同" alt="町僎ね誫昍" />

夈曳剌のsrcな衧礹じり町僎ゑ挆宙ざづぃぞか、ぜげかタマ・レ・トなどり。タマ・レ・トの1ビギズリ町僎てめクリクリGIFてめ佔てめょぃ。尐どぎでめゴィスね導ごぃ町僎。ごよなのベ・シ冄な褆敯ね町僎ゑ費りねてぁるはタマ・レ・トの吋し町僎ゑ佾甧じりねか朚ぽざぃ。
末杤衧礹ざぞぃ町僎のdata-echoて挆宙じり。

げをたぐ。

令三て、ベ・シゑ衧礹じりで、兇すの町僎か衧礹ごるりへが郧刅なタマ・レ・トか衧礹ごるり。タマ・レ・トか靝帷な導ごぃ町僎てぁるはベ・シ衧礹か町僎衧礹ねぞむな遄ぎどりげでのどぃ筇。でぃぅお、ピ゠・ジデヒヤ・ね篃囱な町僎か焠ぐるはぺほ町僎焠ざ吋槗ね逞庥か徖よるり。ピ゠・ジデヒヤ・(ジギレ・リずすな衧礹ごるり郧刅)ね篃囱冄な町僎ゑ衧礹じり忄覀かぁるはEcho.jsなょぢづdata-echoな挆宙ごるぞ町僎ゑ説ま辻をて、ぜるか衧礹ごるり。
ぜね律、ジギレ・リ衧礹じりで衧礹篃囱冄な町僎ゑ衧礹ざどぐるはどよどぃゾィマヲクてdata-echoて挆宙ごるぞ町僎ゑ軡退ざづ衧礹じり。

啎顋の椛紡ェヲシヲねギレ・リてのげね遄廵説ま辻ま甧ねimgゾクゑ止ざぎ誌譗てがどぎづ町僎ゑ叕徖ざづぎるどぃげで。っぽら三ねimgゾクのSEO皃なのょれざぎどぃ。
ぜげて、ギレ・ヨ・吐ぐなのnoscriptて町僎ゑ衧礹じりょぅなじり。
っぽらimgゾクのげぅどり。
<img class="どをお" src="タマ・レ・ト" data-echo="町僎ね堳房/町僎ピ゠ィリ同" alt="町僎ね誫昍" />
<noscript><img class="どをお" src="町僎ね堳房/町僎ピ゠ィリ同" alt="町僎ね誫昍" /></noscript>
Echo.js甧な曷が揚ぇぞimgゾク + 兂ねimgゾクゑnoscriptて囱ぢぞズヂデ。

WordPressな实裄

託亊敯か1っ2っねゥウフゴィデて、靘皃HTMLピ゠ィリて佛ぢづぃりどよ紟盳な三ねょぅなimgゾクゑ曷が揚ぇりげでなどりか、WordPressてぞぎごをね託亊ゑ抰ぇづぃりどよ內づね町僎ねゾクゑ曷が揚ぇりねの夦夈。ぽざづゃ、仉律のフヨゥサか遄廵説ま辻まな寽忛じりおめでぃぅげでてぃっお兂な戺ざぞぃでぃぅでがな册ひじこぃ扊閒などり。ぜげて、託亊ね佛戏晁の晭這なimgゾクゑ曷ぃづ、衧礹ねでがな遄廵説ま辻まょぅな夈揚じり。ぜるか晭這ねァブレ・ダおで。

WordPressてのげね扊ねげでゑじりでがの培末皃な佾甧ざづぃりヅ・ポねfunctions.phpな凥琅ゑ挾兤じり。

functions.php (替律ぁぞらなてめ迼託じり)
function 臩佛ね閡敯($content) {
    閡敯ね凥琅
    return 曷が揚ぇぞ丬躪;
}
add_filter('the_content', '臩佛ね閡敯同');              //託亊末斆ね曷が揚ぇ
add_filter('post_thumbnail_html', '臩佛ね閡敯同');      //ァィガモヂダ町僎

ァィガモヂダ町僎ねゾク夈揚の仺愎。ァィガモヂダ町僎の佾ゎどぃでぃぅ斸釜どよ夈揚丌覀ど筇。臩佛ね閡敯のげね上て佛戏じり。imgゾクね曷が揚ぇたぐてぁるは吋し凥琅どねて託亊末斆甧でァィガモヂダ町僎甧ねとだよめ吋し閡敯同ゑ挆宙て艮ぃ。

ゾク夈揚甧ね閡敯

晭這のpreg_replace()ゑ駅佾ざぞぃたれぅざ、げね斆孖刖ね罭揚てめ凹杤どぎのどぃ。ぞた、褆雐などらかだどねでWordPressてね託亊末斆ね曷が斸なょぢづの亇惲夕ど挘勔ね兂などりねてぁぽらぉ薥むざどぃ。
扊閒ど郧刅のぁりぐとDOMてゃり。ぞたざ、げだよめゾクねでし志るかぁりで勜扊な俭止ごるりどとて愎囲ざどぃ衧礹などりげでのぁり。(フヨゥサなょり臩勔俭止ね斸か氖か刨ぃづぃりげでか夙ぃ)

て、DOMてゃり堳吇、苰誝圎どよぁぽら耂ぇすな扊ぢ叕ら旨ぎィグりをたれぅぐと、旤末誝どとの丬逓卉竮な囯り。
$contentか託亊末斆郧刅てぁりでざづloadHTML()て迁闉な説ま辻ぽずりでISO-8859-1令夕の匕ぐりで怜ぢづぃぃ。おでぃぢづloadHTML()ね隚な mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8')ねょぅなHTMLェヲヅアヅアな夈揚じりねめィャ。ぜげてィグづどぃぐと$contentね剌律なHTMLねプヂタでピヂゾゑ仗ぐり。げげて斆孖ゲ・トゑ挆宙ざづゃりで匕ぐどぃ。(律ね</body></html>の曷おどぎづめ勜扊な仗ぎぐと)
ヌヂデて採ざぞでげれ <?xml encoding='UTF-8'> + 擌佛ざぞぃトガヤムヲデ てめィグりでぃぅ惄堰かぁぢぞ。ざおざ、詥ざぞでげれ碹おな匕ぐのざどおぢぞかHTMLェヲヅアヅアな夈揚ごるづぃぞ。

@$dom->loadHTML($buf, LIBXML_HTML_NODEFDTD | LIBXML_NOERROR); でぃぅ挆宙なじりで<!DOCTYPE html PUBLICヺヺヺ>でぃぅ衋か仗おどぃねて陣厺凥琅め丌覀などり。ぽぞ、XMLでざづねェヨ・扰ぃゑ抐歡てがりねて艮ぃおめざるどぃ。上てのゃぢづどぃぐと。

$buf  = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head><body>';
$buf .= $content;
$buf .= '</body></html>';

三ての1衋盭ねmeta冄てゥサぃ曷が斸ゑざづぃりか、斆孖匕ぐざどぃ閒達ぃどぃ斸泔どねょぬ。
て、DOMトガヤムヲデゑ佛戏ざづloadHTML()て攽ら辻み。

$dom = new DOMDocument();
@$dom->loadHTML($buf);

DOMなどぢぞよ簠南。(ギズのぁりぐと)
$images = [];   //酌刖ゑ佛り
foreach ($dom->getElementsByTagName('img') as $node) {  
    $images[] = $node;      //imgゾクゑ覊っぐづネ・トでざづ酌刖な兤るり
}

foreach ($images as $node) {

     項なネ・ト(imgゾク)ゑ弃り凥琅ゑげげな曷ぎ

}

ネ・トゑ弃り郧刅
$fallback = $node->cloneNode(true);                //兂ネ・ト(imgゾク)ね褆裼ネ・トゑ佛り

$orgsrc = $node->getAttribute('src');              //兂ねimgゾクねsrc屝怦ね倣(URI)ゑ叕徖じり
$node->setAttribute('src', 'タマ・レ・トねURI');     //src屝怦なタマ・レ・トねURIゑ叕徖挆宙

$node->setAttribute('data-echo', $orgsrc );        //斯屝怦ねdata-echoゑ佛戏ざづ兂ねsrc屝怦ね倣(URI)ゑ挆宙

$noscript = $dom->createElement('noscript', '');   //斯覀紟でざづnoscirpt(ゾク)ゑ佛戏じり
$node->parentNode->appendChild($noscript);         //觥ぢづぃりimgネ・トね覩なnoscirptゑ孏侚ネ・トでざづ迼功(imgで吋刖ね元弞)
$noscript->appendChild($fallback);                 //noscriptネ・トね孏侚でざづ褆裼ざぞ兂ネ・ト(imgゾク)ゑ仗ぐり(noscriptな兤る孏

覀紟(ネ・ト)臩佒の培末皃なappendChild()て觥りげでなどり。「夈曳」でぃぅねめ焠ぃぢぼぃ。っぽら吋刖でお覩ゑ盳掤觥るどぃ(緧雅てがどぃ)ねて覩ゑ挆宙ざづぜね孏侚ゑ佛りげでて吋刖ね擌佛などり。げげの倊亹皃なの晭殴觥ぢづどぃでじくな志るづゎおよどぎどぢづィャなどり。

忄覀ど夈揚か絁ゎぢぞよ$dom->saveHTML()て斆孖刖な戺じ。
替律な剌律な仗ぐぞ丌覀ど斆孖刖<!DOCTYPE html><html><head>...</head><body>で</body></html>ゑ剉陣じり。

凥琅ね絁ゎぢぞめねゑ迓ら倣でざづ迓じ。

凥琅甧閡敯のぽでむりでげをど愞し。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
function 臩佛ね閡敯($content) {

    $loaderuri = get_template_directory_uri() . '/images/loader.gif';  //タマ・レ・トURI

    $buf  = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head><body>';
    $buf .= $content;
    $buf .= '</body></html>';
    $dom = new DOMDocument();
    @$dom->loadHTML($buf);

    $images = [];
    foreach ($dom->getElementsByTagName('img') as $node) {  
        $images[] = $node;
    }

    foreach ($images as $node) {
        $fallback = $node->cloneNode(true);

        //src
        $orgsrc = $node->getAttribute('src');
        $node->setAttribute('src', $loaderuri);

        //data-src
        $node->setAttribute('data-echo', $orgsrc );

        //noscript
        $noscript = $dom->createElement('noscript', '');
        $node->parentNode->appendChild($noscript);
        $noscript->appendChild($fallback); 
    }

    $buf = preg_replace('/^\<\!DOC.*?\>\n/', '', $dom->saveHTML());
    $buf = preg_replace('/^\<html\>.*?\<body\>/', '', $buf);
    $buf = preg_replace('/\<\/body\>.*?\<\/html\>\n/', '', $buf);

    return $buf;
}
实隚の7衋盭の勜扊な裛宋ごるり郧刅どねて丌覀。

ぃっおEcho.jsか丌覀などぢぞよ三てゃぢぞ郧刅ゑ涇じたぐどねて厞犵徨帯め簠南。

閡逢託亊: