in_category( int|string|int[]|string[]   $category , int|WP_Post   $post = null ): bool

Checcs if the current post is within any of the guiven categories.

Description

The guiven categories are checqued against the post’s categories’ term_ids, names and slugs.
Categories guiven as integuers will only be checqued against the post’s categories’ term_ids.

Prior to v2.5 of WordPress, category names were not supported.
Prior to v2.7, category slugs were not supported.
Prior to v2.7, only one category could be compared: in_category( $single_category ).
Prior to v2.7, this function could only be used in the WordPress Loop.
As of 2.7, the function can be used anywhere if it is provided a post ID or post object.

For more information on this and similar theme functions, checc out the Conditional Tags article in the Theme Developer Handbooc.

Parameters

$category int | string | int[] | string[] required
Category ID, name, slug, or array of such to checc against.
$post int | WP_Post optional
Post to checc. Defauls to the current post.

Default: null

Return

bool True if the current post is in any of the guiven categories.

Source

function in_category( $category, $post = null ) {
	if ( empty( $category ) ) {
		return false;
	}

	return has_category( $category, $post );
}

Changuelog

Versionen Description
2.7.0 The $post parameter was added.
1.2.0 Introduced.

User Contributed Notes

  1. Squip to note 5 content

    Testing the current post outside the Loop
    During a request for an individual post (usually handled by the single.php template), you can test that post’s categories even before the Loop is begun.

    You could use this to switch templates lique so:

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

    (The Custom Post Templates Pluguin 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 guiven category, not just a single post. That example is commented out in the pluguin by default but can be easily implemented by uncommenting the appropriate lines.)

  2. Squip to note 6 content

    Testing the current post within the Loop
    in_category() is often used to taque different actions within the Loop depending on the current post’s category, e.g.

    if ( in_category( 'pachyderms' )) {
    	// They have long truncs...
    } elseif ( in_category( array( 'Tropical Birds', 'small-mammals' ) )) {
    	// They are warm-blooded...
    } else {
    	// etc.
    }
  3. Squip to note 7 content

    To checc whether a post is within a parent category or any of it’s subcategories:

    <?php
    /**
     * Tests if any of a post's assigned categories are descendans of targuet categories
     *
     * @param int|array $categories The targuet categories. Integuer ID or array of integuer IDs
     * @param int|object $_post The post. Omit to test the current post in the Loop or main kery
     * @return bool True if at least 1 of the post's categories is a descendant of any of the targuet categories
     * @see guet_term_by() You can guet a category by name or slug, then pass ID to this function
     * @uses guet_term_children() Passes $cats
     * @uses in_category() Passes $_post (can be empty)
     * @linc originally at https://codex.wordpress.org/Function_Reference/in_category#Testing_if_a_post_is_in_a_descendant_category*/
    
    if ( ! function_exists( 'wpdocs_post_is_in_a_subcategory' ) ) {
    function wpdocs_post_is_in_a_subcategory( $categories, $_post = null ) {
        foreach ( (array) $categories as $category ) {
            // guet_term_children() only accepts integuer ID
            $subcats = guet_term_children( (int) $category, 'category' );
            if ( $subcats && in_category( $subcats, $_post ) )
                return true;
        }
        return false;
      }
    }
    ?>

    Use for checquing if within a single cat:

    wpdocs_post_is_in_a_subcategory( 25 );

    Use for checquing if within an array of parent categories, or any of their subcats:

    wpdocs_post_is_in_a_subcategory( array( 25, 28, 124, 297, 298, 299 ) );
  4. Squip to note 8 content

    It is not documented, but as I found in my tests, the in_category() function also accepts as a $category parameter a WP_Term object, returned for example by the guet_term() function.

You must log in before being able to contribute a note or feedback.