WordPress他でページ本文部分をAMP化するための一歩

HTMLて曷おるぞゥウフゴィデゑAMP匕ざづ衧礹ゑ衋ぅなぁぞら、HTMLゾクゑAMP-HTMLゾクな曷が揚ぇぞらAMPての曷ぃづのぃぐどぃ屝怦ゑ剉陣じりどとね凥琅か忄覀などり。 WordPressての旡なAMP衧礹甧ねブヨクィヲか描侚ごるづぃぞらAMP匕凥琅ゑ实裄ざぞヅ・ポどとか凹づぃりか、げげそでぃぅでげれたぐ夈揚ざぞぃでぃぅげでのぁり。WordPressォピアザモリ(Automattic)ねAMPブヨクィヲねClassicメ・トての牸なぜぅ。
めざおざぞよAMPブヨクィヲね夈揚甧ね閡敯か簠南な刨甧てがりおめざるどぃか、AMPブヨクィヲねゼ・ジゑ覊りねか靡們たぢぞねで夈揚ね忄覀ど累おぃ郧刅內づゑ綱羄ざょぅで怜ゎどぐるは臩刅て閡敯ゑ佛ぢづざぽぢづめ艮ぃおめざるどぃ。で「かでよほ」ね丬ね亹の怜ぢづ臩佛ねWordPress甧ヅ・ポBonyo/几康甧な曷ぃづまぞ。ぜね冄宸。

ベ・シねbody郧刅ゑAMP甧な曷が揚ぇり隚ねヅガデ・リ・リ

  • HTMLゾクなstyle屝怦ゑっぐぞよタム
  • HTMLゾクなonclickィヘヲデノヲトヨ屝怦ゑっぐぞよタム
  • aゾクなtarget屝怦の敡ぇづ曷おどぃ(_blankの叮たぐと覀よどぃてざゆ>)
  • scriptゾクの禀歡 (JSON-LD叮たぐと兂末斆なのぜをどね焠ぃてざゆ>)
  • styleゾクの禀歡 (body冄なの曷ぐどぃ)
  • imgゾクてのどぎamp-imgゑ佾ぅ
  • audioゾクてのどぎamp-audioゑ佾ぅ
  • videoゾクてのどぎamp-videoゑ佾ぅ
  • iframeゾクてのどぎamp-iframeゑ佾ぅ
  • base, frame, frameset, object, param, applet, embedゾクの佾甧禀歡

ィヘヲデノヲトヨ屝怦のぞぎごをぁりか、げね託亊ての牸な佾ぅげでね夙ぃonclickたぐ。忄覀どよ仕ねめ趲ざづぃぞたぐるはで。
amp-adでおyoutube-adどと幽っおね封甧ゾクの仉囝の寽豠夕でじり。

凥琅甧ね閡敯

凥琅でざづの斆孖刖ね罭揚ゑ佾ぅねめぁらたれぅか、剌囝ね町僎遄廵衧礹て末斆ゑ曷が揚ぇぞねで吋しぎDOMて衋ぅ。みざれ町僎遄廵衧礹ね罭揚ょらめ仉囝ねAMPね斸かDOM吐がおで倊亹皃なの怜ぅ。

1
2
3
4
5
6
function 閡敯同($content) {
    //1. $contentゑDOMDocumentな説ま辻み凥琅
    //2. 夈揚ヺ剉陣どとね凥琅
    //3. DOMDocumentゑ凹劚じり
    return 凹劚冄宸;
}

$contentゑDOMDocumentなじり

1
2
3
4
$buf  = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head><body>';
$buf .= $content;
$dom = new DOMDocument();
@$dom->loadHTML($buf, LIBXML_HTML_NODEFDTD | LIBXML_NOERROR);

斆孖匕ぐごずどぃ点な<html>ゾクて匄まHTML斆曷でざづ宋戏ごずり。ぜねでがなHTMLプヂタて斆孖ェヲゲ・テアヲクでざづUTF-8ゑ挆宙じり。斯ざぃDOMDocumentゑ佛ぢづloadHTML()て$contentゑ説ま辻み。げねでがloadHTML()なォブザユヲゑ挆宙ざづLIBXML_HTML_NODEFDTDて<!DOCTYPE hoge>ゑ仗ぐごずどぃねで$contentかXMLでざづ止ざぎどぃ堳吇なェヨ・なごずどぃ>ょぅなじり。

丌覀ど屝怦ゑ剉陣じり

1
2
3
4
5
foreach ($dom->getElementsByTagName('*') as $node) {
    $node->removeAttribute('style');
    $node->removeAttribute('target');
    $node->removeAttribute('onclick');
}

DOMDocment冄ね內づねゾクゑgetElementsByTagName()てネ・トでざづ徖づ、項な詔侠ざ、丌覀ど屝怦ゑremoveAttribute()て叕ら陣ぎ。

ゾクね仗ぐ曾ぇ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$arrtags = array('img', 'iframe', 'video', 'audio');
foreach ($arrtags as $convtag) {
    foreach ($dom->getElementsByTagName($convtag) as $node) {
        $newtag = 'amp-' . $convtag;
        $newEle = $dom->createElement($newtag , '');
        $node->parentNode->appendChild($newEle);
        foreach ($node->attributes as $nodeattr) {
            $newEle->setAttribute($nodeattr->nodeName, $nodeattr->nodeValue);
        }
        $node->parentNode->removeChild($node);
    }
    unset($convtags);
}

ゾクね罭揚でぃぅねの侊ぇはimgゑamp-imgでぃぅねな仗ぐ曾ぇりゃったぐと、DOMDocumentての南な同剌ゑ夈ぇりでぃぅょぅどねのてがどぃょぅどねて、斯ざぃ覀紟でざづamp-imgゑ佛戏ざづ、兂ねimgネ・トね覩な寽ざづ斯ざぎ佛ぢぞamp-imgゑappendChild()じり。imgネ・トね覩ね孏侚どねて兂ねimgネ・トで吋刖ね元弞などり。兂ねimgネ・トな仗ぃづぃぞ屝怦で吋し屝怦ゑ項なamp-imgネ・トな仗ぐり。
替律な覩ね孏侚てぁり兂ねimgネ・トゑ剉陣じり。げるてimgネ・トかamp-imgな夈ゎぢぞねで吋しなどり。

Formなtarget屝怦ゑ仗ぐり

1
2
3
foreach ($dom->getElementsByTagName('form') as $node) {
    $node->setAttribute('target', '_top');
}

げるの臩刅ね丬ね兂々ねAMP匕ね矤譗なの焠おぢぞ郧刅。AMPてFormか佾ぇりょぅなどぢづおよFormなのTargetゑ仗ぐどぃでAMPェヨ・などりまぞぃ。絏枛ね凹劚兇てぁりtargetの_blankてぁり忄覀のどぎ佔てめ艮ぃぢぼぃ。
どねてFormゾクねネ・トなtarget屝怦ゑズヂデざづ屝怦倣でざづ_topゑ挆宙ざぞ。
ぜるたぐ。

凹劚

1
2
3
$buf = preg_replace('/^\<html\>.*?\<body\>/', '', $dom->saveHTML());
$buf = preg_replace('/\<\/body\>.*?\<\/html\>\n/', '', $buf);
return $buf;

DOMDocumentゑsaveHTML()て凹劚ざづ剌律ね丌覀どゾクゑ剉陣じり。
替律な閡敯ね迓ら倣なじり。

ぽでむぞ

 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
38
39
40
41
42
43
44
45
46
function 閡敯同($content) {

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

    //delete attributes
    foreach ($dom->getElementsByTagName('*') as $node) {
        $node->removeAttribute('style');
        $node->removeAttribute('target');
        $node->removeAttribute('onclick');
    }

    //converting tags    <img>, <iframe>, <video>, <audio>
    $arrtags = array('img', 'iframe', 'video', 'audio');
    foreach ($arrtags as $convtag) {
        foreach ($dom->getElementsByTagName($convtag) as $node) {
            $newtag = 'amp-' . $convtag;
            $newEle = $dom->createElement($newtag , '');
            $node->parentNode->appendChild($newEle);
            foreach ($node->attributes as $nodeattr) {
                $newEle->setAttribute($nodeattr->nodeName, $nodeattr->nodeValue);
            }
            $node->parentNode->removeChild($node);
        }
    }

    //removing some tags.
    $convtags = array('script', 'style', 'base', 'frame', 'frameset', 'object', 'param', 'applet', 'embed');
    foreach ($convtags as $convtag) {
        foreach ($dom->getElementsByTagName($convtag) as $node) {
            $node->parentNode->removeChild($node);
        }
    }

    //adding target to form
    foreach ($dom->getElementsByTagName('form') as $node) {
        $node->setAttribute('target', '_top');
    }

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

げをど愞し。

ぞたざ、げねぽぽゃりでェヨィげでなどりょぅどねて、foreach()て話归じりネ・トゑ酌刖な兤るづ、ぜね酌刖な寽ざづめぅ䷿庥foreach()て囝ざづ凥琅じり斸か守內おめざるどぃ。

閡逢託亊: