AMPプラグインを使用して作成したページで、カスタムフィールドの値に応じて表示をコントロールすることができずに困っていましたが、何とか解決したのでメモ。
AMP
AMPプラグインを使用すると簡単にシンプルなAMPページを作ることが出来ます。
しかしそのままでは使い物にならないので多少のカスタマイズを行いますね。AMPプラグインは現在のバージョンではテンプレートを簡単カスタマイズすることが出来ます。
AMPプラグインのテンプレートカスタマイズの準備
ampプラグインフォルダ内に templates フォルダがあります。
このtemplatesフォルダをテーマフォルダにコピーして「amp」と名前を変えます。準備完了。
これでAMPテンプレートの子テーマみたいに認識されます。こっちを弄ると自動的に反映されます。特に何も設定する必要ありません。いつの間にこんなに便利なことになっていたんでしょう。
templatesフォルダ内のファイルをいろいろカスタマイズ
例えば meta-taxonomy.php や single.php をカスタムします。またあるいは別のプラグインを追加インストールしたりします。
今回の趣旨じゃないのでこのあたりは飛ばしますね。
カスタムフィールドが作動しない
さてここから本題です。
AMP子テンプレートの single.php を弄っていく中、何故かどうしても上手くいかないことが出てきました。カスタムフィールドです。
表示は普通に出来ました。問題はカスタムフィールドの get_post_meta() を使った分岐です。
if による get_post_meta() が動かない
カスタムフィールドの値によって処理を分岐させる方法があります。
たとえば、カスタムフィールド「特殊表示」の値が「on」なら何かを表示し、それ以外は別の表示を行う、てな処理です。
<?php if(get_post_meta($post->ID,'特殊表示',true) == 'on'):?> ここに特殊表示の処理 <?php else:?> 別の処理 <?php endif;?>
こんなふうに書きますね。こうすると、投稿編集時に、カスタムフィールドkey「特殊表示」に「on」と書かれているときだけ特殊表示の処理がされます。こういうことが出来ますし実際よく利用します。
で、この処理なんですが、これがAMPページでは動きません。どうしたことでしょう。
おかしいなと思って、問題を切り分けるためにこんなテストもしてみました。
<?php if(get_post_meta($post->ID,'特殊表示',true) == 'on'):?> ここに特殊表示の処理 <?php elseif(get_post_meta($post->ID,'特殊表示',true) == 'off'):?> * <?php elseif(get_post_meta($post->ID,'特殊表示', true)== ''):?> ** <?php else:?> *** <?php endif;?>
onと書いたりoffと書いたり何も書かずにいたりしましたが、何故かどうやってもAMPページに「***」と表示されるんですね。なにやっても「それ以外」と思われています。
エラーが出るわけでもないんです。命令自体は判っているご様子ですが、常に else にだけ反応します。命令は判っているけどカスタムフィールドが判っていないんですか。
テンプレート内にコードを書くと解決
さっぱりわからないので検索しまくりますが日本語の情報が見つけられません。日本語を外してようやく解答を得ました。
まさにズバリの質問をしている人がいて、素っ気なく回答が書かれています。それによるとこうです。
global $post; $metas = get_post_meta( $post->ID, ‘your-custom-field-name’, true );
これを入れろと。
直後にだれかが「どこにそのコード入れんの?」と訊いているけど無視されていますね。私もそこが聞きたかった。
でもまあ「amp plugin template」に入れろみたいに書いてあったので、ヤケクソでAMP子テンプレートのsingle.php内、動いていないget_post_meta() の直前に書いてみました。ampテンプレートにはfunctionsとかありませんものね。
一瞬エラーが出たのはコードをうっかりコピペしただけというオチで、気を取り直して <?phpと?> を付け足します。
<?php global $post; $metas = get_post_meta( $post->ID, 'カスタムフィールドKey', true );?> <?php if(get_post_meta($post->ID,'カスタムフィールドKey',true) == 'on'):?> 〜ここにonの時の処理 <?php elseif(get_post_meta($post->ID,'カスタムフィールドKey',true) == 'off'):?> 〜ここにoffの時の処理 <?php endif;?>
こんな風に、動かないコードの上にしれーっと置きました。
そうしますと、きっちり動きました。なぜ動いたのかは知りません。なぜこの場所にペーストするのかも知りません。でも出来ました。
$metas ってのがミソなのでしょうか。AMPではカスタムフィールドを認識させる決まり事があるのかなと薄らぼんやり思いますが。わかりませんけど。
意味も判らずコピペで解決しましたので何だかもやもやしますがとりあえずよしとします。
wordpressのバージョン4.6.1 AMPバージョン0.4.1、テーマはtwentysixteenの子テーマを使用。そのような状況でのお話でした。一過性の一時的なお話になるのかもしれませんが何もわかりません。