How to Load Different Templates for Different Categories in WordPress
In WordPress development, you often need to customize page templates for different post categories (parent or child) to achieve distinct designs and functionality. The core principle is to use WordPress conditional functions to load the appropriate template file based on the current post's category.
Core Function: in_category()
The in_category() function checks if the current post belongs to a specified category. It can accept a category ID or slug and can be used both inside and outside the main WordPress Loop.
Method 1: Category Archive Template
To assign different templates for different category archive pages (e.g., category.php), use the following logic in your theme's category.php file:
<?php
if ( in_category( array( 2, 3 ) ) ) { // Multiple category IDs
get_template_part( 'category-product' );
} elseif ( in_category( 7 ) ) { // Single category ID
get_template_part( 'category-case' );
} else { // Default template for all other categories
get_template_part( 'category-default' );
}
?>
Code Explanation:
in_category( array( 2, 3 ) ): Checks if the post belongs to category ID 2 or 3.get_template_part( 'category-product' ): Loads the template part file namedcategory-product.php.- Create the corresponding template files in your theme directory, e.g.,
category-product.php,category-case.php,category-default.php.
How to Get Category ID or Slug
In the WordPress admin under Posts → Categories, hover over a category name. The browser status bar will show a link like .../term.php?taxonomy=category&tag_ID=2 where tag_ID=2 is the category ID. The slug can be viewed and edited directly in the category edit screen.
Using Category Slugs for Conditional Checks
The in_category() function also accepts category slugs, which is more stable when migrating themes or if category IDs change.
in_category( 'themes' ) // Check for a single slug
in_category( array( 'themes', 'plugins', 'develop' ) ) // Check for multiple slugs
Method 2: Single Post Template
The same logic can be applied to single post pages (single.php) to use different templates for posts in different categories.
Add this to your theme's single.php file:
<?php
if ( in_category( array( 2, 3 ) ) ) { // Multiple category IDs
get_template_part( 'single-product' );
} elseif ( in_category( 7 ) ) { // Single category ID
get_template_part( 'single-case' );
} else { // Default template for all other categories
get_template_part( 'single-default' );
}
?>
Then create the corresponding template files: single-product.php, single-case.php, single-default.php.
Advanced Tips and Considerations
- Child Category Inheritance: By default,
in_category()only checks direct categories. To make a parent category's template apply to all its children, you need to check for the parent ID separately or use thehas_category()function. - Performance: Calling
in_category()multiple times within a loop can impact performance. For complex conditions, evaluate once before the loop and store the result in a variable. - Template Hierarchy: WordPress natively supports category-specific templates via file naming, e.g.,
category-{slug}.phporcategory-{id}.php. The method described here offers more flexible programmatic control, suitable for complex logic or sharing templates across categories.
Using these methods, you can easily implement different page templates for different categories in your WordPress site, creating a more personalized and functional website.