Googleマップは、以下のようにiframeで地図をサイトに埋め込むことができます。
今回は、これをAMPページでもエラーを出さずに表示させる方法の紹介です。
目次
GoogleマップのiframeのAMP化
Googleマップで「地図を共有また埋め込む」メニューを選択すると
以下のようなiframe埋込タグが表示されます。
ここで取得したタグ自体はこんな感じです。
<iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3241.7144503548398!2d139.69826945132047!3d35.659406330102236!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x60188b57f03a6d3f%3A0x1d01d35eef4bf7a!2z44OP44OB5YWs5YmN5bqD5aC0!5e0!3m2!1sja!2sjp!4v1478138974491" width="600" height="450" frameborder="0" style="border:0" allowfullscreen> </iframe>
このiframeをAMPページで表示させるためには、以下のように書く必要があります。
<amp-iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3241.7144503548398!2d139.69826945132047!3d35.659406330102236!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x60188b57f03a6d3f%3A0x1d01d35eef4bf7a!2z44OP44OB5YWs5YmN5bqD5aC0!5e0!3m2!1sja!2sjp!4v1478138974491" width="600" height="450" layout="responsive" sandbox="allow-scripts allow-same-origin allow-popups" frameborder="0" allowfullscreen> </amp-iframe>
変わった点といえば以下の部分です。
- iframe→amp-iframeにタグを変更
- layout=”responsive”属性の追加(レスポンシブ化)
- sandbox=”allow-scripts allow-same-origin allow-popups”属性の追加(これがないと動作しないっぽい)
- style=”border:0″ 属性の除去
ですので、通常の「iframeのGoogleマップ埋め込みタグ」であっても、プログラム等により上記の変更処理を行いさえすれば、AMP化出来るようです。
参考 amp-iframe – AMP by Example
注意点:amp-iframeを利用するには以下のようなスクリプトをヘッダーで呼び出しておく必要があると思います。
<script async custom-element="amp-iframe" src="https://cdn.ampproject.org/v0/amp-iframe-0.1.js"></script>
PHPでGoogleマップのiframe埋め込みをAMP用に置換する
で、WordpressなどでPHPを用いて「デフォルトのGoogleマップiframeタグ」をAMP仕様に合わせて表示させるには、以下のような処理を行えばいけるかと思います。
//style属性を取り除く $the_content = preg_replace('/ +style=["][^"]*?["]/i', '', $the_content); $the_content = preg_replace('/ +style=[\'][^\']*?[\']/i', '', $the_content); // iframeをamp-iframeに置換する $pattern = '/<iframe/i'; $append = '<amp-iframe layout="responsive" sandbox="allow-scripts allow-same-origin allow-popups"'; $the_content = preg_replace($pattern, $append, $the_content); $pattern = '/<\/iframe>/i'; $append = '</amp-iframe>'; $the_content = preg_replace($pattern, $append, $the_content);
やっていることは単純で、以下のようなことをやっているだけです。
- style属性を取り除く
- iframeをlayout・sandbox属性のついたamp-iframeタグに置換する
動作
こういった処理を行うことによって、AMPページでも以下のように通常のGoogle埋め込みとほとんど同じ表示を行うことができました。
注意点
ただ、Googleマップを今回書いたような方法でAMP化したとしても、amp-iframeを利用した場合以下のようなエラーが出てマップが表示されないことがあります。
Error: task failed: amp-iframe#1#L amp-iframe#1: <amp-iframe> elements must be positioned outside the first 75% of the viewport or 600px from the top (whichever is smaller): amp-iframe#AMP_1 Current position 245. Min: 482.25Positioning rules don’t apply for iframes that use `placeholder`.See https://github.com/ampproject/amphtml/blob/master/extensions/amp-iframe/amp-iframe.md#iframe-with-placeholder for details.
このエラーの原因は、<amp-iframe> はページ上部に表示できないという特殊な仕様があるためです。厳密には、ページ最上部から600pxより下の位置、または、ビューポートの75%より下の位置(いずれかを満たせばOK)に置かなければ、バリデーション・エラーになるようです。
参考 AMPページでGoogleマップを表示する方法 – ストリートビューもOK! | Crane & to.
なので、以下のようにトップから600pxより多く離すか
ビューポート(表示エリア)の縦範囲の75%よりも下にamp-iframeを位置づける必要があるようです。
「トップから600pxより多く離す」と「ビューポートの75%より下に位置付ける」という制約は、どちらか一方を満たせばOKです。
placeholderを用いた対応
どうしても、上記条件を満たせない場合は、amp-iframeのplaceholderを用いるという手法もあります。
<amp-iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3241.7144503548398!2d139.69826945132047!3d35.659406330102236!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x60188b57f03a6d3f%3A0x1d01d35eef4bf7a!2z44OP44OB5YWs5YmN5bqD5aC0!5e0!3m2!1sja!2sjp!4v1478138974491" width="600" height="450" layout="responsive" sandbox="allow-scripts allow-same-origin allow-popups" frameborder="0" allowfullscreen> <amp-img layout="fill" src="[画像のURL]" placeholder></amp-img> </amp-iframe>
まとめ
今回、GoogleマップデフォルトのiframeをAMP化したわけですが、思いのほか簡単にできました。
何か特別なAMPの遷移スクリプトを読み込む必要はなく、「script custom-element=”amp-iframe”」スクリプトさえ読み込んでいれば、ちょっとしたiframeタグと属性の変更で比較的簡単にAMP化できます(Twitter・YouTube埋込よりは)。
というわけで「通常ページではGoogleマップが表示されているのに、AMPページでは表示されない…」なんて時には、上に書いたようなことをチェックすると改善するかもしれません。
今日暇だからお前のコメント読んだ、
どうせ誰だかもう分かっているんだろ
無駄に的確に答えてくれてご苦労様と言ったところかな、ところで疑問だけどなんでコメントに過去にコメントした記事のURL載せてんの、
無意味な労力だろ(笑)、何がしたいの?謎なんだよ。
道端にゴミをすてるような感覚でお前のブログにコメントしただけでも、お前の行動性の謎が現れるんだな。
きっとこのコメント読んだら、ムキになってコメントし返すんだろうけど無駄だから、
だってこのコメントもゴミを道端に捨てるような感覚で書き込んでるし、どうせ大したこと言わねーだろだからもう読むこともね~。暇つぶしの道具になってくれてありがとう。