WordPress 中文文档
Function Reference/in category
出自WordPress Chinese 中文文档
wordpress.org.cn
目录 |
Description
Tests if the current post (or any specified post) is assigned to any of the specified categories.
ttin_category()/tt considers only the categories a post is directly assigned to (the checked categories in emWrite/Edit Post/em panel), not the parents of the assigned categories (but see Testing if a post is in a descendant category below).
This tag can be used to test the current post within The Loop or (since Version 2.7) outside the Loop during a single post request. You can use it anywhere if you specify which post you want to test.
Usage
%%%?php in_category( $category, $_post ) ?%%%
Parameters
- tt$category/tt
- (mixed) (required) One or more categories specified by ID (integer), name or slug (string), or an array of these
- Default: Nonenoinclude
div class=template-description style=padding: 0 1.5em; border: 1px solid #eeeeee; background-color: #f9f9f9
Notes
This template is for standardizing how parameters look in the Function Reference and in Template Tags. Here is an example of this template being called: prenowiki已侦测回归模板: Template:Parameter/nowiki/pre 已侦测回归模板: Template:Parameter
The usage of this template is below: prenowiki已侦测回归模板: Template:Parameter/nowiki/pre Let's take a closer look at the parameters..
- name
- The name of the parameter.
- datatype
- The datatype that should be given for this parameter when called.
- string
- integer
- boolean
- mixed
- description
- A short description of the parameter.
- importance
- Set this parameter to optional if the parameter is optional. Otherwise, do not declare this parameter—it defaults to required.
- required
- optional
- default
- If this parameter is optional, ttdefault/tt is the value that will be used if the parameter is not declared.
wordpress.org.cn /div /noinclude
- tt$_post/tt
- (mixed) (optional) The post (integer ID or object). Defaults to the current post in the Loop or the post in the main query.
- Default: Nonenoinclude
div class=template-description style=padding: 0 1.5em; border: 1px solid #eeeeee; background-color: #f9f9f9
Notes
This template is for standardizing how parameters look in the Function Reference and in Template Tags. Here is an example of this template being called: prenowiki已侦测回归模板: Template:Parameter/nowiki/pre 已侦测回归模板: Template:Parameter
The usage of this template is below: prenowiki已侦测回归模板: Template:Parameter/nowiki/pre Let's take a closer look at the parameters..
- name
- The name of the parameter.
- datatype
- The datatype that should be given for this parameter when called.
- string
- integer
- boolean
- mixed
- description
- A short description of the parameter.
- importance
- Set this parameter to optional if the parameter is optional. Otherwise, do not declare this parameter—it defaults to required.
- required
- optional
- default
- If this parameter is optional, ttdefault/tt is the value that will be used if the parameter is not declared.
wordpress.org.cn /div /noinclude
Return Values
- (boolean)
- Whether the post is assigned to any of the specified categories.
Notes
- Since Version 2.5, you can specify categories by name.
- Since Version 2.7, you can specify categories by slug.
- Since Version 2.7, you can check against several categories.
- Since Version 2.7, you can use this function outside the WordPress Loop (during a single post query, presumably)
- Since Version 2.7, you can specify any post to test (not just the current one).
Examples
Testing the current post within the Loop
ttin_category()/tt is often used to take different actions within the Loop depending on the current post's category, e.g.
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
Testing the current post outside the Loop
During a request for an individual post (usually handled by the ttsingle.php/tt template), you can test that post's categories even before the Loop is begun.
You could use this to switch templates like so:
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
(The 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.)
Testing if a post is in a descendant category
When showing a category archive, or showing a category's posts via ttquery_posts()/tt or ttget_posts()/tt, WordPress retrieves posts from the specified category emand/em any descendant (child) categories, but ttin_category()/tt tests only against a post's assigned categories, not ancestors (parents) of those categories.
For example, if you have a post assigned to the subcategory emFruit rarr; Bananas/em and not the category emFruit/em, the emFruit/em category archive will show the Bananas post, but calling codein_category('fruit')/code for that post always returns ttfalse/tt.
You can list both the ancestor category and every possible descendant category, e.g.,
pre?php if ( in_category( array( 'fruits', 'apples', 'bananas', 'cantaloupes', 'guavas', /*etc*/ ) )) { // These are all fruits } ?/pre
but you'd have to edit the code every time you moved or added any of the Fruit categories.
A more-flexible method is to use or adapt the ttpost_is_in_descendant_category/tt function defined below (you need to copy the function definition below into a template, plugin, or theme functions file before calling it). You can use it together with ttin_category()/tt like this (in this example 11 is the Fruit category's ID number):
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
If you'd rather refer to the category by name you can use, e.g.,
post_is_in_descendant_category( get_term_by( 'name', 'fruit', 'category' ) )
post_is_in_descendant_category function
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
Related
the_category, the_category_rss, single_cat_title, category_description, wp_dropdown_categories, wp_list_categories, get_the_category, get_category_parents, get_category_link, is_category, in_category
includeonlydiv style=clear:both; background-color:#F7F7F7; border:1px solid #CCCCCC; color:#000000; padding:7px; margin:0.5em auto 0.5em auto; vertical-align:middle;See also index of Function Reference and index of Template Tags./div/includeonlynoinclude
Description
This Template is used by Codex:Template Messages.
Usage
pre 已侦测回归模板: Template:Message /pre
Result
已侦测回归模板: Template:Message
/noinclude

