検索結果上位に表示されるAMP(Accelerated Mobile Pages)に対応するMovable Typeテンプレート大公開!

CMSサイト関連 Movable Type Webサイト高速化 マーケティング

Google が主導となって、「平均7秒かかるスマートフォンサイトの表示を1秒にする」プロジェクト、AMP(Accelarated Mobile Page)が開始されました。

AMPプロジェクトに賛同したメディア系サイトなど、一部での実施のようですが、検索結果の1位よりも上に出るなど、インパクトは相当大きい変化です。

コレは早い内に対応しないと負けるしかないというほどです。
見た目もcssで調整ができ、広告配信も許されているため、メディア運用にはかなり強力な武器となりそうです。

onclickなどは使えないものの、Google AnalyticsもAMP対応され、ページ内に決められたフォーマットで定義を書けばクリックイベントなども取れるようです。
160226_google_analytics_realtime.png

かんたんにMovable Typeで対応する方法をご紹介します。時間のないあなたでも15分あれば今スグAMP対応できちゃいます!

Movable TypeでAMP対応する場合にすること

やるべきことは、主にたった2つです。

  • AMP用のテンプレートを各テンプレート分新規作成する
  • 既存ページの<head>タグ内に<link>タグを追加する

「あんまり学習に時間をかけたくない」 「今更あたらしいこと覚えるの面倒」

わかります。
そんなあなたにもかんたんに使えるテンプレートを以下にご用意しています。

以下をコピペしてテンプレートを追加してください。

AMPとHTMLの違いと注意点

AMPは、スマートフォンでも表示高速化のための仕様です。スマートフォンでの表示を損なう仕組みは、HTMLの標準タグであっても使えません。
イメージとしては、フィーチャーフォンサイトを作るのに近く、「テキストベースで表現力が貧弱なページを用意するから表示が早い」のです。

HTMLタグの中でAMPページで使えないものをご紹介します。このタグをHTML内で使ってるな、と思った方は、regex_replaceモディファイヤを使ってタグごと削除するなどの対処が必要です。 あとでご紹介するテンプレートではその正規表現も含んでいます。

タグに変換が必要なHTMLタグ

次のタグは変換して上げる必要があります。

  • img -> amp-img
  • video -> amp-video
  • audio -> amp-audio
  • iframe -> amp-iframe

使用禁止のタグ

次のタグは含めてはいけないものなので削除しましょう。

  • base
  • frame
  • frameset
  • object
  • param
  • applet
  • embed
  • form
  • input
  • textarea
  • select
  • option

AMP専用のタグ

AMPのみで利用できるタグもあります。YouTube、Facebook、Twitter、Vineなど、SNSの要素を表示することができます。が、ここでは省略します。

Google Search Consoleで検証済み!エラーの出ないAMP対応MTテンプレートサンプル

お待たせしました。AMP対応のMTテンプレートのサンプルをご紹介します。
(※2016/2/27 テンプレートの内容を更新しました)

基本設定用テンプレートモジュール

CMSを構築する場合、必ず作る「__config」という設定用のテンプレートモジュールです。
この中に、amp用の設定を登録します。

<mt:SetVars>
site_url=<mt:Websites><mt:WebSiteURL /></mt:WebSites>
site_title=株式会社cherry-pick
amp_publisher_name=株式会社cherry-pick
amp_logo_url=http://www.cherry-pick.jp/assets/images/common/img_logo.png
amp_logo_w=211
amp_logo_h=43
amp_image_alt_url=http://www.cherry-pick.jp/assets/images/top/index_visual_rinen.png
amp_image_alt_w=1200
amp_image_alt_h=490
</mt:SetVars>

この内容を、各テンプレートの冒頭で読んで利用します。AMP用のテンプレートでもこのテンプレートモジュールをインクルードして使います。

AMP用ベーステンプレートモジュール

テンプレートモジュールとして、以下を登録します。

<!doctype html>
<html ⚡ lang="ja">
<head>
<meta charset="utf-8">
<title><mt:Var name="title" /></title>
<link rel="canonical" href="<mt:Var name="canonical" />" />
<meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1">
<style amp-custom>
  body {-family:"ヒラギノ角ゴ ProN W3", "Hiragino Kaku Gothic ProN", "メイリオ", Meiryo, "MS Pゴシック", "MS PGothic", "MS ゴシック", "MS Gothic", sans-serif; margin:0; padding:0 10px;}
  .clearfix:after {content:""; width:0; height:0; display:block; clear:both; overflow:hidden;}
  a {text-decoration:none;}
  p {-break:break-all; margin:0;}
  article {margin:0 auto 24px;}
  #amp-header {height:70px; margin:0 -10px 15px; background-color:#0c1e3c; text-align:center;}
  #amp-header amp-img {margin-top:17px;}
  .amp-title {font-size:22px; color:#0e2544; border-bottom:3px solid #34446e; padding:0 0 6px 8px; margin-bottom:12px;}
  .amp-body amp-img {}
  .amp-body .section p {margin:0 0 24px; padding-bottom:24px; line-height:1.7; color:#444;}
  .amp-body h2 {color:#34446e; font-size:22px; border-left:solid 5px #34446e; padding:0 0 0 23px; margin-bottom:24px; font-weight:normal;}
  .amp-body h3 {color:#34446e; border-bottom:1px solid #ccc; font-size:20px; padding:0 0 10px 10px; margin-bottom:24px; font-weight:normal;}
  .amp-date {text-align:right; padding-bottom:10px;}
  .amp-body .entry-txt-wrap {padding-bottom:0; margin-bottom:20px; float:none; text-align:right;}
  .amp-body .entry-cat {padding-bottom:0;}
  .entry-cat-item {display:inline-block; border-radius:3px; color:#333; padding:3px 6px; background:#ddd;}

.contactus {
  width: auto;
  padding: 0 10px;
    margin: 0 auto 20px;
    text-align: left;
  }
.amp-footer .contactus a {
background: #0e2544 url(/assets/images/icon/icon_contactus02.png) no-repeat 30px 5px;
    background-size: 50px;
    border-radius: 5px;
    border: 1px #fff solid;
    text-decoration: none;
    display: block;
    color: #0e2544;
    padding: 10px 0;
}
.contactus-ttl {
      color: #fff;
padding: 0px 0 27px 115px;
    font-size: 20px;
    margin: 0;
    display: block;
}
.contactus p {
  color: #fff;
    display: inline-block;
    font-family: 'Noto Sans Japanese', sans-serif;
    vertical-align: middle;
     padding: 0 10px;
    width: auto;
    line-height: 1.4;
        font-size: 13px;
}

#recent-entries {
  border: 1px solid #0C1E3C;
  padding: 10px;
  margin-bottom: 25px;
}
.recent-entries-ttl {
  font-size: 18px;
  margin: 0;
  }
.entry-list,
.list-item {
  list-style: none;
  padding: 0;
  }
.entry-list {
  margin-bottom: 15px;
  }
.list-item {
  border-bottom: 1px dotted #ccc;
      margin-bottom: 10px;
    padding-bottom: 10px;
  }
.read-more {
  text-align: right;
}

  .amp-footer {background-color:#0c1e3c; color:#fff; text-align:center; padding:30px 0 20px; margin:0 -10px; font-size:14px;}
  .amp-footer a {color:#fff;}
  </style>
<script type="application/ld+json">
  {
    "@context": "http://schema.org",
    "@type": "<mt:Var name="amp_at_type" />",
    "mainEntityOfPage": {
      "@type": "WebPage",
      "@id": "<mt:Var name="canonical" />"
    },
    "headline": "<mt:Var name="amp_headline" />",
    "image": {
    "@type": "ImageObject",<mt:If name="amp_image_url">
      "url": "<mt:Var name="amp_image_url" />",
      "height": <mt:Var name="amp_image_h" />,
      "width": <mt:Var name="amp_image_w" />
    <mt:Else>
      "url": "<mt:Var name="amp_image_alt_url" />",
      "width": <mt:Var name="amp_image_alt_w" />,
      "height": <mt:Var name="amp_image_alt_h" />
    </mt:If>
    },
    "datePublished": "<mt:Var name="amp_datePublished" />",
    "dateModified": "<mt:Var name="amp_datePublished" />",
    "author": {
      "@type": "Person",
      "name": "<mt:Var name="amp_author" />"
    },
    "publisher": {
      "@type": "Organization",
      "name": "<mt:Var name="amp_publisher_name" encode_js="1" />",
      "logo": {
        "@type": "ImageObject",
        "url": "<mt:Var name="amp_logo_url" />",
        "width": <mt:Var name="amp_logo_w" />,
        "height": <mt:Var name="amp_logo_h" />
      }
    }
  }
  </script>
  <style amp-boilerplate>body{-webkit-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-moz-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-ms-animation:-amp-start 8s steps(1,end) 0s 1 normal both;animation:-amp-start 8s steps(1,end) 0s 1 normal both}@-webkit-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-moz-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-ms-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-o-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}</style><noscript><style amp-boilerplate>body{-webkit-animation:none;-moz-animation:none;-ms-animation:none;animation:none}</style></noscript>
  <script async custom-element="amp-analytics" src="https://cdn.ampproject.org/v0/amp-analytics-0.1.js"></script>  
  <script async src="https://cdn.ampproject.org/v0.js"></script>
</head>
<body>
<amp-analytics type="googleanalytics" id="analytics1">
<script type="application/json">
{
  "vars": {
    "account": "UA-XXXXXXX-X"
  },
  "triggers": {
    "trackPageview": {
      "on": "visible",
      "request": "pageview"
    }
  }
}
</script>
</amp-analytics>
<header id="amp-header">
  <amp-img src="/assets/images/common/img_logo.png" width="206" height="41" alt="株式会社cherry-pick" />
</header>
<h1 class="amp-title"><mt:Var name="h1" /></h1>
<aside class="amp-date"><mt:Var name="amp_date" /></aside>
<article class="amp-body">
<mt:Var name="body" regex_replace='/style=".+?"/gi','' regex_replace="/https?:\/\/www\.cherry\-pick\.jp\//g","/" regex_replace='/<video/g','<amp-video' regex_replace='/<audio/g','<amp-audio' regex_replace='/<iframe/g','<amp-iframe' regex_replace='/<base.*?>(.+?<\/base>)?/g','' regex_replace='/<script+?<\/script>/g','' regex_replace='/(<a\s*.*?)onclick=".+?"(.+?<\/a>)/gi','$1$2' setvar="html_replaced" />
<mt:Var name="html_replaced" regex_replace="/img\s/gi","amp-img layout='responsive' " />
</article>
<div id="recent-entries">
  <h3 class="recent-entries-ttl">最新記事一覧</h3>
  <ul class="entry-list">
    <mt:Entries lastn="3"><li class="list-item"><a href="<mt:EntryPermalink />"><mt:EntryTitle /></a></li></mt:Entries>
  </ul>
  <p class="read-more"><a href="http://www.cherry-pick.jp/blog/">もっとみる ></a></p>
</div>
<footer class="amp-footer">
<div class="contactus">
  <a href="https://www.cherry-pick.jp/contact/form.cgi">
    <h4 class="contactus-ttl">お問い合わせ</h4>
    <p class="contactus-txt">cherry-pickのサービス・製品に関するお問い合せはこちらから。</p>
    <p class="contactus-txt">まずはご相談下さい。</p>
  </a>
</div>
<a href="http://www.cherry-pick.jp/company/about.php">cherry-pickとは</a> | 
<a href="http://www.cherry-pick.jp/">サイトTOP</a><br /><br />
<a href="<mt:Var name="site_url" />">©<mt:Var name="site_title" /></a>
</footer>
</body>
</html>


記事詳細用AMPテンプレート

記事詳細のAMPテンプレートで、出力したい内容に合わせて部分を調整します。

<mt:Include module="__config" parent="1" />
<mt:SetVarBlock name="title"><mt:EntryTitle encode_html="1" />|<mt:BlogName />|<mt:Var name="site_title" /></mt:SetVarBlock>
<mt:SetVarBlock name="canonical"><mt:EntryPermalink regex_replace="https?:\/\/[^\/]+?\//","/" /></mt:SetVarBlock>
<mt:SetVar name="amp_at_type" value="NewsArticle" />
<mt:SetVarBlock name="h1"><mt:EntryTitle /></mt:SetVarBlock>
<mt:SetVarBlock name="body">
              <section class="section clearfix">
                <mt:EntryBody />
              </section>
              <div class="entry-txt-wrap">
                <p class="entry-cat">
                <mt:EntryCategories>
                  <a class="entry-cat-item" href="/blog/<mt:If tag="HasNoParentCategories"><mt:CategoryBasename />/<mt:Else><mt:ParentCategory><mt:CategoryBasename />/</mt:ParentCategory><mt:CategoryBasename />/</mt:If>"><mt:CategoryLabel /></a>
                </mt:EntryCategories>
                </p>
              </div>
            <!-- /.article -->
</mt:SetVarBlock>
<mt:EntryAssets type="image" lastn="1">
<mt:SetVarBlock name="amp_image"><mt:AssetURL /></mt:SetVarBlock>
<mt:SetVarBlock name="amp_image_w"><mt:AssetProperty property="image_width" /></mt:SetVarBlock>
<mt:SetVarBlock name="amp_image_h"><mt:AssetProperty property="image_width" /></mt:SetVarBlock>
</mt:EntryAssets>
<mt:SetVarBlock name="amp_datePublished"><mt:EntryDate format_name="iso8601" /></mt:SetVarBlock>
<mt:SetVarBlock name="amp_date"><mt:EntryDate format="%Y/%m/%d" /></mt:SetVarBlock>
<mt:SetVarBlock name="amp_dateModified"><mt:EntryModifiedDate format_name="iso8601" /></mt:SetVarBlock>
<mt:SetVarBlock name="amp_author"><mt:EntryAuthorDisplayName /></mt:SetVarBlock>
<mt:Var name="title" setvar="amp_headline" />
<mt:Include module="tmpl_amp" parent="1" />

実際に作成されるページは以下のようになります。
http://www.cherry-pick.jp/blog/movable-type/amp.amp.php

注意点

  • imgタグにwidthとheightは必須。srcはプロトコルを含めてはイケない。相対パスで指定する。style属性は使えない
  • aタグにonclickは入れられない
  • <script>タグは使えないのでSNSボタン、広告用タグなども配置不可

AMPソースコードのデバッグ

Google Chromeの開発ツールを開き、URLに#development=1をつけてページを開く

development=1をつけてアクセスすると、AMP対応としてエラーがないか検証できます。エラーがあったら、修正しましょう。

Google Search Consoleでエラーが出る場合は、以下のページを参照して(required)と記載のあるものが空になっていないか確認します。 https://developers.google.com/structured-data/rich-snippets/articles?hl=ja

Google Analyticsでイベントを計測したい

「AMP対応してスマホページのPV減ったら広告出稿減っちゃうじゃん!」
「ユーザーがどんなアクションしたのかわからなかったら意味無いじゃん!」

ということで、AMPページもPV計測、クリックイベント計測、などが実施できます。

cherry-pickサイトで実施しているかんたんな例をご紹介します。
(※ご参考いただくのはもちろん構いませんが、一切の責任は負いませんのであらかじめご了承いただいた上でご活用ください)

まとめ

「対応したほうがいいのかなー」なんて悠長なこと言ってる間に、ライバルが対応しちゃいます。 流入持ってかれちゃうと、広告出すしかなくなって、なかなか勝てなくなりますよ。

AMP対応に関するお問い合わせがとても増えています。ご検討の方は今スグcherry-pickにお問い合わせください!

商品・サービスへのお問い合わせ

ご相談、お見積もりのご依頼など

お問い合せはこちら