Cum să creezi single.php pentru o categorie specifică după ID-ul categoriei
Încerc să creez un template pentru o categorie specifică cu ID-ul 1, de exemplu. Template-ul ar trebui să fie aplicat tuturor paginilor care aparțin acestei categorii. Deci, ar trebui să fie ceva de genul single-1.php.
Am încercat multe soluții pe care le-am găsit pe internet, inclusiv aceasta, dar se pare că nimic nu funcționează pentru mine.

Poți folosi această funcție pentru a adăuga pagini cu șabloane specifice categorii pe site-ul tău. Acest cod se adaugă în functions.php
.
Poți defini câte șabloane specifice dorești.
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' );
Aici am folosit single-cat1.php
pentru categoria cu ID-ul 1 și single-cat2.php
pentru categoria cu ID-ul 2. Poți denumi aceste șabloane cum consideri potrivit.
Această funcție folosește implicit single.php
dacă nu există single-cat1.php
sau single-cat2.php
.
EDITARE 1
Am folosit codul de mai sus pe 2 dintre site-urile mele și funcționează corect pe ultima versiune de WordPress.
Lipește acest cod în functions.php
:
function show_template() {
global $template;
print_r($template);
}
add_action( 'wp_head', 'show_template' );
Aceasta va afișa fișierul de șablon folosit pe fiecare pagină/post. Acum accesează site-ul tău și verifică dacă este folosit fișierul corect de șablon. Dacă în continuare se afișează single.php
, atunci există o problemă cu codul tău.
EDITARE 2
Iată codul tău pentru aceasta:
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' );

Nu folosi TEMPLATEPATH
. Vezi acest link

Și mai bine folosește locate_template()
în loc de "if file_exists() then return"

@PieterGoosen tocmai a făcut această modificare. Deși ticketul spune că TEMPLATEPATH
este depreciat, nu afișează niciun avertisment în WordPress. Mersi :)

Mulțumesc, băieți! Am încercat să aplic acest cod, dar încă nu funcționează pentru mine.
După ce am adăugat această funcție în fișierul meu functions.php și am definit single-cat.php, paginile înrudite (cu același ID de categorie) au rămas neschimbate, folosind șablonul de bază single.php. Aveți idei de ce?

@Netsh Te rog să verifici ediția din răspunsul meu. Și, dacă încă ai probleme, editează-ți întrebarea și postează codul pe care l-ai adăugat în fișierul tău functions.php
.

Salut. A fost o idee grozavă! mulțumesc! acum înțeleg că ar trebui să definesc șablonul de categorie pentru page.php și nu pentru single.php. ce ar trebui să modific ca acest cod să funcționeze pentru mine?

Ar trebui să fie ceva de genul: - dacă ID-ul categoriei paginii este 6 - utilizează page-custom.php, altfel, utilizează page.php

@Netsh poți verifica codul meu? Acest cod nu poate funcționa, deoarece Robert presupune că categoria verificată este prima care a fost atribuită. Acest lucru este greșit. Ce se întâmplă dacă cat_ID 1 este al treilea element din $all_cats?

@Roberthue codul tău este greșit... Ce se întâmplă dacă obiectul de categorie cu cat_ID == 6 se află în $all_cats la indexul [1]? Ce se întâmplă dacă $all_cat[0]->cat_ID == 6 este fals dar $all_cat[1]->cat_ID este adevărat?

Ei bine, în primul rând mulțumesc. Apreciez ajutorul tău! Am încercat acest cod și încă nu funcționează pentru mine. Se pare că sistemul nu recunoaște această funcție și apare stilul implicit al page.php..

@Netsh încearcă din nou ultimul cod și spune-mi, am adăugat sugestia lui marcin. Ar trebui să funcționeze pentru că eu l-am folosit pe 2 dintre site-urile mele fără nicio problemă. De asemenea, asigură-te că nicio altă funcție nu suprascrie codul/efectul său.

Îmi pare rău... nu funcționează pentru mine... dar vă mulțumesc tuturor pentru eforturi.. Am verificat alte fișiere functions.php și nu am găsit nicio funcție problematică.. Voi încerca în altă direcție.. Mulțumesc din nou.

De ce să nu folosești in_category()
sau has_category()
pentru a testa dacă un articol are o anumită categorie atașată ;-)

Folosiți filtrul single_template pentru a schimba fișierul de șablon și funcția in_category pentru a verifica dacă postarea aparține unei categorii.
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;
}

Puteți utiliza filtrul single_template
, condiția in_category()
și obiectul interogat pentru a verifica dacă postarea curentă este atașată categoriei noastre specificate și, dacă da, pentru a include șablonul dorit.
add_filter( 'single_template', function ( $template )
{
// Obținem postarea curentă single
$post_id = $GLOBALS['wp_the_query']->get_queried_object_id();
// Verificăm dacă postarea aparține categoriei 1
if ( !in_category( 1, $post_id ) ) {
return $template;
}
// Postarea este atașată la categoria 1, căutăm single-1.php
$locate_template = locate_template( 'single-1.php' );
// Verificăm dacă șablonul există, dacă da, îl includem, altfel renunțăm
if ( !$locate_template ) {
return $template;
}
return $locate_template;
});

Este important de menționat că dacă utilizați un child theme, atunci folosiți următorul cod pentru a prelua șablonul de post single pentru categorie.
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' );
