Post Singolo Personalizzato per Categoria in WordPress
Sto cercando di familiarizzare con la terminologia e il funzionamento di WordPress, quindi scusate se sarò impreciso.
Sto configurando un sito completo utilizzando WordPress e un template personalizzato, basandomi sulla struttura di TwentyTen.
Sto cercando di utilizzare il più possibile il Post Type standard "post", e le pagine "elenco" principali dovrebbero essere semplicemente le pagine di categoria.
Una delle categorie è "work"
Sono riuscito a personalizzare queste pagine creando i file personalizzati category-work.php e loop-work.php. Ma come posso creare un post singolo personalizzato in base alla categoria?
Sembra che creare un single-work.php cercherebbe un custom post type chiamato "work". Esiste un modo per creare una versione modificata di single.php che venga attivata in base alla categoria o allo slug della categoria?
Rendi il tuo single.php come segue:
<?php
$post = $wp_query->post;
if ( in_category( 'work' ) ) {
include( TEMPLATEPATH.'/single-work-cat.php' );
}
else {
include( TEMPLATEPATH.'/single-generic.php' );
}
?>
e crea single-work-cat.php come template che desideri mostrare per i post della categoria 'work', e single-generic.php come template da mostrare in tutti gli altri casi. Per più categorie basta aggiungere ulteriori istruzioni elseif e creare nuovi template single.

Mi rendo conto che questa è una domanda vecchia, ma nel caso qualcun altro la trovi cercando lo stesso argomento, tieni presente che non dovresti utilizzare istruzioni include nei tuoi temi WordPress. Usa sempre get_template_part() o locate_template() invece.
(vedi http://make.wordpress.org/themes/guidelines/guidelines-theme-check/)
Il seguente codice utilizza i filtri di WordPress per completare il compito e cercherà automaticamente i template per tutte le categorie:
/**
* Sostituisci "themeslug" con lo slug unico del tuo tema
*
* @see http://codex.wordpress.org/Theme_Review#Guidelines
*/
add_filter( 'single_template', 'themeslug_single_template' );
/**
* Aggiunge considerazioni sulle categorie ai template che WordPress utilizza per i singoli articoli
*
* @global obj $post L'oggetto post predefinito di WordPress. Usato per avere un ID per get_post_type()
* @param string $template Il template attualmente trovato da get_single_template()
* @return string Il nuovo risultato di locate_template()
*/
function themeslug_single_template( $template ) {
global $post;
$categories = get_the_category();
if ( ! $categories )
return $template; // non c'è bisogno di continuare se non ci sono categorie
$post_type = get_post_type( $post->ID );
$templates = array();
foreach ( $categories as $category ) {
$templates[] = "single-{$post_type}-{$category->slug}.php";
$templates[] = "single-{$post_type}-{$category->term_id}.php";
}
// ricorda i template predefiniti
$templates[] = "single-{$post_type}.php";
$templates[] = 'single.php';
$templates[] = 'index.php';
/**
* Lascia che WordPress capisca se i template esistono o meno.
*
* @see http://codex.wordpress.org/Function_Reference/locate_template
*/
return locate_template( $templates );
}
Ci sono un paio di punti deboli nel codice. Primo, significa che WordPress esegue locate_template() due volte per i singoli articoli (una volta prima che questa funzione venga eseguita e una volta durante). Secondo, non credo ci sia un modo pulito per dare priorità a quali categorie cercare per prime. Questo significa che se il tuo articolo è in più categorie che hanno template unici per i singoli articoli, non potrai scegliere quale template viene utilizzato.
