LoginSignup
5
2

More than 5 years have passed since last update.

WordPress 特定の投稿だけAMPにしたい

Last updated at Posted at 2017-10-12

2018.2.14 追記
AMP for WordPress ver 0.6.0 からプラグインにこの機能が実装されたので、この記事にあるカスタマイズは必要なくなりました。

スクリーンショット 2018-02-14 13.13.55.png


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

スクリーンショット 2017-10-13 0.04.37.png

チェック入った投稿だけ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
になりますので、頑張ってソースコード読みましょう。

現場からは以上です。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2