Template personalizzato per una categoria specifica
Qual è il modo migliore (in termini di prestazioni e struttura del codice) per creare un template personalizzato per un Post WordPress che appartiene a una categoria specifica? Ho scoperto che non è possibile utilizzare semplicemente single-catname.php
.
Finora ho provato due modi per modificare il template. Ma quale di questi (o un altro) è il migliore?
MODIFICA:
Qualche idea su come includere anche tutte le sottocategorie/categorie padre e così via? Mi sono reso conto che al momento mostra solo la categoria principale...
1. Aggiunto a functions.php
function get_custom_cat_template($single_template) {
global $post;
if ( in_category( 'movies' )) {
$single_template = dirname( __FILE__ ) . '/single-movies.php';
}
return $single_template;
}
add_filter( "single_template", "get_custom_cat_template" ) ;
2. Inserito il seguente codice in single.php (al posto di tutto l'altro codice) e creato un single-template.php
(con il codice da single.php) e un single-movies.php
personalizzato
<?php
if(has_term('movies', 'category', $post)) {
get_template_part('single-movies', 'movies');
} else {
// usa il file template predefinito single-template.php
get_template_part('single-template');
}
?>

Dal mio commento all'OP
La mia opinione, usa ciò con cui ti trovi a tuo agio. Se ci sono differenze di prestazioni saranno minime/irrilevanti. La mia preferenza, usa il filtro
Venendo alla tua vera preoccupazione/domanda, secondo me l'approccio migliore sarà utilizzare l'ID della categoria genitore e lavorare da lì. Sarà il metodo meno dispendioso in termini di risorse. Il reverse engineering può diventare uno spreco di risorse piuttosto inutile.
Usa get_categories
per ottenere le categorie figlie dalla categoria data. Puoi utilizzare uno dei due parametri, parent
o child_of
parent (intero)
Mostra solo categorie che sono discendenti diretti (cioè solo figli) della categoria identificata dal suo ID. Questo NON funziona come il parametro 'child_of'. Non c'è un valore predefinito per questo parametro. [In 2.8.4]
child_of (intero)
Mostra tutte le categorie che sono discendenti (cioè figli e nipoti) della categoria identificata dal suo ID. Non c'è un valore predefinito per questo parametro. Se il parametro viene utilizzato, il parametro hide_empty viene impostato su false.
Una volta ottenute queste, usa wp_list_pluck
per ottenere i campi catID, nome o slug dall'array di categorie restituito. Questo array verrà utilizzato per verificare se un post appartiene a una di queste categorie. Puoi usare has_category
o in_category
Ecco come puoi estendere il tuo codice per assicurarti che i post appartenenti alla categoria genitore o ai suoi discendenti utilizzino il template specificato
add_filter( 'single_template', function ( $single_template ) {
$parent = '21'; //Cambia con il tuo ID di categoria
$categories = get_categories( 'child_of=' . $parent );
$cat_names = wp_list_pluck( $categories, 'name' );
if ( has_category( 'movies' ) || has_category( $cat_names ) ) {
$single_template = dirname( __FILE__ ) . '/single-movies.php';
}
return $single_template;
}, PHP_INT_MAX, 2 );

Qualche feedback su questo? Sarebbe apprezzato (e di buona educazione) se potessi lasciare un feedback alle tue domande aperte. Non gioverebbe solo a te, ma anche agli altri utenti che trovano le tue domande tramite i motori di ricerca. Abbandonare semplicemente le tue domande come hai fatto potrebbe portare altri utenti a ignorare le tue domande in futuro. Per favore aiutaci (e te stesso) a mantenere questo sito e le tue domande costruttive. Grazie per la comprensione :-)

passo 1: Crea o copia content-single.php e crea un nuovo file. Esempio: content-tuaCategoria.php
passo 2: Apri single.php e sostituisci get_template_part('content','single');
con il seguente codice
if(is_category('tuaCategoria')){
get_template_part('content','tuaCategoria');
}else{
get_template_part('content','single.php');
}
Il parametro può essere l'ID della Categoria, il Titolo della Categoria, lo Slug della Categoria oppure un Array di ID, nomi e slug.

Questo è un modo conveniente per farlo, trovato qui incolla questo codice nel tuo file functions.php
// Template personalizzato per singoli articoli in base alla categoria
// https://halgatewood.com/wordpress-custom-single-templates-by-category
add_filter('single_template', 'check_for_category_single_template');
function check_for_category_single_template( $t )
{
foreach( (array) get_the_category() as $cat )
{
if ( file_exists(STYLESHEETPATH . "/single-category-{$cat->slug}.php") ) return STYLESHEETPATH . "/single-category-{$cat->slug}.php";
if($cat->parent)
{
$cat = get_the_category_by_ID( $cat->parent );
if ( file_exists(STYLESHEETPATH . "/single-category-{$cat->slug}.php") ) return STYLESHEETPATH . "/single-category-{$cat->slug}.php";
}
}
return $t;
}
per maggiori informazioni visita https://halgatewood.com/wordpress-custom-single-templates-by-category

function get_custom_cat_template($single_template) {
global $post;
if ( in_category( 'nome-categoria' )) {
$single_template = dirname( __FILE__ ) . '/single-template.php';
}
return $single_template;
}
add_filter( "single_template", "get_custom_cat_template" ) ;

LE SOLUZIONI VECCHIE NON FUNZIONANO PER I NUOVI TEMPLATE DI WORDPRESS (BLOCK TEMPLATES)?
Per chi arriva qui da Google dopo il 2022:
Se stai lavorando con i block templates, il nuovo sistema di template per WP, dove i file dei template non sono più file .php ma semplici file .html contenenti codici di blocchi, puoi usare questa soluzione:
Basta creare single-post-[slug della categoria]-article.html. Funziona.
Più precisamente, questa è l'ordine in cui WordPress cerca i file dei block template per i singoli post:
- single-post-[slug della categoria]-article.html
- single-post.html
- single.html
