【wordpress】投稿がカスタム投稿タイプのタームに所属しているか判別する方法

2015.2.22 Wordpress

投稿記事の単体のページ内で、その投稿がカスタム投稿タイプの特定のタームに所属しているかを判別して表示を変えてみます。

 

is_object_in_termを使う方法

このあとに書くforeachを最初に思いついてあれこれしていたのですが、今回のケースだとこちらを使うほうが俄然カンタンです。
関数リファレンス/is object in term – WordPress Codex 日本語版

is_object_in_term( 投稿ID, 確認したいタームが属するカスタムタクソノミの名前, 確認したいタームのスラッグ )

投稿ID

投稿記事のページ内であれば$post->IDで良いでしょう。

もしくはget_the_ID()などでも良さそうです。
get_the_ID:WordPress私的マニュアル

確認したいタームが属するカスタムタクソノミの名前

タームが所属するカスタムタクソノミーのIDを指定しましょう。register_taxonomy()で設定した名前です。これは必須項目です。

確認したいタームのスラッグ

今回は「スラッグ」と書きましたが、タームのIDや名前でも良いらしいです。もしくはそれらの配列。

以上を踏まえて、試しに書いてみましょう。

if(is_object_in_term( $post->ID, 'shop', 'shibuya' )){
//カスタムタクソノミshopのなかのタームIDがshibuyaの記事を見ている場合
echo '渋谷店です。';
}else{
echo '渋谷ではありません';
}

get_the_terms()とforeachを使う

get_the_terms()で記事のターム情報を取得します。
get_the_terms:WordPress私的マニュアル

get_the_terms( 投稿記事のID ,  タームが所属するカスタムタクソノミー)

前項と同じ要領で指定すると以下のようになります。

$termData = get_the_terms( $post->ID ,  'shop')

foreach()でタームの情報を取得

変数termDataには、投稿記事のタームに関する情報が配列で入っています。
これをforeach()でループさせましょう。

foreach($termData as $data){
	////タームを確認するためのデータを取得する
	$tId = $data->term_id; //タームのID
	$tName = $data->name;//タームの名前
	$tSlug = data->slug;//タームのスラッグ
	
	////スラッグで判別してみることにする
	$arg[] = $tSlug; //スラッグを配列に格納する
}

if(in_array('shibuya' , $arg)){
	echo '渋谷店です';
}else{
	echo '渋谷店ではありません';
}

中部ぐらいに$arg[] = $tSlugとありますが、のちのin_array()で配列の中にあるキーワードを検索するときに、検索範囲としたい(今回はスラッグから「shibuya」を探すことにしましょう)ものを配列に代入し続けることでif(in_array())を使うことが出来ます。
PHP: in_array – Manual

番外編:カスタムフィールドでも同じことが出来ます。

前項の「get_the_terms()とforeach()を使う」のとほぼ同じ要領で、カスタムフィールドの中から値を検索して表示/非表示を切り替えることが出来ます。

ケースとしては、たとえば「Custom Field Template」プラグインとかでチェックボックス項目やラジオボタンなど「項目の選択」ができるカスタムフィールドを作成した場合。

例を挙げると、「対象の性別」というカスタムフィールドを作って、チェックボックスで

  • 男性
  • 女性
  • 男女兼用

と選択できるようにしたときです。

Custom Field Template設定例

get_post_meta()でカスタムフィールドの値を取得

post_customだと単一の値しか取得できず、今回はin_arrayでの検索を目的としているので、配列で取得するとします。まぁこうしておけば万が一複数の値が選択できる仕様に変更しても対応できますしね

$fields = get_post_meta($post->ID , 'カスタムフィールドのキー');

get_post_meta:WordPress私的マニュアル

では、これを利用してin_arrayで表示を分岐してみます。

if(in_array('男性' , $fields)){
echo '男性用です';
}elseif(in_array('女性' , $fields)){
echo '女性用です';
}elseif(in_array('男女兼用' , $fields)){
echo '男女兼用です';
}else{}

これでOK!


 

以上です。
困ったときに役に立ったのでis_object_in_term()について書きました。

 

でわ!

プロフィール

東京でWebデザイナー・コーダーとして、フロントエンド的なことからグラフィックデザイン的なことをして、ごにょごにょと小さく活動中。Webクリエイターでは珍しい(?) HIPHOP, R&B好き。休日はよくカフェや漫画喫茶に出向いたりパン屋に行ったり、主に散歩しています。だいたいラーメンを食べて帰ってくる、そんな過ごし方です(都内のオススメ散歩コース募集中!)。デザインのトレンドやデザイン思考、HTML、CSSからSASS、Javascript、Wordpress構築などコーディングのTIPSなどをブログにアップしていきます。その他のことはtwitter( @satohmsys )まで。