Șablon single personalizat pentru o categorie specifică
Care este cea mai bună modalitate (din punct de vedere al performanței și structurii codului) de a crea un șablon personalizat pentru un articol WordPress care aparține unei categorii specifice? Am realizat că nu poți crea pur și simplu single-catname.php
.
Până acum am încercat două moduri de a schimba șablonul. Dar care dintre ele (sau altă variantă) este cea mai bună?
EDITARE:
Are cineva vreo idee cum să includem toate subcategoriile/categoriile părinte și așa mai departe? Am realizat că momentan arată doar categoria principală...
1. Adăugat în functions.php
function get_custom_cat_template($single_template) {
global $post;
if ( in_category( 'movies' )) {
$single_template = dirname( __FILE__ ) . '/single-movies.php';
}
return $single_template;
}
add_filter( "single_template", "get_custom_cat_template" ) ;
2. Pune următorul cod în single.php (în locul întregului cod existent) și creează un single-template.php
(cu codul din single.php) și un single-movies.php
personalizat
<?php
if(has_term('movies', 'category', $post)) {
get_template_part('single-movies', 'movies');
} else {
// folosește fișierul șablon implicit single-template.php
get_template_part('single-template');
}
?>

Din comentariul meu pentru OP
Opinia mea, folosește ceea ce ți se pare confortabil. Dacă există vreo diferență de performanță, aceasta va fi minimală/irelevantă. Preferința mea este să folosești filtrul
Pentru a aborda întrebarea ta reală, în opinia mea, cea mai bună abordare ar fi să folosești ID-ul categoriei părinte și să lucrezi de acolo. Aceasta va fi cea mai puțin solicitantă din punct de vedere al resurselor. Reverse engineering-ul poate deveni o pierdere inutilă de resurse.
Folosește funcția get_categories
pentru a obține categoriile copil din categoria dată. Poți folosi unul dintre cei doi parametri, fie parent
fie child_of
parent (integer)
Afișează doar categoriile care sunt descendenți direcți (adică doar copii) ai categoriei identificate prin ID. Acest parametru NU funcționează ca 'child_of'. Nu există o valoare implicită pentru acest parametru. [În 2.8.4]
child_of (integer)
Afișează toate categoriile care sunt descendenți (adică copii și nepoți) ai categoriei identificate prin ID. Nu există o valoare implicită pentru acest parametru. Dacă parametrul este utilizat, parametrul hide_empty este setat pe false.
Odată ce ai acestea, folosește wp_list_pluck
pentru a obține câmpurile catID, name sau slug din array-ul returnat de categorii. Acest array va fi folosit pentru a verifica dacă un post aparține uneia dintre aceste categorii. Poți folosi fie has_category
fie in_category
Iată cum poți extinde codul tău pentru a te asigura că posturile care aparțin fie categoriei părinte, fie descendenților săi, folosesc șablonul dat
add_filter( 'single_template', function ( $single_template ) {
$parent = '21'; //Schimbă cu ID-ul tău de categorie
$categories = get_categories( 'child_of=' . $parent );
$cat_names = wp_list_pluck( $categories, 'name' );
if ( has_category( 'movies' ) || has_category( $cat_names ) ) {
$single_template = dirname( __FILE__ ) . '/single-movies.php';
}
return $single_template;
}, PHP_INT_MAX, 2 );

Vreun feedback pe acest subiect? Ar fi apreciat (și bun-simț) dacă puteți lăsa feedback la întrebările voastre deschise. Acest lucru nu v-ar beneficia doar pe voi, ci și pe alți utilizatori care găsesc întrebările voastre prin motoarele de căutare. Pur și simplu abandonarea întrebărilor, așa cum ați făcut-o, ar putea duce la ignorarea acestora de către alți utilizatori în viitor. Vă rugăm să ne ajutați (și pe voi înșivă) să menținem acest site și întrebările voastre constructive. Mulțumesc pentru înțelegere :-)

pasul 1: Creează sau copiază fișierul content-single.php și creează un fișier nou. de exemplu: content-categoriaTa.php
pasul 2: Deschide single.php și înlocuiește get_template_part('content','single');
cu următorul cod
if(is_category('categoriaTa')){
get_template_part('content','categoriaTa');
}else{
get_template_part('content','single.php');
}
Parametrul poate fi ID-ul categoriei, Titlul categoriei, Slug-ul categoriei sau un Array de ID-uri, nume și slug-uri.

Acesta este un mod convenabil de a face asta, găsit aici. Inserează acest cod în fișierul tău function.php
// Șablon personalizat pentru single post după categorie
// https://halgatewood.com/wordpress-custom-single-templates-by-category
add_filter('single_template', 'check_for_category_single_template');
function check_for_category_single_template( $t )
{
foreach( (array) get_the_category() as $cat )
{
if ( file_exists(STYLESHEETPATH . "/single-category-{$cat->slug}.php") ) return STYLESHEETPATH . "/single-category-{$cat->slug}.php";
if($cat->parent)
{
$cat = get_the_category_by_ID( $cat->parent );
if ( file_exists(STYLESHEETPATH . "/single-category-{$cat->slug}.php") ) return STYLESHEETPATH . "/single-category-{$cat->slug}.php";
}
}
return $t;
}
pentru mai multe informații verifică https://halgatewood.com/wordpress-custom-single-templates-by-category

function get_custom_cat_template($single_template) {
global $post;
if ( in_category( 'nume-categorie' )) {
$single_template = dirname( __FILE__ ) . '/single-template.php';
}
return $single_template;
}
add_filter( "single_template", "get_custom_cat_template" ) ;

SOLUȚIILE VECHI NU MAI FUNCȚIONEAZĂ PENTRU NOILE ȘABLOANE WORDPRESS (ȘABLOANE CU BLOCURI)?
Pentru cei care ajung aici de pe Google după 2022:
Dacă lucrați cu șabloane cu blocuri, noul sistem de șabloane pentru WP, unde fișierele de șablon nu sunt .php ci doar .html care includ coduri de blocuri, puteți folosi acest răspuns:
Pur și simplu creați single-post-[slug categorie]-article.html. Funcționează.
Mai precis, aceasta este ordinea în care WP caută fișierele de șablon pentru postările individuale:
- single-post-[slug categorie]-article.html
- single-post.html
- single/html
