Plantilla diferente para subcategorías en WordPress
Me gustaría tener una plantilla diferente para categorías y subcategorías. La plantilla de categorías está configurada en categories.php ¿Es posible de alguna manera cargar la plantilla de subcategorías desde subcategories.php o algo similar?

La jerarquía de plantillas tiene filtros para todos los tipos de plantillas. Aquí podemos usar category_template
, verificar si la categoría actual tiene un padre, y cargar el archivo subcategory.php
en ese caso:
function wpd_subcategory_template( $template ) {
$cat = get_queried_object();
if ( isset( $cat ) && $cat->category_parent ) {
$template = locate_template( 'subcategory.php' );
}
return $template;
}
add_filter( 'category_template', 'wpd_subcategory_template' );

Creo que esto es exactamente lo que estoy buscando. ¿Dónde necesito poner el código?

En el archivo functions.php
de tu tema o en un plugin.

solo necesitas reemplazar subcategory.php por el archivo que deseas que sea la plantilla padre

@Djanym RE tu edición sugerida para probar isset( $cat )
primero: En general aprecio la precaución, pero ¿en qué circunstancias se puede llamar a category_template cuando get_queried_object() es nulo?

He editado tu código para añadir más funcionalidad. Para los casos en los que alguien quisiera tener una plantilla diferente para cada categoría hija. Por ejemplo, si tienes categorías organizadas así:
- continente
- país
- ciudad
- país
Y necesitas una plantilla diferente para ciudad. Primero comprobamos si ciudad tiene hijos, si no los tiene cargamos la plantilla para ciudad. El resto del código es para comprobar si una categoría tiene un padre.
// Plantilla diferente para subcategorías
function wpd_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-pais-ciudad.php' );
} elseif( 0 < $cat->category_parent ) {
$template = locate_template( 'category-pais.php' );
}
return $template;
}
add_filter( 'category_template', 'wpd_subcategory_template' );
