Template personalizzato per una categoria specifica

29 nov 2014, 12:33:04
Visualizzazioni: 51.4K
Voti: 15

Qual è il modo migliore (in termini di prestazioni e struttura del codice) per creare un template personalizzato per un Post WordPress che appartiene a una categoria specifica? Ho scoperto che non è possibile utilizzare semplicemente single-catname.php.

Finora ho provato due modi per modificare il template. Ma quale di questi (o un altro) è il migliore?

MODIFICA:

Qualche idea su come includere anche tutte le sottocategorie/categorie padre e così via? Mi sono reso conto che al momento mostra solo la categoria principale...

1. Aggiunto a 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. Inserito il seguente codice in single.php (al posto di tutto l'altro codice) e creato un single-template.php (con il codice da single.php) e un single-movies.php personalizzato

<?php        
if(has_term('movies', 'category', $post)) {      
   get_template_part('single-movies', 'movies');
} else {
   // usa il file template predefinito single-template.php
   get_template_part('single-template');
}
?>
3
Commenti

La mia opinione è di usare quello con cui ti trovi più a tuo agio. Se ci sono differenze di prestazioni saranno minime/irrilevanti. La mia preferenza è di usare il filtro

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

Grazie per la risposta veloce. Hai idea di come includere anche tutte le sotto-categorie/parent e così via? Mi sono accorto che al momento mostra solo la categoria principale...

NewUser NewUser
29 nov 2014 12:42:05
Tutte le risposte alla domanda 5
2
13

Dal mio commento all'OP

La mia opinione, usa ciò con cui ti trovi a tuo agio. Se ci sono differenze di prestazioni saranno minime/irrilevanti. La mia preferenza, usa il filtro

Venendo alla tua vera preoccupazione/domanda, secondo me l'approccio migliore sarà utilizzare l'ID della categoria genitore e lavorare da lì. Sarà il metodo meno dispendioso in termini di risorse. Il reverse engineering può diventare uno spreco di risorse piuttosto inutile.

Usa get_categories per ottenere le categorie figlie dalla categoria data. Puoi utilizzare uno dei due parametri, parent o child_of

parent (intero)

Mostra solo categorie che sono discendenti diretti (cioè solo figli) della categoria identificata dal suo ID. Questo NON funziona come il parametro 'child_of'. Non c'è un valore predefinito per questo parametro. [In 2.8.4]

child_of (intero)

Mostra tutte le categorie che sono discendenti (cioè figli e nipoti) della categoria identificata dal suo ID. Non c'è un valore predefinito per questo parametro. Se il parametro viene utilizzato, il parametro hide_empty viene impostato su false.

Una volta ottenute queste, usa wp_list_pluck per ottenere i campi catID, nome o slug dall'array di categorie restituito. Questo array verrà utilizzato per verificare se un post appartiene a una di queste categorie. Puoi usare has_category o in_category

Ecco come puoi estendere il tuo codice per assicurarti che i post appartenenti alla categoria genitore o ai suoi discendenti utilizzino il template specificato

add_filter( 'single_template', function ( $single_template ) {

    $parent     = '21'; //Cambia con il tuo ID di categoria
    $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
Commenti

Qualche feedback su questo? Sarebbe apprezzato (e di buona educazione) se potessi lasciare un feedback alle tue domande aperte. Non gioverebbe solo a te, ma anche agli altri utenti che trovano le tue domande tramite i motori di ricerca. Abbandonare semplicemente le tue domande come hai fatto potrebbe portare altri utenti a ignorare le tue domande in futuro. Per favore aiutaci (e te stesso) a mantenere questo sito e le tue domande costruttive. Grazie per la comprensione :-)

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

Funziona correttamente per me. Grazie!

FladeX FladeX
8 ago 2020 10:35:06
2

passo 1: Crea o copia content-single.php e crea un nuovo file. Esempio: content-tuaCategoria.php passo 2: Apri single.php e sostituisci get_template_part('content','single'); con il seguente codice

    if(is_category('tuaCategoria')){
        get_template_part('content','tuaCategoria');
    }else{
        get_template_part('content','single.php');
    }

Il parametro può essere l'ID della Categoria, il Titolo della Categoria, lo Slug della Categoria oppure un Array di ID, nomi e slug.

1 dic 2014 05:13:41
Commenti

in_category() *

Avishay28 Avishay28
19 apr 2016 12:42:27

Per favore correggi la tua risposta

Chris Pink Chris Pink
28 giu 2024 13:36:09
0

Questo è un modo conveniente per farlo, trovato qui incolla questo codice nel tuo file functions.php

// Template personalizzato per singoli articoli in base alla categoria
// 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;
}

per maggiori informazioni visita https://halgatewood.com/wordpress-custom-single-templates-by-category

18 ago 2017 08:52:48
0
function get_custom_cat_template($single_template) {
   global $post;

      if ( in_category( 'nome-categoria' )) {
         $single_template = dirname( __FILE__ ) . '/single-template.php';
      }
   return $single_template;
}

add_filter( "single_template", "get_custom_cat_template" ) ;
24 set 2019 11:38:02
1
-1

LE SOLUZIONI VECCHIE NON FUNZIONANO PER I NUOVI TEMPLATE DI WORDPRESS (BLOCK TEMPLATES)?

Per chi arriva qui da Google dopo il 2022:

Se stai lavorando con i block templates, il nuovo sistema di template per WP, dove i file dei template non sono più file .php ma semplici file .html contenenti codici di blocchi, puoi usare questa soluzione:

Basta creare single-post-[slug della categoria]-article.html. Funziona.

Più precisamente, questa è l'ordine in cui WordPress cerca i file dei block template per i singoli post:

  1. single-post-[slug della categoria]-article.html
  2. single-post.html
  3. single.html
15 mar 2023 17:03:30
Commenti

Non funziona su 6.6.2

th00ht th00ht
24 set 2024 11:01:37