【WordPress】AMPリクエスト時だけ特定のテンプレートに切り替える方法
WordPress で、AMP ページのリクエスト時だけ特定のテンプレートに切り替える方法です。
基本的には調べたコードを組み合わせただけなんですが、意外とスルっと検索できなかったのでまとめておきます。
UA判定でテンプレートを切り替えつつAMP化
Google さんの「とっととAMP対応しろ」みたいなイベントに呼ばれた事をきっかけに、サイトの AMP 化をしてみました。
うちのサイトのPC版は今どき珍しくレスポンシブ非対応で、"W3 Total Cache" というプラグインで UA を判別してSP版とPC版とを切り替えているわけですが、これと WordPress 公式 AMP プラグイン「AMP for WordPress」とを共存させています。
PC 版はレガシー版という位置づけでそのままサーブし、UA 判別で必要に応じて SP 版を配信。そして、クエリストリングに "amp=1" があれば AMP を配信する、ということをしたいわけですが、PC の UA で AMP ページをリクエストされた場合、PC 版のテンプレートが出てしまうので困っていたわけです。
なお、AMP に関しては AMP プラグインの設定から Website Mode を "Transitional" にして、SP版をベースにプラグインに自動で AMP 化させる仕組みとしています。
(※設計思想の話にはなっちゃうんだけど、そもそもSP版とPC版とで同じコードを吐くのはおかしいだろ、という信念があって UA 判別をしています。)
ということで、AMP ページをリクエストされた場合には、W3 Total Cache によるUA判定とは無関係に、強制的にモバイル版テンプレートに切り替える、という実装が必要となったわけです。
AMPリクエスト時のみ特定テンプレートへ切り替えるプラグイン
WordPress のテンプレートの動的な切り替えは、用途にあったプラグインがあればそちらを使うのが良いと思いますが、専用プラグインを自前で書けばより柔軟な条件にも対応できます。
今回は、公式 AMP プラグインがインストールされている前提で、AMP ページがリクエストされたかどうかを判定し、テンプレートを動的に切り替えるプラグインにしてみました。
ソースはこんな感じ。
function theme_changer_for_amp($template) {
// AMP プラグインが有効でない場合はそのまま。
if ( !function_exists( 'amp_is_enabled' ) ) {
return $template;
}
if ( !amp_is_enabled() ) {
return $template;
}
if ( function_exists('amp_is_request') && amp_is_request() ) {
// AMPページ
return 'myamptheme'; //テーマのフォルダ名
} else {
// 通常ページ
return $template;
}
}
add_filter('template', 'theme_changer_for_amp');
add_filter('stylesheet', 'theme_changer_for_amp');
Code language: PHP (php)
(※ここで amp_is_request() が期待した動作をしない場合は、GET パラメーターの "amp" で判別するコードに変えます。)
このプラグインは、「theme-changer-for-amp.php」という名称で plugins ディレクトリに配置しておきます。
念のため言っておくと、AMP プラグインの設定で Website Mode が「Reader」の場合は、当然ですがこのプラグインは動作しません。
(※その場合、テンプレートディレクトリ内の「amp」ディレクトリのテンプレートの内容、または Reader モードのデフォルトテンプレートが適用されます。)
W3 Total Cache のUA判定との処理優先順が心配でしたが、とりあえず、手元の環境では特に問題なく動作しています。
UA判定不要ならこのプラグインは不要
今回は UA でテンプレートを出し分けつつ AMP 対応もする、というかなり特殊なケースだからプラグインを使ったのであって、UA 判定をしないならこんなトリッキーなことをする必要はありません。
というのも、公式AMPプラグインは「Website Mode」の設定次第で以下のように振る舞ってくれるからです。
- Standard または Transitional:
→ プラグインが現在利用中のテンプレートを自動的に AMP 化しようとする(AMP非対応テンプレート・プラグイン利用時は、修正・開発が必要) - Reader:
→ 現在利用中のテンプレートディレクトリ内のAMPディレクトリのテンプレート、または、デフォルトのテンプレートでAMP化
つまり、UA判定をしないなら、Reader モード用のテンプレートを新規で作成するか、既存のテンプレートを Transitional モード以上の自動変換に対応させれば良いわけです。
Google としては、最終的には Standard モードへスイッチして欲しいようではありますが、WordPress のエコシステム全体がこの公式AMPプラグインを意識してくれるようになるには、まだ時間が必要そうです。