2018.2.14 追記
AMP for WordPress ver 0.6.0 からプラグインにこの機能が実装されたので、この記事にあるカスタマイズは必要なくなりました。
WordPress 記事の AMP ページ作成プラグインとしては AMP for WordPress プラグインがベターですが、もっと高機能なプララグインもあります。
が、その中でも Facebook Instant Articles & Google AMP Pages by PageFrog がサーバーに負荷かけすぎ問題があって、その中の「特定の投稿だけAMPにする」機能を単独プラグインにしましたよ、というお話
仕様
- 投稿編集画面にメタボックスを作ってチェックの入った投稿のみAMPページを作る
- AMP for WordPress プラグインの利用が前提
メタボックスを作って設定をカスタムフィールドに保存する
add_meta_box()
使ってよしなに作っておきましょう。
Codexのサンプルコードはテキストなのでチェックボックスに変えておきましょう。
https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/add_meta_box
チェック入った投稿だけAMPに
AMP for WordPressプラグインのフィルターフック amp_skip_post
を使いましょう。
https://github.com/Automattic/amp-wp/blob/master/includes/amp-helper-functions.php#L30
- デフォルトは
false
です。フィルター名の通り、AMPをスキップしたい場合はture
を返すようにしましょう - 特に追加したカスタムフィールドがチェックボックスでデフォルトでチェックを入れていても、過去の投稿は自動で保存などされません。また「チェックの入っていない」「カスタムフィールドがない」などはDBの負担になるので、「カスタムフィールドの値が1のもの」のようにして条件分岐しましょう
<?php
add_filter( 'amp_skip_post', 'my_amp_skip_post' 10, 3 );
function my_amp_skip_post( $flag, $post_id, $post ) {
$flag = true;
$checked = get_post_meta( $post_id, '_my_amp_post_control', true ); // カスタムフィールドの値取得
if ( $checked == 1 ) {
$flag = false;
}
return $flag;
}
これで、チェックボックスにチェックの入っていない投稿は /amp/
エンドポイントでアクセスしても、オリジナルのURLに301リダイレクトされます。
AMP for WordPressプララグインが /amp/
エンドポイントにアクセスがあった場合、どのように振る舞うかは
https://github.com/Automattic/amp-wp/blob/master/amp.php#L85-L111
になりますので、頑張ってソースコード読みましょう。
現場からは以上です。