Template diverso per sottocategorie
Vorrei avere un template diverso per categorie e sottocategorie Il template per le categorie è impostato in categories.php È possibile in qualche modo caricare il template per le sottocategorie da subcategories.php o qualcosa di simile?

La gerarchia dei template ha dei filtri per tutti i tipi di template. Qui possiamo usare category_template
, verificare se la categoria corrente ha un genitore e caricare il file subcategory.php
in quel 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' );

Penso che sia esattamente quello che sto cercando. Dove devo inserire il codice?

Nel file functions.php
del tuo tema oppure in un plugin.

devi semplicemente sostituire subcategory.php con il file che vuoi diventare il template genitore

@Djanym Riguardo la tua modifica suggerita per testare prima isset( $cat )
: Apprezzo generalmente la cautela, ma in quali circostanze category_template può essere chiamato quando get_queried_object() è null?

Ho modificato il tuo codice per aggiungere più funzionalità. Per i casi in cui qualcuno volesse avere un template diverso per ogni sottocategoria. Ad esempio, se hai le categorie organizzate in questo modo:
- continente
- paese
- città
- paese
E hai bisogno di un template diverso per la città. Per prima cosa controlliamo se la città ha una sottocategoria, se non ce l'ha carichiamo il template per la città. Il resto del codice serve per verificare se una categoria ha un genitore.
// Template diverso per le sottocategorie
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-country-city.php' );
} elseif( 0 < $cat->category_parent ) {
$template = locate_template( 'category-country.php' );
}
return $template;
}
add_filter( 'category_template', 'wpd_subcategory_template' );
