Șablon single personalizat pentru o categorie specifică

29 nov. 2014, 12:33:04
Vizualizări: 51.4K
Voturi: 15

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');
}
?>
3
Comentarii

Opinia mea, folosește ceea ce ți se pare confortabil. Dacă există vreo diferență de performanță, aceasta va fi minimală/neimportantă. Preferința mea este să folosești filtrul

Pieter Goosen Pieter Goosen
29 nov. 2014 12:40:43

Mulțumesc pentru răspunsul rapid. Ai vreo idee cum să includ și toate subcategoriile/părinții și așa mai departe? Am realizat acum că afișează doar categoria principală...

NewUser NewUser
29 nov. 2014 12:42:05
Toate răspunsurile la întrebare 5
2
13

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 );
29 nov. 2014 21:33:14
Comentarii

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 :-)

Pieter Goosen Pieter Goosen
14 apr. 2015 09:12:15

Funcționează corect pentru mine. Mulțumesc!

FladeX FladeX
8 aug. 2020 10:35:06
2

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.

1 dec. 2014 05:13:41
Comentarii

in_category() *

Avishay28 Avishay28
19 apr. 2016 12:42:27

Te rog corectează-ți răspunsul

Chris Pink Chris Pink
28 iun. 2024 13:36:09
0

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

18 aug. 2017 08:52:48
0
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" ) ;
24 sept. 2019 11:38:02
1
-1

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:

  1. single-post-[slug categorie]-article.html
  2. single-post.html
  3. single/html
15 mar. 2023 17:03:30
Comentarii

Nu funcționează pe 6.6.2

th00ht th00ht
24 sept. 2024 11:01:37