Post Singolo Personalizzato per Categoria in WordPress

15 ago 2012, 17:31:25
Visualizzazioni: 19.5K
Voti: 6

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?

0
Tutte le risposte alla domanda 2
0
11

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.

15 ago 2012 18:02:05
0

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.

13 lug 2013 22:35:16