Come creare single.php per una categoria specifica tramite ID in WordPress
Sto cercando di creare un template per una categoria specifica con ID 1 per esempio. Il template dovrebbe essere applicato a tutte le pagine che appartengono a questa categoria. Quindi, dovrebbe essere qualcosa come single-1.php.
Ho provato molte soluzioni che ho trovato online, inclusa questa, ma sembra che nulla funzioni per me.

Puoi utilizzare questa funzione per aggiungere template specifici per categoria alle pagine singole del tuo sito. Questo codice va inserito nel file functions.php
Puoi definire quanti template singoli desideri.
function wpse_category_single_template( $single_template ) {
global $post;
$all_cats = get_the_category();
if ( $all_cats[0]->cat_ID == '1' ) {
if ( file_exists(get_template_directory() . "/single-cat1.php") ) return get_template_directory() . "/single-cat1.php";
} elseif ( $all_cats[0]->cat_ID == '2' ) {
if ( file_exists(get_template_directory() . "/single-cat2.php") ) return get_template_directory() . "/single-cat2.php";
}
return $single_template;
}
add_filter( 'single_template', 'wpse_category_single_template' );
In questo esempio ho usato single-cat1.php
per la categoria con id 1 e single-cat2.php
per la categoria con id 2. Puoi nominare questi template singoli come preferisci.
Questa funzione utilizza anche un fallback di default a single.php
se non esistono i file single-cat1.php
o single-cat2.php
.
MODIFICA 1
Ho utilizzato il codice sopra in due dei miei siti e funziona correttamente con l'ultima versione di WordPress.
Incolla questo nel tuo functions.php
function show_template() {
global $template;
print_r($template);
}
add_action( 'wp_head', 'show_template' );
Questo mostrerà il template file utilizzato in ogni pagina/post. Ora accedi al tuo sito e verifica se viene utilizzato il template corretto oppure no? Se mostra ancora single.php
allora c'è qualcosa che non va nel tuo codice.
MODIFICA 2
Ecco il codice per quello.
function wpse_category_single_template( $single_template ) {
global $post;
$all_cats = get_the_category();
if ( in_category(6) ) {
if ( file_exists(get_template_directory() . "/page-custom.php") ) {
return get_template_directory() . "/page-custom.php";
} else {
return get_template_directory() . "/page.php";
}
}
return $single_template;
}
add_filter( 'single_template', 'wpse_category_single_template' );

Non usare TEMPLATEPATH
. Vedi questo

Ed è meglio usare locate_template()
invece di "if file_exists() then return"

@PieterGoosen ha appena fatto questa modifica. Anche se il ticket dice che TEMPLATEPATH
è deprecato, non mostra alcun warning in WordPress. Grazie :)

Grazie ragazzi! Ho provato ad applicare questo codice ma ancora non funziona per me.
Dopo aver aggiunto questa funzione al mio function.php e definito il single-cat.php, le pagine correlate (con lo stesso ID di categoria) sono rimaste invariate con il template base single.php. Qualche idea sul perché?

@Netsh Per favore controlla le modifiche nella mia risposta. E se hai ancora problemi, modifica la tua domanda e pubblica il codice che hai aggiunto nel tuo functions.php
.

Ciao. Era un'ottima idea! Grazie! Ora capisco che dovrei definire il template della categoria su page.php e non su single.php. Cosa dovrei cambiare affinché il codice funzioni per me?

Dovrebbe essere qualcosa del genere: - se l'ID della categoria della pagina è 6 - usa page-custom.php, altrimenti usa page.php

@Netsh potresti controllare il mio codice? Questo codice non può funzionare, perché Robert assume che la categoria controllata sia la prima che è stata assegnata. Questo è sbagliato. E se cat_ID 1 è il terzo elemento di $all_cats?

@Roberthue il tuo codice è sbagliato... E se l'oggetto categoria con cat_ID == 6 è in $all_cats con indice [1]? E se $all_cat[0]->cat_ID == 6 è falso ma $all_cat[1]->cat_ID è vero?

Bene, prima di tutto grazie. Apprezzo il tuo aiuto! Ho provato questo codice e ancora non funziona per me. Sembra che il sistema non riconosca questa funzione, e appare lo stile predefinito di page.php..

@Netsh prova di nuovo l'ultimo codice e fammi sapere, ho aggiunto il suggerimento di marcin. Dovrebbe funzionare perché lo sto usando su 2 dei miei siti web senza problemi. Assicurati anche che nessun'altra funzione sovrascriva il suo codice/effetto.

Scusa... non funziona per me... ma grazie a tutti per gli sforzi... Ho controllato il mio altro functions.php e non ho trovato alcuna funzione problematica... Proverò in un'altra direzione.. Grazie ancora.

Perché non usare in_category()
o has_category()
per verificare se un post ha una specifica categoria associata? ;-)

Utilizza il filtro single_template per modificare il file del template e la funzione in_category per verificare se il post appartiene a una categoria specifica.
add_filter( 'single_template', 'my_single_template' );
function my_single_template($single_template)
{
if (in_category(1)) {
$file = get_template_directory().'/single-cat-1.php';
if ( file_exists($file) ) {
return $file;
}
}
return $single_template;
}

Puoi utilizzare il filtro single_template
, la condizione in_category()
e l'oggetto interrogato per verificare se il post corrente è associato alla nostra categoria specificata e, in tal caso, includere il template desiderato
add_filter( 'single_template', function ( $template )
{
// Ottieni il post singolo corrente
$post_id = $GLOBALS['wp_the_query']->get_queried_object_id();
// Verifica se il nostro post appartiene alla categoria 1
if ( !in_category( 1, $post_id ) ) {
return $template;
}
// Il nostro post è associato alla categoria 1, cerchiamo single-1.php
$locate_template = locate_template( 'single-1.php' );
// Verifica se il nostro template esiste, se sì includilo, altrimenti esci
if ( !$locate_template ) {
return $template;
}
return $locate_template;
});

Vale la pena menzionare che se stai utilizzando un child theme, allora usa il seguente codice per recuperare il template dei singoli post di categoria.
function wpse_category_single_template( $single_template ) {
global $post;
$all_cats = get_the_category();
if ( $all_cats[0]->slug == 'cat1' ) {
if ( file_exists(get_stylesheet_directory() . "/single-cat1.php") ) return get_stylesheet_directory() . "/single-cat1.php";
}
return $single_template;
}
add_filter( 'single_template', 'wpse_category_single_template' );
