WordPressのAMPプラグインを使う 2019年1月 後編

この記事の前編

AMPのJSライブラリ

AMPプラグインではどのモードでも最低限の https://cdn.ampproject.org/v0.js は自動的に読み込まれるようになっている。他にPairedモードでは https://cdn.ampproject.org/v0/amp-form-0.1.js も読み込まれるよう。(使用している非AMPテーマにフォームが含まれてる場合には自動的に含まれるのかな?)
ClassicモードではAMPライブラリを必要に応じて追加する。AMPの場合はライブラリはAMPのヘッダで読み込んで、それを使用するタグ(+設定などのJSON)をbody内に書くというのがお約束のよう。なのでAMPのライブラリはテンプレートのhtml-start.phpに書くことになるかと。

追加例
1
2
3
4
5
<script async custom-element="amp-analytics" src="https://cdn.ampproject.org/v0/amp-analytics-0.1.js"></script>
<script async custom-element="amp-ad" src="https://cdn.ampproject.org/v0/amp-ad-0.1.js"></script>
<script async custom-element="amp-auto-ads" src="https://cdn.ampproject.org/v0/amp-auto-ads-0.1.js"></script>
<script async custom-element="amp-list" src="https://cdn.ampproject.org/v0/amp-list-0.1.js"></script>
<script async custom-template="amp-mustache" src="https://cdn.ampproject.org/v0/amp-mustache-0.2.js"></script>

次に<body></body>内のどこかにタグや設定用のJSONを書く。

AdSense用タグ (広告ユニット用コード)

利用条件: ヘッダでamp-ad-0.1.jsを読むこと
1
2
3
4
5
6
7
8
<amp-ad width="100vw" height=320
  type="adsense"
  data-ad-client="ca-pub-1234567891234567"
  data-ad-slot="1234567890"
  data-auto-format="rspv"
  data-full-width>
    <div overflow></div>
</amp-ad>

広告を貼りたい場所に挿入する。data-ad-clientとdata-ad-slotの値は自分に与えられている値に書き換える。 上の例はGoogleの推奨コードだが必要に応じて変更する。

AdSense用タグ (自動広告用コード)

利用条件: ヘッダでamp-auto-ads-0.1.jsを読むこと
<amp-auto-ads type="adsense" data-ad-client="ca-pub-0000000000000000"></amp-auto-ads>

<body>直下あたりに置けば良い。data-ad-clientは自分に与えられている値に書き換える。

以下2件はアクセス解析用のトラッキングコード。
よく、AMPにしたらPVが減ったなどと言う人がいるが、これはAMPページ(AMPキャッシュ)をGoogleだのの(自分のサーバではない)他所のサーバから閲覧されたときにそのアクセスを知ることができないままにしているから。AMPプラグインには一応analytics用の機能が付いているのでそれを利用するか自分でAMP用テンプレートにハードコーティングするか。一応、よく使われるGoogle Analytics用と、(マイナーな)自前サーバでのアクセス解析としてmatomo用の例を挙げる。

Google Analytics

利用条件: ヘッダでamp-analytics-0.1.jsを読むこと
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<amp-analytics type="googleanalytics" id="analytics1">
<script type="application/json">
{
  "vars": {
    "account": "UA-00000000-0"        ←自分用のUA番号に書き換える
  },
  "triggers": {
    "trackPageview": {
      "on": "visible",
      "request": "pageview"
    }
  }
}
</script>
</amp-analytics>

アクセス解析Matomo (旧Piwik)

利用条件: ヘッダでamp-analytics-0.1.jsを読むこと
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<amp-analytics>
<script type="application/json">
{
    "triggers": {
        "trackPageview": {
            "on": "visible",
            "request": "pageview"
        }
    },
    "requests": {
        "base": "https://matomo.example.com/matomo.php?idsite=1&rec=1&action_name=${title}&url=${sourceUrl}&rand=${random}&apiv=1&urlref=${documentReferrer}&res=${screenWidth}x${screenHeight}&lang=${browserLanguage}&gt_ms=${serverResponseTime}&cs=${documentCharset}&_cvar={\"1\":[\"errorName\",\"${errorName}\"],\"2\":[\"errorMessage\",\"${errorMessage}\"]}",
        "pageview": "${base}"
    }
}
</script>
</amp-analytics>

11行目のURL(ドメイン部分)はmatomoサーバを指定する。以前はpiwik.phpを指定したところも現在はmatomo.phpを指定するようになっている。idsiteの数値はmatomoの計測対象ウェブサイト用のトラッキングコードに含まれるsetSiteIdの値に合わせる。


AMPプラグイン 7
matomoのアクセスログでAMPページにアクセスしたレコードの詳細を見るとカスタム変数としてerrorNameとerrorMessageが表示される。(画像の赤枠部分)これは下から6行目の記述によるもので、\"errorName\"と\"errorMessage\" (${error***}じゃない方)を書き換えるとその書き換えた文字列がmatomoのアクセスレコードの詳細に表示されるが、今の所「がとらぼ」の中の人がmatomoのカスタム変数の使い方と意味がよくわかっていないのでスミマセン。

リスト
WordPressなどのCMSには必ずあるといって良い「最新の投稿○件」という機能。登録された逆順に最新○件をリスト表示するものだが、AMPの場合は他所のサーバにキャッシュされるという特性上、キャッシュされた時点の「最新の投稿○件」が次にキャッシュされるまでそのまま表示され続けることになる。2月1日にキャッシュされたとしたらそのときの最新記事、それが仮に1月15日から1月31日までに登録された10件とすると、4月1日に次にキャッシュされて表示されるようになるまで2ヶ月間はそれがリスト表示され続ける。これだと3月31日に閲覧した人が最新記事を1月31日だと認識し2月1日以降の記事の存在を知ることができない可能性がある。少なくとも「最新の投稿○件」リストだけはリアルタイムで最新のものを取得して表示したい。そこで使うのがamp-list。
最近のWordPressはREST APIが標準で利用可能。https://example.com/wp-json/wp/v2/posts?per_page=○ (example.comは"自分の"WordPressのドメインに読み替え)というURLで最新記事○件のリストを取得できるので、それをAMPページを表示するときにリアルタイムで嵌め込むイメージ。

利用条件: ヘッダでamp-list-0.1.jsとamp-mustache-0.2.jsを読むこと
1
2
3
4
5
6
7
<amp-list width="auto" height="360" layout="fixed-height" src="https://example.com/wp-json/wp/v2/posts?per_page=20" items=".">
    <template type="amp-mustache">
        <li>
            <a href="{{link}}">{{title.rendered}}</a>
        </li>
    </template>
</amp-list>

height(高さ)を指定する場合はper_pageで指定する表示記事数と矛盾しないこと。つまりheightを低い値で指定するとper_pageで大きな値を指定しても表示数が少なくなる。その反対も。

GoogleやCloudflareのようなAMPキャッシュを閲覧される場合、「最近の投稿」のリストはキャッシュでない別オリジンつまり元のサイトから取得されることになるが、当然違うオリジンのコンテンツのミックスということになるのでCORSが絡んでくる。で、下手にウェブサーバでCORS関係の設定をしているとハマることになったのでメモ。WordPress REST APIとCORS

WordPressのウィジェットの扱い

WordPressでは通常ページ用に表示するウィジェットは管理画面で登録・変更・削除できるが、それにより例えばサイドバー用の「ウィジェットのセット」として登録されてしまう。つまり、「検索・最新の投稿・カテゴリ・タグクラウド」のように登録するとそれがウィジェットのセットになってしまうので、例えば上に書いた「最新の投稿」は個別対応したいとか、あるウィジェットはJavascriptを使ってるのでAMPページでは外したいというときに困ることがある。
テンプレートに個別にウィジェットを登録すれば良いので以下。

通常(非AMP)のテンプレートであれば、例えばサイドバー用ウィジェットのセットなら次のように書けばサイドバー用のウィジェットのセットがそこに表示される。
<?php dynamic_sidebar( 'sidebar-1' ); ?>

ウィジェット個別に表示するのであれば、例えばタグクラウドウィジットなら次。
<?php the_widget( 'WP_Widget_Tag_Cloud' ); ?>

これをAMP用テンプレートのサイドバー(になる部分)の中などに書く。

サイドバーとメニュー

通常(非AMP)のテンプレートを真似たサイドバーでも良いが、AMP JSライブラリで最近のスマホアプリのサイドバーやメニュー的な表示も簡単にできるのでそれを利用するというのもあり。

AMP JSライブラリをヘッダ内で読み込む
<script async custom-element="amp-sidebar" src="https://cdn.ampproject.org/v0/amp-sidebar-0.1.js"></script>

さらにbody内に以下を書く

サイドバーが最も単純なリスト(固定)だけという例
1
2
3
4
5
6
7
<amp-sidebar id="sidebar1" layout="nodisplay" side="right">
  <ul>
    <li>Nav item 1</li>
    <li>Nav item 2</li>
    <li>Nav item 3</li>
  </ul>
</amp-sidebar>

もちろん、固定リストの代わりにWordPressの関数なども好きに置ける。

また、amp-sidebarではサイドバーだけでなくナビゲーションメニューなども作れる。ハンバーガーメニューもこれでできる。
WordPressではamp-sidebarと<?php wp_nav_menu( array( 'theme_location' => 'primary' ) ); ?>とスタイルシートを組み合わせて使うことになると思う。
AMPプラグインの新しいバージョンで旧版のテンプレートに存在したナビゲーションメニューが外されたのはこれを使えということかしら?

AMPプラグイン 8
もちろん、通常テーマと同じく<?php wp_nav_menu( array( 'theme_location' => 'primary' ) ); ?>+スタイルシートのようなナビゲーションメニューそのままも可。
赤枠の部分が追加されたナビゲーションメニュー。ただし、まだ対応するスタイルシートを書いていないので通常の<ul>+</li>の見た目のままになっている。

直前にも書いたが、ウィジェットやサイドバー、ナビゲーションメニューはHTMLタグを書いただけではデザインとしては何もないただのリストが表示されるだけな筈なので対応するスタイルシートは別途style.phpに追記のこと。

その他

AMPでは勝手Javascriptなどは書いてはいけないのだが、amp-bindを使えばユーザーの操作に応じて動作を変えるようなことが(少し?)可能になる。何のために勝手Javascriptを禁止にしたんだっけ?何したいのかイマイチ不明。
これは今のところは使いたいと思っていないので全然知らない。

AMPプラグインを使用すると、通常のHTMLタグをAMP-HTMLタグに変換するあたりは自動で、さらにJavascriptなどAMPとしてエラーになるものは(手動対応を含めて)解決されるのでGoogleなどのAMPキャッシュとして登録して貰える。(エラーのあるAMPページはインデックスに登録してもらえない。)
ただし、AMPページとして表示する際に通常ページを表示する際には存在した筈のJavascriptやCSSの一部が取り除かれるので何処か表示に異常があってもおかしくない。エラー回避のために除去されたものが、位置表示を制御するものであれば表示位置が変であったり、表示内容を制御するものであれば正しくない表示或いは表示されないなどが発生する。その制御が行われるのが条件によるものであれば異常が発生したり発生しなかったり。これがAMPプラグインのNative,Pairedモードではちょっと困りもの。
なので、個人的には専用のAMP用テンプレートを自分で如何ようにもできるAMPプラグインのClassicモードが良いと思っている。Classicモードならば、(テーマ部分はもともとAMP用に作っている筈だから)記事の内容だけ不適切なタグなどを使わなければAMPプラグインによる自動変換による挙動(の不審さ)を心配することはなくて済む筈。
今後もClassicモードが存続し続けてくれるか不明で怖いけど。

AMPプラグイン 9
AMPプラグインのClassicモード用のテンプレートファイルに書き足して「がとらぼ」の通常(非AMP)テーマを真似たAMP用テーマを作ってみた。そのAMPページをPCのブラウザで表示してみたのが上の画像。
まだ通常ページと比べると足りてない部分があるけどそれは作り込んでいないだけ。
とにかく、AMPページだからとか、AMPプラグインのClassicモードだからといってデザインが大幅に貧弱になるということはないと書きたかった。

AMP関係のドキュメント

関連記事:

WordPressのAMPプラグインを使う 2019年1月 前編

参考: 以前のAMPプラグインの記事

WordPressのAMPプラグインがVer.1.0を超えた。Ver1.0まではAMP専用テンプレートを改造しなければあまり使えたものではなかったのだが、新しく追加されたモードでは使用中の非AMPのテーマを含めた全体をAMP化変換するという力技を使うようになったので、AMPの知識が特にない人でも手軽にAMP化させることが可能になったといえる。(ただし強引な変換には罠もある。全部おまかせ放置はダメ)
AMPプラグインとは別のAMP for WP – Accelerated Mobile Pagesというプラグインが高機能だったのでこれが流行るかと思ったが、AMPプラグインの新しいモードが良い感じなので今後もAMPプラグイン推しで良いかしら?

AMPプラグインでとりあえずの表示

その名もズバリ「AMP」(AMP for WordPress)という名前のプラグインをインストールして有効化する。管理画面のメニューにAMPという項目が表示されるのでその中の2項目の内のGeneralを開く。

AMPプラグイン 1
AMPプラグインのVer1.0ではテンプレートモードというものが追加された。1.0以前はこのテンプレートモードの中のClassicモード相当しか存在しなかったが、1.0から新しく実装されたNative, Pairedモードでは通常のページで使用しているテーマを含めて丸ごとAMP化する。NativeモードはAMPページが標準(普通に表示するのがAMPページ)になるので使用は注意。
「AMPは速い」というのがウリだが、それは完成済のキャッシュされたAMPページを表示するのが速いということであって、WordPressのAMPプラグインでは通常ページをAMP化変換するという手間が増えるのでページを作ってクライアントに送信するのは通常ページよりも時間がかかるという点は勘違いなく。なのでAMPプラグインではオブジェクトキャッシュを使うことを推奨しているらしい。つまりオブジェクトキャッシュ無しでAMPプラグインをNativeモード(AMP-First)にして高速化を狙うというのは矛盾している。(「AMPなら速いよね。だったらサイトのデフォルトをAMP-Firstにすれば良くね?」というのをオブジェクトキャッシュ無しでやるのは間違いだと書こうとしている。)とうぜんだけどキャッシュを利用できるようにしてもキャッシュ切れ・キャッシュが生成されていないページを閲覧者が表示しようとしたらやはり遅いのでお忘れなく。
ClassicモードではAMP化するページの種類を選択できる。投稿・固定ページ・メディア。AMPプラグインの古いバージョンでは固定ページをAMP化させることができなかったが、現在は固定ページもAMP化できるようになっている。 ただし、固定ページのAMP化ページのURLは末尾が?ampに限定されるみたい。

AMPプラグイン 2
ClassicモードでAMP化したページを表示した。20年くらい前の素人のウェブサイトの様なシンプルなテーマ。これがAMP化するとシンプルなページしか表示できないという大きな勘違いを引き起こす元になったような・・・
AMPプラグインの旧版では存在したナビゲーションメニュー+ハンバーガーメニューは新しいバージョンでは何故か削除されている。

AMPプラグイン 3
その他に、管理者画面の「外観」の項目にも「AMP」というのが追加される。

AMPプラグイン 4
AMPの項目を開いた。選択できるのは「デザイン」だけ。その下に3項目あるが、「ヘッダテキスト色」「ヘッダの背景&リンク色」「配色」という色関係だけ。そもそもclassicモードのAMP用標準テンプレートそのまま使い続けるということはないと思うんだけど・・・

AMPプラグイン 5
Pairedモードではおそらくエラーのページがたくさんできる筈。(使用する通常テーマによるかもだけど)
エラーのページはエラー内容を含めてリスト表示されるので、そのエラー項目を選択して「一括操作」でAcceptを選択し、[適用]を押す。単純なものであればこれでAMPのエラーが解消されてGoogleなどにインデックスされる状態になる。ただし、それが適切な対処かは不明。たとえば、Javascriptのコードが表示されなくなることで表示側に問題が発生することも。つまりAMPのエラーが解消される代わりに見た目が意図通りではなくなることがある。

Nativeモードではこのエラー解消を自動で行うのが標準設定になってるみたい。(Nativeモードは殆ど試していないので詳細不明)

Pairedモードでエラーを修正したAMPページを表示してソースの構造化データの部分を見た。実際には改行されていないが見やすいように ,や{} で行を分けて表示した。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<script type="application/ld+json">
{
    "@context":"http:\/\/schema.org",
    "publisher":{
        "@type":"Organization",
        "name":"WordPress Test"
    },
    "@type":"WebPage",
    "mainEntityOfPage":"https:\/\/wordpress.example.com\/sample-page\/",
    "headline":"\u30b5\u30f3\u30d7\u30eb\u30da\u30fc\u30b8",
    "datePublished":"2019-01-22T05:07:54+00:00",
    "dateModified":"2019-01-22T05:07:54+00:00",
    "author":{
        "@type":"Person",
        "name":"wordpress-user"
    }
}
</script>

JSON-LDで出力されるのでわかりやすい。タイプは触ってなければWebPageが指定されるみたい。Articleでさえない!?
Googleさんの構造化データの「記事」のドキュメントから外れている気がするんだけど、GoogleさんのAMPのテストでは問題無しと判定されるよう。 「がとらぼ」の中の人がスキーマを正しく理解できていない?

Classicモードのテンプレート

AMPプラグインのClassicモード(Ver1.0未満ではモードが存在せず、機能的にはClassicモード同様のみ存在)は標準で非常にシンプルなテーマが1つだけ用意されている。AMPプラグインのv1.0未満を使った多くの人が、これを以てAMP化すると非常にシンプルなページしか表示できないと勘違いしているよう。しかし、WordPressに非常にシンプルなテーマだけがインストールされていたとして、それを以てWordPressを使うとシンプルなウェブサイトしか作れないと思うのと同じで、大間違い。
AMPプラグインに標準で入っているテーマは非常にシンプル故にテンプレートファイルをひと目見れば何がどうなっているのか判るのでWordPressの非AMP用テーマを作ったとか触ったことがあるなら何をどうすれば良いかは大体わかる筈。AMPでもCSSは殆ど非AMPページ同様に使えるのでAMPページがデザイン面で非AMPページよりも大きく見劣りするということは無くできるかと思う。Javascript頼りだとそこが困ることになるけど。

AMPプラグイン 6
AMPプラグインのClassicモード用のテンプレートの雛形はWORDPRESS/wp-content/plugins/amp/templatesに存在する。ここのファイルはプラグインを更新すると一度削除されるので直接編集してはいけない。使用中のテーマがWORDPRESS/wp-content/themes/my_themeにあるとするなら、そこにampというディレクトリ(フォルダ)を作成してその下にテンプレートの雛形をコピーする。全部でも良いし変更する予定のファイルだけでも可。adminはコピーしなくて良い筈。(amp-status.phpというファイルがあって、それはAMP status option in the submit meta box.ということらしいが、普通は触らなくて良いかと。)

テーマの構造
AMPプラグインのClassic用標準テンプレートの基本構造はsingle.php(投稿)とpage.php(固定)が持つよう。ここからテーマの部品を読み込んでいる。

page.php (Ver.1.02のそのまま)
 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
<?php
/**
 * Page view template.
 *
 * @package AMP
 */

/**
 * Context.
 *
 * @var AMP_Post_Template $this
 */

$this->load_parts( array( 'html-start' ) );
?>

<?php $this->load_parts( array( 'header' ) ); ?>

<article class="amp-wp-article">
        <header class="amp-wp-article-header">
                <h1 class="amp-wp-title"><?php echo esc_html( $this->get( 'post_title' ) ); ?></h1>
        </header>

        <?php $this->load_parts( array( 'featured-image' ) ); ?>

        <div class="amp-wp-article-content">
                <?php echo $this->get( 'post_amp_content' ); // WPCS: XSS ok. Handled in AMP_Content::transform(). ?>
        </div>
</article>

<?php $this->load_parts( array( 'footer' ) ); ?>

<?php
$this->load_parts( array( 'html-end' ) );

つまり、ここからhtml-start → header → featured-image → footer → html-endを読み込んで繋がれて1つのページになる。なお、header-barはheaderの中で読み込まれている。他幾つかも同様に別のテンプレートの部品中から読み込まれる。スタイルシートもAMPではページ中に繋ぎ込まれるが次。

スタイルシート
AMPではスタイルシートは基本的にはページ内に含ませる形を取るが、AMPプラグインではスタイルシートはstyle.phpに書く。編集する人にとっては通常テーマのstyle.cssと同様の扱いで良い。AMPページを出力する際に自動的にそのページの中に繋ぎ込まれる。AMPでは !importantを書いてはいけないのだけ忘れなければ他は殆ど通常どおり。

後編に続く

関連記事:
Up