カスタムタクソノミーを使用して記事の分類を始めました。
すると、記事がタクソノミーに属しているかを調べる関数(カテゴリーでの in category に代わる関数)がなく、困ったので調べてみました。
まずは手掛かりとなる in category がどのように動作しているのかを確認します。すると、in_category で使用されている is_object_in_term を使えばよさそうです。結論を先に言うと、is_object_in_term を以下のように使用して解決することができます。それでは、詳しくみていきましょう。
is_object_in_term( $post_id, $taxonomy, $terms )
引数1.$post_id:投稿ID
引数2.$taxonomy:タクソノミー名
引数3.$term:タームID、名前、スラッグもしくはArray
戻り値.記事がタクソノミーに属していたら true 、属していなかったら false を返す。
引数1.$post_id:投稿ID
引数2.$taxonomy:タクソノミー名
引数3.$term:タームID、名前、スラッグもしくはArray
戻り値.記事がタクソノミーに属していたら true 、属していなかったら false を返す。
それにしても、in_taxonomy といった関数がないと、カスタムタクソノミーがますます使うのが難しい機能になってしまうな~。
wp-includes/category-template.php 257行目~
* @uses is_object_in_term()
*
* @param int|string|array $category. Category ID, name or slug, or array of said.
* @param int|post object Optional. Post to check instead of the current post. @since 2.7.0
* @return bool True if the current post is in any of the given categories.
*/
function in_category( $category, $_post = null ) {
if ( empty( $category ) )
return false;
if ( $_post ) {
$_post = get_post( $_post );
} else {
$_post =& $GLOBALS;
}
if ( !$_post )
return false;
$r = is_object_in_term( $_post->ID, 'category', $category );
if ( is_wp_error( $r ) )
return false;
return $r;
}
さて、肝心の is_object_in_term ですがWordPress ドキュメントのSourceForge にもなかったので引き続き調べる必要がありそうです。
wp-includes/taxonomy.php 2630行目~
function is_object_in_term( $object_id, $taxonomy, $terms = null )
is_object_in_term を使うにあたり引数と戻り値を明らかにしたいと思います。まず、引数は in_category での is_object_in_term の使い方をみると以下の通りだと推測されます。
1.投稿ID
2.タクソノミー名
3.タームID、名前、スラッグもしくはArray(in_category での引数に準じるので)
次に戻り値ですが、in_category では戻り値が is_wp_error で判定してエラーだった場合に false を、エラーでなかった場合は is_object_in_term の戻り値をそのまま返しています。直接 is_object_in_term のコードを見ても true/false を返してくれるようです。
以上から、記事がタクソノミーに属しているか調べるときは以下のようにすればよいと思い試したところ、うまくいきました。ちなみに投稿タグで探す場合は タクソノミーに post_tag を指定して下さい。
記事がカテゴリーに属しているかを調べる in_category はテンプレートタグに掲載されていて、こちらも参考にしました。
テンプレートタグ/in category
現在の投稿(あるいは指定した任意の投稿) に指定したカテゴリーが割り当てられているか調べます。
in_category() は、投稿に直接割り当てられているカテゴリー(新規投稿/編集でチェックしたカテゴリー)のみを考慮します。そのカテゴリーの親は考慮しません。
(出典)http://wpdocs.sourceforge.jp/テンプレートタグ/in_category
現在の投稿(あるいは指定した任意の投稿) に指定したカテゴリーが割り当てられているか調べます。
in_category() は、投稿に直接割り当てられているカテゴリー(新規投稿/編集でチェックしたカテゴリー)のみを考慮します。そのカテゴリーの親は考慮しません。
(出典)http://wpdocs.sourceforge.jp/テンプレートタグ/in_category
