• 赤色のリンクは、まだ日本語Codexに存在しないページ・画像です。英語版と併せてご覧ください。(詳細

このWikiはいつでも誰でも編集できます

関数リファレンス/in category

提供: WordPress Codex 日本語版
移動先: 案内検索

現在の投稿(あるいは指定した任意の投稿)に、指定したカテゴリーが割り当てられているか調べます。

in_category() は、投稿に直接割り当てられているカテゴリー(管理画面の新規投稿/編集でチェックしたカテゴリー)のみを考慮します。 しかし、そのカテゴリーの親は考慮しません(用例の「子カテゴリー内の投稿かテストする」も参考にしてください)。

このタグは、ループ内で現在の投稿をテストできます。 また(バージョン 2.7 以降で)単一投稿リクエストの場合にループ外でも使えます。 テストしたい投稿を指定すれば、どこでも使用できます。

使い方

<?php in_category( $category, $_post ) ?>

パラメータ

$category
mixed) (必須) ID(整数)、名前またはスラッグ(文字列)、あるいはそれらの配列で指定されるカテゴリー。
初期値: なし
ID は、整数むき出しでも文字列として書いてもどちらでも構いません。
  • in_category( 5 )
  • in_category( '5' )
$_post
mixed) (オプション) 投稿(整数で ID を指定、あるいはオブジェクト)。デフォルトはループ内の現在の投稿、あるいはメインクエリの投稿。
初期値: なし

戻り値

(真偽値) 
投稿に指定したカテゴリーが割り当てられていれば true、そうでなければ false

参考

用例

ループ内で現在の投稿をテストする

in_category() は、ループ内で、投稿のカテゴリーに基づいて異なる処理を行うときによく用います。 例えば:

<?php 
if ( in_category( 'pachyderms' )) {
	// カバは胴体が長い...
} elseif ( in_category( array( 'Tropical Birds', 'small-mammals' ) )) {
	// 彼らは体温が高い...
} else {
	// 等々。
}
?>

ループ外で現在の投稿をテストする

(通常 single.php テンプレートで扱う)個別投稿のリクエストでは、ループが始まる前でもカテゴリーをテストすることができます。

以下のように、これを用いてテンプレートを切り替えることができます。

<?php
if ( in_category('fruit') ) {
	get_template_part( 'some', 'fruit' );
} elseif ( in_category('vegetables') ) {
	get_template_part( 'some', 'vegetables' );
} else {
	// 普通にループを続ける
	if ( have_posts() ) : while ( have_posts() ) : the_post();
	// ...
}
?>

Custom Post Templates Plugin は、個別投稿のテンプレートが作れます。単一の投稿だけでなく、所定のカテゴリーの全投稿に使用するテンプレートを追加する例もあります。デフォルトではコメントアウトされていますが、対応する行をアンコメントすると容易に実装できます。訳注: このプラグインは古いかもしれません。 --Mizuno 2010年3月30日 (火) 10:00 (UTC) )

子カテゴリー内の投稿かテストする

次のようなとき、WordPress は指定されたカテゴリーに加えて子カテゴリー(子、孫、…)から投稿を取得します。

しかし in_category() は投稿に割り当てられたカテゴリーのみをテストし、その親カテゴリー(親、親の親、…)を対象としません。

例えば、投稿がサブカテゴリー Fruit → Bananas に割り当てられているがカテゴリー Fruit に割り当てられていない場合、Fruit カテゴリーアーカイブは "Bananas" の投稿を表示しますが、その投稿について in_category('fruit') を呼び出すと常に false を返します。

親カテゴリーとその子カテゴリーを全てリストすることができます。例えば:

<?php
if ( in_category( array( 'fruits', 'apples', 'bananas', 'cantaloupes', 'guavas', /*等々*/ ) )) {
	// 全部が果物…
}
?>

しかしながら "Fruit" カテゴリーに子カテゴリーを移動または追加する度にコードを編集する必要があります。

より柔軟な方法は、下記で定義する post_is_in_descendant_category 関数を使用することです(注意:呼び出す前にテンプレート、プラグイン、またはテーマ関数にコードをコピーする必要があります)。 下の例のように in_category() と一緒に使用することができます(この例で 11 は "Fruit" カテゴリーの ID です)。

// 投稿が "fruit" カテゴリーまたは "fruit" の子孫カテゴリーに割り当てられているか?
<?php if ( in_category( 'fruit' ) || post_is_in_descendant_category( 11 ) ) {
	// 全部が果物…
}
?>

カテゴリー名で参照したい場合には、以下の例のようにします。

if ( $category_to_check = get_term_by( 'name', 'fruit', 'category' ) )
    post_is_in_descendant_category( $category_to_check->term_id );

post_is_in_descendant_category 関数

<?php
/**
 * 投稿に付けられたカテゴリーが、指定されたカテゴリーの子孫カテゴリーに含まれるかテストする
 *
 * @パラメータ 整数|配列 $cats - カテゴリーを指定。整数の ID または整数の ID の配列
 * @パラメータ 整数|オブジェクト $_post - 投稿。省略するとループまたはメインクエリ内の現在の投稿をテストする
 * @戻り値 真偽値 True - 投稿のカテゴリーの一つ以上が指定されたカテゴリーの何れかの子孫カテゴリーである場合
 * @参考 get_term_by() - カテゴリー名またはスラッグからカテゴリー ID を取得するのに使える
 * @内部で使用 get_term_children() - $cats を渡す
 * @内部で使用 in_category() - $_post を渡す(空でもよい)
 * @バージョン 2.7
 * @リンク http://codex.wordpress.org/Function_Reference/in_category#Testing_if_a_post_is_in_a_descendant_category
 */
if ( ! function_exists( 'post_is_in_descendant_category' ) ) {
	function post_is_in_descendant_category( $cats, $_post = null ) {
		foreach ( (array) $cats as $cat ) {
			// get_term_children() は整数の ID しか受け付けない
			$descendants = get_term_children( (int) $cat, 'category' );
			if ( $descendants && in_category( $descendants, $_post ) )
				return true;
		}
		return false;
	}
}
?>

外部資料

変更履歴

バージョン 1.2.0 にて導入されました。

ソースファイル

in_category()wp-includes/category-template.php にあります。


カテゴリータグ: the_category(), the_category_rss(), single_cat_title(), category_description(), wp_dropdown_categories(), wp_list_categories(), get_the_category(), get_the_category_by_ID(), get_category_by_slug(), get_the_category_list(), get_category_parents(), get_category_link(), is_category(), in_category()


条件分岐タグis_404(), is_admin(), is_admin_bar_showing(), is_archive(), is_attachment(), is_author(), is_category(), is_comments_popup(), is_date(), is_day(), is_feed(), is_front_page(), is_home(), is_local_attachment(), is_main_query, /is_multi_author, is_month(), is_new_day(), is_page(), is_page_template(), is_paged(), is_plugin_active(), is_plugin_active_for_network() /en, is_plugin_inactive() /en, is_plugin_page() /en, is_post_type_archive(), is_preview() /en, is_search(), is_single(), is_singular(), is_sticky(), is_tag(), is_tax(), is_taxonomy_hierarchical(), is_time(), is_trackback(), is_year(), in_category(), in_the_loop(), is_active_sidebar(), is_active_widget(), is_blog_installed() /en, is_rtl(), is_dynamic_sidebar(), is_user_logged_in(), has_excerpt(), has_post_thumbnail(), has_tag(), pings_open(), email_exists(), post_type_exists(), taxonomy_exists(), term_exists(), username_exists() /en, wp_attachment_is_image(), wp_script_is()



関数リファレンステンプレートタグ目次もご覧ください。


最新英語版: WordPress Codex » Function_Reference/in_category最新版との差分