Cum să creezi single.php pentru o categorie specifică după ID-ul categoriei

18 nov. 2014, 15:04:02
Vizualizări: 14.1K
Voturi: 0

Î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.

1
Comentarii

Sau ai putea folosi doar single.php și în conținut ajustezi în funcție de o condiție if (de exemplu <?php if ( in_category(20) ) { ?>).

Aibrean Aibrean
5 aug. 2015 17:05:16
Toate răspunsurile la întrebare 4
15

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

Nu folosi TEMPLATEPATH. Vezi acest link

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

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

cybmeta cybmeta
18 nov. 2014 15:38:05

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

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

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 Netsh
18 nov. 2014 21:10:27

@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.

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

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?

Netsh Netsh
18 nov. 2014 23:18:53

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

Netsh Netsh
19 nov. 2014 00:52:17

@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?

Marcin Marcin
19 nov. 2014 09:54:52

@Netsh te rog să verifici Edit 2 pentru răspunsul exact.

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

@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?

Marcin Marcin
19 nov. 2014 11:05:35

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 Netsh
19 nov. 2014 11:48:45

@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.

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

Î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.

Netsh Netsh
20 nov. 2014 21:55:22

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

Pieter Goosen Pieter Goosen
1 ian. 2016 22:15:00

Am încercat acest cod. Am descoperit că get_template_directory() returnează tema părinte, nu tema copil. Așadar, nu poate găsi noul fișier de template.

Nora McDougall-Collins Nora McDougall-Collins
17 mar. 2021 18:21:05
Arată celelalte 10 comentarii
1

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

Aș putea primi un feedback? Ce este greșit în răspunsul meu? Dacă dai vot negativ, te rog adaugă un comentariu.

Marcin Marcin
19 nov. 2014 08:47:31
0

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;
});
6 mar. 2016 07:29:07
0

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