Come creare single.php per una categoria specifica tramite ID in WordPress

18 nov 2014, 15:04:02
Visualizzazioni: 14.1K
Voti: 0

Sto cercando di creare un template per una categoria specifica con ID 1 per esempio. Il template dovrebbe essere applicato a tutte le pagine che appartengono a questa categoria. Quindi, dovrebbe essere qualcosa come single-1.php.

Ho provato molte soluzioni che ho trovato online, inclusa questa, ma sembra che nulla funzioni per me.

1
Commenti

Oppure potresti utilizzare solo il single.php e nei contenuti, adatti in base a un'istruzione if (ad esempio <?php if ( in_category(20) ) { ?>).

Aibrean Aibrean
5 ago 2015 17:05:16
Tutte le risposte alla domanda 4
15

Puoi utilizzare questa funzione per aggiungere template specifici per categoria alle pagine singole del tuo sito. Questo codice va inserito nel file functions.php

Puoi definire quanti template singoli desideri.

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' );

In questo esempio ho usato single-cat1.php per la categoria con id 1 e single-cat2.php per la categoria con id 2. Puoi nominare questi template singoli come preferisci.

Questa funzione utilizza anche un fallback di default a single.php se non esistono i file single-cat1.php o single-cat2.php.

MODIFICA 1

Ho utilizzato il codice sopra in due dei miei siti e funziona correttamente con l'ultima versione di WordPress.

Incolla questo nel tuo functions.php

function show_template() {
    global $template;
    print_r($template);
}
add_action( 'wp_head', 'show_template' );

Questo mostrerà il template file utilizzato in ogni pagina/post. Ora accedi al tuo sito e verifica se viene utilizzato il template corretto oppure no? Se mostra ancora single.php allora c'è qualcosa che non va nel tuo codice.

MODIFICA 2

Ecco il codice per quello.

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' );
18 nov 2014 15:13:10
Commenti

Non usare TEMPLATEPATH. Vedi questo

Pieter Goosen Pieter Goosen
18 nov 2014 15:33:01

Ed è meglio usare locate_template() invece di "if file_exists() then return"

cybmeta cybmeta
18 nov 2014 15:38:05

@PieterGoosen ha appena fatto questa modifica. Anche se il ticket dice che TEMPLATEPATH è deprecato, non mostra alcun warning in WordPress. Grazie :)

Robert hue Robert hue
18 nov 2014 15:39:36

Grazie ragazzi! Ho provato ad applicare questo codice ma ancora non funziona per me.

Dopo aver aggiunto questa funzione al mio function.php e definito il single-cat.php, le pagine correlate (con lo stesso ID di categoria) sono rimaste invariate con il template base single.php. Qualche idea sul perché?

Netsh Netsh
18 nov 2014 21:10:27

@Netsh Per favore controlla le modifiche nella mia risposta. E se hai ancora problemi, modifica la tua domanda e pubblica il codice che hai aggiunto nel tuo functions.php.

Robert hue Robert hue
18 nov 2014 21:28:22

Ciao. Era un'ottima idea! Grazie! Ora capisco che dovrei definire il template della categoria su page.php e non su single.php. Cosa dovrei cambiare affinché il codice funzioni per me?

Netsh Netsh
18 nov 2014 23:18:53

Dovrebbe essere qualcosa del genere: - se l'ID della categoria della pagina è 6 - usa page-custom.php, altrimenti usa page.php

Netsh Netsh
19 nov 2014 00:52:17

@Netsh potresti controllare il mio codice? Questo codice non può funzionare, perché Robert assume che la categoria controllata sia la prima che è stata assegnata. Questo è sbagliato. E se cat_ID 1 è il terzo elemento di $all_cats?

Marcin Marcin
19 nov 2014 09:54:52

@Netsh per favore controlla Edit 2 per la tua risposta esatta.

Robert hue Robert hue
19 nov 2014 10:00:23

@Roberthue il tuo codice è sbagliato... E se l'oggetto categoria con cat_ID == 6 è in $all_cats con indice [1]? E se $all_cat[0]->cat_ID == 6 è falso ma $all_cat[1]->cat_ID è vero?

Marcin Marcin
19 nov 2014 11:05:35

Bene, prima di tutto grazie. Apprezzo il tuo aiuto! Ho provato questo codice e ancora non funziona per me. Sembra che il sistema non riconosca questa funzione, e appare lo stile predefinito di page.php..

Netsh Netsh
19 nov 2014 11:48:45

@Netsh prova di nuovo l'ultimo codice e fammi sapere, ho aggiunto il suggerimento di marcin. Dovrebbe funzionare perché lo sto usando su 2 dei miei siti web senza problemi. Assicurati anche che nessun'altra funzione sovrascriva il suo codice/effetto.

Robert hue Robert hue
20 nov 2014 11:21:28

Scusa... non funziona per me... ma grazie a tutti per gli sforzi... Ho controllato il mio altro functions.php e non ho trovato alcuna funzione problematica... Proverò in un'altra direzione.. Grazie ancora.

Netsh Netsh
20 nov 2014 21:55:22

Perché non usare in_category() o has_category() per verificare se un post ha una specifica categoria associata? ;-)

Pieter Goosen Pieter Goosen
1 gen 2016 22:15:00

Ho provato questo codice. Ho scoperto che get_template_directory() restituisce il tema genitore, non il tema child. Quindi, non riesce a trovare il nuovo file template.

Nora McDougall-Collins Nora McDougall-Collins
17 mar 2021 18:21:05
Mostra i restanti 10 commenti
1

Utilizza il filtro single_template per modificare il file del template e la funzione in_category per verificare se il post appartiene a una categoria specifica.

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;
}
18 nov 2014 15:56:10
Commenti

Potrei avere un feedback? Cosa c'è di sbagliato nella mia risposta? Se votate negativamente, per favore aggiungete un commento.

Marcin Marcin
19 nov 2014 08:47:31
0

Puoi utilizzare il filtro single_template, la condizione in_category() e l'oggetto interrogato per verificare se il post corrente è associato alla nostra categoria specificata e, in tal caso, includere il template desiderato

add_filter( 'single_template', function ( $template )
{
    // Ottieni il post singolo corrente
    $post_id = $GLOBALS['wp_the_query']->get_queried_object_id();

    // Verifica se il nostro post appartiene alla categoria 1
    if ( !in_category( 1, $post_id ) ) {
        return $template;
    }

    // Il nostro post è associato alla categoria 1, cerchiamo single-1.php
    $locate_template = locate_template( 'single-1.php' );

    // Verifica se il nostro template esiste, se sì includilo, altrimenti esci
    if ( !$locate_template ) {
        return $template;
    }

    return $locate_template;
});
6 mar 2016 07:29:07
0

Vale la pena menzionare che se stai utilizzando un child theme, allora usa il seguente codice per recuperare il template dei singoli post di categoria.

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' );
26 nov 2018 01:08:10