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

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

「関数リファレンス/in category」の版間の差分

提供: WordPress Codex 日本語版
移動先: 案内検索
(差分リンク追加等、要更新)
(ページ重複のため、関数リファレンス/in_category 2010-03-30T12:44:44 Mizuno 版をマージ)
1行目: 1行目:
{{Old}}
 
 
== 説明 ==
 
== 説明 ==
  
現在の投稿が指定した[[用語集#Category|カテゴリ]]に属するとき、true を返します。通常、このタグは[[The Loop|ループ]]の中で使いますが、[[#ループ外で使う|ループ外で使いたい場合]]は、事前に変数 <code>$post</code> の値をセットしておく必要があります。  
+
<!-- 現在の投稿(または任意の投稿)が、指定した[[用語集#Category|カテゴリ]]に属するか調べます。通常、このタグは[[The Loop|ループ]]の中で使いますが、[[#ループ外で使う|ループ外で使いたい場合]]は、事前に変数 <code>$post</code> の値をセットしておく必要があります。 -->
 +
現在の投稿(あるいは指定した任意の投稿) に指定した[[用語集#カテゴリー|カテゴリー]]が割り当てられているか調べます。
 +
 
 +
<tt>in_category()</tt> は、投稿に直接割り当てられているカテゴリー(<em>新規投稿/編集</em>でチェックしたカテゴリー)のみを考慮します。そのカテゴリーの親は考慮しません([[#Testing_if_a_post_is_in_a_descendant_category|Testing if a post is in a descendant category]] も参考にしてください)。
 +
 
 +
このタグは、[[The Loop]] 内で現在の投稿、あるいは ([[Version 2.7]] 以降で)単一投稿リクエストの場合 Loop 外でテストします。テストしたい投稿を指定すれば、どこでも使用できます。
  
 
== 使い方 ==
 
== 使い方 ==
8行目: 12行目:
 
例えば、現在処理中(ページを生成中)の投稿が、あるカテゴリID に属するときにのみ、特定の [[用語集#PHP|PHP]] や [[用語集#HTML|HTML]] を動作させたい場合には、これで 'category_id' を指定します。
 
例えば、現在処理中(ページを生成中)の投稿が、あるカテゴリID に属するときにのみ、特定の [[用語集#PHP|PHP]] や [[用語集#HTML|HTML]] を動作させたい場合には、これで 'category_id' を指定します。
 
   
 
   
<pre><?php if ( in_category('category_id') ): ?>
+
<pre><?php if ( in_category( $category, $_post ) ): ?>
 
   // ここにカテゴリ特有の PHP/HTML を書く
 
   // ここにカテゴリ特有の PHP/HTML を書く
 
<?php endif; ?></pre>
 
<?php endif; ?></pre>
 +
 +
== <span id="Parameters">パラメータ</span> ==
 +
 +
{{Parameter|$category|mixed|ID (整数)、名前またはスラッグ (文字列)、あるいはそれらの配列で指定されるカテゴリー}}
 +
: IDは、整数むき出しでも文字列として書いてもどちらでも構いません。
 +
:*<code>in_category(5)</code>
 +
:*<code>in_category('5')</code>
 +
 +
{{Parameter|$_post|mixed|投稿 (整数 ID あるいはオブジェクト)。デフォルトは Loop の現在の投稿あるいは主クエリの投稿。|オプション}}
 +
 +
==戻り値==
 +
 +
; (boolean) : 投稿に指定したカテゴリーが割り当てられていれば True、そうでなければ false
 +
 +
==注==
 +
 +
* [[Version 2.5]] 以降では、カテゴリー名でカテゴリーを指定できます。
 +
* [[Version 2.7]] 以降では、カテゴリースラッグでカテゴリーを指定できます。
 +
* [[Version 2.7]] 以降では、複数のカテゴリーについてチェックできます。
 +
* [[Version 2.7]] 以降では、(単一投稿クエリでは) WordPress Loop の外で使用できます。
 +
* [[Version 2.7]] 以降では、(現在の投稿だけでなく)任意の投稿を指定してテストできます。
  
 
== 用例 ==
 
== 用例 ==
  
=== カテゴリ特有のテキストを表示 ===<!-- Display Some Category Specific Text -->
+
=== Loop 内で現在の投稿をテストする ===
 +
 
 +
<tt>in_category()</tt> は、Loop 内で、投稿のカテゴリーに基づいて異なる処理を行うときによく用います。例:
 +
 
 +
<pre><?php
 +
if ( in_category( 'pachoderms' )) {
 +
// They have long trunks...
 +
} elseif ( in_category( array( 'Tropical Birds', 'small-mammals' ) )) {
 +
// They are warm-blooded...
 +
} else {
 +
// & c.
 +
}
 +
?></pre>
 +
 
 +
=== Loop 外で現在の投稿をテストする ===
 +
 
 +
(通常 <tt>single.php</tt> テンプレートで扱う)個別投稿のリクエストでは、Loop が始まる前にカテゴリーをテストすることができます。
 +
 
 +
以下のように、これを用いてテンプレートを変更することができます。
 +
 
 +
<pre><?php
 +
if ( in_category('fruit') ) {
 +
include 'single-fruit.php';
 +
} elseif ( in_category('vegetables') ) {
 +
include 'single-vegetables.php';
 +
} else {
 +
// Continue with normal Loop
 +
if ( have_posts() ) : while ( have_posts() ) : the_post();
 +
// ...
 +
}
 +
?></pre>
 +
 
 +
([http://boren.nu/archives/2005/03/13/custom-post-templates-plugin/ Custom Post Templates Plugin] は、個別投稿のテンプレートが作れます。単一の投稿だけでなく、所定のカテゴリーの全投稿に使用するテンプレートを追加する例もあります。デフォルトではコメントアウトされていますが、対応する行をアンコメントすると容易に実装できます。訳注: このプラグインは古いかもしれません。 --[[利用者:Mizuno|Mizuno]] 2010年3月30日 (火) 10:00 (UTC))
 +
 
 +
=== 子カテゴリー内の投稿かテストする ===
 +
 
 +
カテゴリーアーカイブを表示するとき、あるいは <tt>query_posts()</tt> や <tt>get_posts()</tt> でカテゴリーの投稿を表示するとき、WordPress は特定のカテゴリーに<em>加えて</em>子カテゴリーを呼び出します。しかし <tt>in_category()</tt> は投稿に割り当てられたカテゴリーかどうかをテストし、親カテゴリーを対象としません。
 +
 
 +
例えば、投稿がサブカテゴリー <em>Fruit &rarr; Bananas</em> に割り当てられているがカテゴリー <em>Fruit</em> に割り当てられていない場合、<em>Fruit</em> カテゴリーアーカイブは "Bananas" 投稿を表示しますが、この投稿について <code>in_category('fruit')</code> を呼び出すと、常に <tt>false</tt> を返します。
 +
 
 +
親カテゴリーとその子カテゴリーを全てリストすることができます。例:
 +
 
 +
<pre><?php if ( in_category( array( 'fruits', 'apples', 'bananas', 'cantaloupes', 'guavas', /*etc*/ ) )) {
 +
// These are all fruits
 +
}
 +
?></pre>
 +
 
 +
しかしながら "Fruit" カテゴリーに移動または追加する度にコードを編集する必要があります。
 +
 
 +
より柔軟な方法は、下記で定義する <tt>post_is_in_descendant_category</tt> 関数(呼び出す前にテンプレート、プラグイン、またはテーマ関数にコードをコピーする必要がある)を使用することです。下の例のようにすると <tt>in_category()</tt> と一緒に使用することができます(この例では 11 は "Fruit" カテゴリーの IDです)。
 +
 
 +
<pre> // Post is assigned to "fruit" category or any descendant of "fruit" category?
 +
<?php if ( in_category( 'fruit' ) || post_is_in_descendant_category( 11 ) ) {
 +
// These are all fruits…
 +
}
 +
?></pre>
 +
 
 +
カテゴリー名で参照したい場合には、以下の例のようにします。
 +
 
 +
  post_is_in_descendant_category( get_term_by( 'name', 'fruit', 'category' ) )
 +
 
 +
==== post_is_in_descendant_category 関数 ====
 +
 
 +
<pre><?php
 +
/**
 +
* Tests if any of a post's assigned categories are descendants of target categories
 +
*
 +
* @param int|array $cats The target categories. Integer ID or array of integer IDs
 +
* @param int|object $_post The post. Omit to test the current post in the Loop or main query
 +
* @return bool True if at least 1 of the post's categories is a descendant of any of the target categories
 +
* @see get_term_by() You can get a category by name or slug, then pass ID to this function
 +
* @uses get_term_children() Passes $cats
 +
* @uses in_category() Passes $_post (can be empty)
 +
* @version 2.7
 +
* @link http://codex.wordpress.org/Function_Reference/in_category#Testing_if_a_post_is_in_a_descendant_category
 +
*/
 +
function post_is_in_descendant_category( $cats, $_post = null )
 +
{
 +
foreach ( (array) $cats as $cat ) {
 +
// get_term_children() accepts integer ID only
 +
$descendants = get_term_children( (int) $cat, 'category');
 +
if ( $descendants && in_category( $descendants, $_post ) )
 +
return true;
 +
}
 +
return false;
 +
}
 +
?></pre>
 +
 
 +
<!-- 以下: 古い説明を一旦コメントアウト by bono
 +
 
 +
=== カテゴリ特有のテキストを表示 <span id="Display Some Category Specific Text"></span>===
  
 
カテゴリ番号 '''5''' に属する各投稿に <code><nowiki><span class="good-cat-5">これはいいカテゴリです</span></nowiki></code> と表示し、それ以外の投稿には <code><nowiki><span class="bad-cat">これは悪いカテゴリです</span></nowiki></code> と表示:
 
カテゴリ番号 '''5''' に属する各投稿に <code><nowiki><span class="good-cat-5">これはいいカテゴリです</span></nowiki></code> と表示し、それ以外の投稿には <code><nowiki><span class="bad-cat">これは悪いカテゴリです</span></nowiki></code> と表示:
36行目: 151行目:
 
?></pre>
 
?></pre>
  
=== ループ外で使う ===<!-- Use OUTSIDE The Loop --><!-- 改名注意:「テンプレートタグ」から直リンク -->
+
=== ループ外で使う <span id="Use OUTSIDE The Loop"></span>===改名注意:「テンプレートタグ」から直リンク
  
 
通常、このタグは[[The Loop|ループ]]の内側で使わなければなりません。ループ中でのみ値が与えられる WordPress の PHP 変数(<code>$post</code>)が必要だからです。しかし、この変数に''手動で''値を与え、このタグをちゃんと使えるようにもできます。
 
通常、このタグは[[The Loop|ループ]]の内側で使わなければなりません。ループ中でのみ値が与えられる WordPress の PHP 変数(<code>$post</code>)が必要だからです。しかし、この変数に''手動で''値を与え、このタグをちゃんと使えるようにもできます。
53行目: 168行目:
 
カテゴリ '''17''' に属する投稿のときはテンプレートとして <code>single2.php</code> を使い、それ以外では <code>single1.php</code> を使います。
 
カテゴリ '''17''' に属する投稿のときはテンプレートとして <code>single2.php</code> を使い、それ以外では <code>single1.php</code> を使います。
  
== <span id="Parameters">パラメータ</span> ==
+
以上:古い説明を一旦コメントアウト by bono -->
 
+
; category_id
+
: (整数) 検査したいカテゴリのカテゴリID。パタメータは、整数むき出しでも文字列として書いてもどちらでも構いません:
+
:*<code>in_category(5)</code>
+
:*<code>in_category('5')</code>
+
 
+
==プラグインオプション==<!-- Plugin Options -->
+
 
+
Eventually, someone will make a clever plugin that will do all of this automatically.  At that point this example will become obsolete. However, the [http://boren.nu/downloads/custom_post_templates.phps Custom Post Templates Plugin] allows for creation of templates for single posts.  It also shows an example of how to add a template which is used for ''all'' posts in a given category, not just a single post.  That example is commented out in the plugin by default but can be easily implemented by uncommenting the appropriate lines.
+
  
 
== 外部資料 ==
 
== 外部資料 ==
68行目: 174行目:
 
* [http://www.php.net/manual/ja/language.operators.php PHPマニュアル &raquo; 第15章 演算子]
 
* [http://www.php.net/manual/ja/language.operators.php PHPマニュアル &raquo; 第15章 演算子]
  
{{原文|Function Reference/in category|46195}}<!-- 07:55, 16 April 2007 Dspt 版 -->
+
{{原文|Function Reference/in_category|83060}}<!-- 23:19, 15 February 2010 BryceBubbles 版 -->
  
 
== 関連 ==<!-- Related -->
 
== 関連 ==<!-- Related -->

2010年4月10日 (土) 23:36時点における版

説明

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

in_category() は、投稿に直接割り当てられているカテゴリー(新規投稿/編集でチェックしたカテゴリー)のみを考慮します。そのカテゴリーの親は考慮しません(Testing if a post is in a descendant category も参考にしてください)。

このタグは、The Loop 内で現在の投稿、あるいは (Version 2.7 以降で)単一投稿リクエストの場合 Loop 外でテストします。テストしたい投稿を指定すれば、どこでも使用できます。

使い方

例えば、現在処理中(ページを生成中)の投稿が、あるカテゴリID に属するときにのみ、特定の PHPHTML を動作させたい場合には、これで 'category_id' を指定します。

<?php if ( in_category( $category, $_post ) ): ?>
  // ここにカテゴリ特有の PHP/HTML を書く
<?php endif; ?>

パラメータ

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

戻り値

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

  • Version 2.5 以降では、カテゴリー名でカテゴリーを指定できます。
  • Version 2.7 以降では、カテゴリースラッグでカテゴリーを指定できます。
  • Version 2.7 以降では、複数のカテゴリーについてチェックできます。
  • Version 2.7 以降では、(単一投稿クエリでは) WordPress Loop の外で使用できます。
  • Version 2.7 以降では、(現在の投稿だけでなく)任意の投稿を指定してテストできます。

用例

Loop 内で現在の投稿をテストする

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

<?php 
if ( in_category( 'pachoderms' )) {
	// They have long trunks...
} elseif ( in_category( array( 'Tropical Birds', 'small-mammals' ) )) {
	// They are warm-blooded...
} else {
	// & c.
}
?>

Loop 外で現在の投稿をテストする

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

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

<?php
if ( in_category('fruit') ) {
	include 'single-fruit.php';
} elseif ( in_category('vegetables') ) {
	include 'single-vegetables.php';
} else {
	// Continue with normal Loop
	if ( have_posts() ) : while ( have_posts() ) : the_post();
	// ...
}
?>

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

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

カテゴリーアーカイブを表示するとき、あるいは query_posts()get_posts() でカテゴリーの投稿を表示するとき、WordPress は特定のカテゴリーに加えて子カテゴリーを呼び出します。しかし in_category() は投稿に割り当てられたカテゴリーかどうかをテストし、親カテゴリーを対象としません。

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

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

<?php if ( in_category( array( 'fruits', 'apples', 'bananas', 'cantaloupes', 'guavas', /*etc*/ ) )) {
	// These are all fruits
}
?>

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

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

 // Post is assigned to "fruit" category or any descendant of "fruit" category?
<?php if ( in_category( 'fruit' ) || post_is_in_descendant_category( 11 ) ) {
	// These are all fruits…
}
?>

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

 post_is_in_descendant_category( get_term_by( 'name', 'fruit', 'category' ) )

post_is_in_descendant_category 関数

<?php
/**
 * Tests if any of a post's assigned categories are descendants of target categories
 *
 * @param int|array $cats The target categories. Integer ID or array of integer IDs
 * @param int|object $_post The post. Omit to test the current post in the Loop or main query
 * @return bool True if at least 1 of the post's categories is a descendant of any of the target categories
 * @see get_term_by() You can get a category by name or slug, then pass ID to this function
 * @uses get_term_children() Passes $cats
 * @uses in_category() Passes $_post (can be empty)
 * @version 2.7
 * @link http://codex.wordpress.org/Function_Reference/in_category#Testing_if_a_post_is_in_a_descendant_category
 */
function post_is_in_descendant_category( $cats, $_post = null )
{
	foreach ( (array) $cats as $cat ) {
		// get_term_children() accepts integer ID only
		$descendants = get_term_children( (int) $cat, 'category');
		if ( $descendants && in_category( $descendants, $_post ) )
			return true;
	}
	return false;
}
?>


外部資料

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

関連

カテゴリータグ: 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()


テンプレートタグへの PHP 関数型パラメータの渡し方関数リファレンステンプレートタグ目次もご覧ください。