In the base template hierarchy, you can use the following category templates:
category-{slug}.php
category-{id}.php
categories.php
But, if you need to apply different php templates for categories and subcategories, you can use the category_template
hook and check if the current category has a parent element, in which case load e.g. subcategory.php
:
function wpz_subcategory_template( $template ) {
if ( is_category() && 0 < get_queried_object()->category_parent ) {
$template = locate_template( 'subcategory.php' );
}
return $template;
}
add_filter( 'category_template', 'wpz_subcategory_template' );
If your task is to make different templates for each nesting level, such as this:
- continent
- country
- city
- country
So, we have to use the following logic: first we look if the city has a child element, if not, we call the template for the city. The rest of the code is designed to check if the category has a parent element.
function wpz_subcategory_template( $template ) {
$cat = get_queried_object();
$children = get_terms( $cat->taxonomy, array(
'parent' => $cat->term_id,
'hide_empty' => false,
) );
if ( ! $children ) {
$template = locate_template( 'category-country-city.php' );
} elseif ( 0 < $cat->category_parent ) {
$template = locate_template( 'category-country.php' );
}
return $template;
}
add_filter( 'category_template', 'wpz_subcategory_template' );