Postare Personalizată pe Categorii în WordPress
Încerc să înțeleg mai bine terminologia și funcționalitățile WordPress, așa că îmi cer scuze dacă întrebarea mea este prea elementară.
Configurez un site complet utilizând WordPress și un șablon personalizat, bazându-mă pe structura temei TwentyTen.
Încerc să folosesc cât mai mult tipul de postare "post", iar paginile principale de "listare" să fie doar paginile de categorie.
Una dintre categorii este "work" (lucrări)
Am reușit să personalizez aceste pagini creând fișiere custom category-work.php și loop-work.php. Dar cum pot crea o postare individuală personalizată pe categorii?
Se pare că crearea unui fișier single-work.php ar căuta un tip de postare personalizat numit "work". Există vreo metodă de a crea o variantă modificată a single.php care să se activeze în funcție de categorie/slug-ul categoriei?
Faceți ca fișierul single.php să arate astfel:
<?php
$post = $wp_query->post;
if ( in_category( 'work' ) ) {
include( TEMPLATEPATH.'/single-work-cat.php' );
}
else {
include( TEMPLATEPATH.'/single-generic.php' );
}
?>
și faceți single-work-cat.php șablonul pe care doriți să-l afișați pentru articolele din categoria 'work', iar single-generic.php șablonul pentru toate celelalte cazuri. Pentru mai multe categorii, adăugați mai multe declarații elseif și creați noi șabloane single.

Înțeleg că aceasta este o întrebare veche, dar în cazul în care altcineva o găsește în timp ce caută același subiect, fiți conștienți că nu ar trebui să folosiți declarații include în temele WordPress. Utilizați întotdeauna get_template_part() sau locate_template() în schimb.
(vezi http://make.wordpress.org/themes/guidelines/guidelines-theme-check/)
Următorul cod utilizează filtre WordPress pentru a realiza sarcina și va căuta automat șabloane pentru orice și toate categoriile:
/**
* Înlocuiți "themeslug" cu slug-ul unic al temei dumneavoastră
*
* @see http://codex.wordpress.org/Theme_Review#Guidelines
*/
add_filter( 'single_template', 'themeslug_single_template' );
/**
* Adaugă considerente de categorie la șabloanele pe care WordPress le folosește pentru postări individuale
*
* @global obj $post Obiectul implicit WordPress post. Folosit pentru a avea un ID pentru get_post_type()
* @param string $template Șablonul găsit în prezent din get_single_template()
* @return string Rezultatul noului locate_template()
*/
function themeslug_single_template( $template ) {
global $post;
$categories = get_the_category();
if ( ! $categories )
return $template; // nu este nevoie să continuăm dacă nu există categorii
$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";
}
// reține șabloanele implicite
$templates[] = "single-{$post_type}.php";
$templates[] = 'single.php';
$templates[] = 'index.php';
/**
* Lasă WordPress să determine dacă șabloanele există sau nu.
*
* @see http://codex.wordpress.org/Function_Reference/locate_template
*/
return locate_template( $templates );
}
Există câteva puncte slabe în cod. În primul rând, înseamnă că WordPress execută locate_template() de două ori pentru postările individuale (o dată înainte ca această funcție să ruleze și o dată în timpul execuției). În al doilea rând, nu cred că există o modalitate curată de a prioriza care categorii să fie căutate mai întâi. Aceasta înseamnă că, dacă postarea dvs. se află în mai multe categorii care au șabloane unice pentru postări individuale, nu veți putea alege ce șablon să fie utilizat.
