Cu ce compară is_page_template()?

8 sept. 2016, 20:56:13
Vizualizări: 50.4K
Voturi: 17

Căutând prin documentația WordPress, se menționează că is_page_template() compară cu un "nume de șablon", dacă acesta este furnizat.

Am un șablon stocat în page-homepage.php numit Homepage:

/*
 * Template Name: Homepage
 * Description: Șablonul pentru afișarea paginii principale
 */

Și am niște cod pe care vreau să-l rulez în functions.php când folosesc acel șablon:

if (is_page_template('Homepage')) { 
   ...

Dar nu este declanșat când mă aflu pe o pagină care folosește acel șablon.

Când mă uit la codul pe care WordPress îl execută pentru is_page_template(), pare că de fapt verifică numele documentului, nu numele șablonului...?

function is_page_template( $template = '' ) {

    $page_template = get_page_template_slug( get_queried_object_id() );

    if ( $template == $page_template )
        return true;

În cazul meu, se pare că $page_template este page-homepage.php -- nu numele șablonului, așa cum sugerează documentația...?

Fac ceva greșit?

1
Comentarii

Bună observație referitoare la documentație.

birgire birgire
8 sept. 2016 21:32:22
Toate răspunsurile la întrebare 2
6
22

Condiția ta ar trebui să fie scrisă astfel:

if (is_page_template('cale/fisier.php')) { 
    // Execută acțiuni
}

Cred că confuzia este rezultatul a două lucruri:

  1. Documentația se referă ambiguu la "nume". Specificând "numele fișierului" ar face documentația mult mai clară.
  2. Codul din spatele funcției is_page_template() arată funcția get_page_template_slug() la bază. Această funcție returnează de fapt un nume de fișier, nu slug-ul șablonului. https://codex.wordpress.org/Function_Reference/get_page_template_slug

Când specifici un argument pentru funcția is_page_template() (ca în exemplul de mai sus), calea fișierului este relativă la rădăcina temei.

Această funcție nu va funcționa în interiorul buclei.

EDIT: un aspect important de menționat aici. Funcția is_page_template() va returna gol/fals dacă pagina utilizează șablonul implicit din ierarhie. Dacă nu este atribuit un șablon personalizat, trebuie să utilizezi o altă metodă, cum ar fi basename(get_page_template()). Vezi răspunsul lui Jacob aici pentru mai multe detalii: https://wordpress.stackexchange.com/a/328427/45202

EDIT 2: Această notă despre "șablonul implicit" include și șabloanele care folosesc slug-ul paginii sau alte convenții de denumire (de ex. page-numele-meu-slug.php) din propria mea experiență.

8 sept. 2016 21:24:08
Comentarii

Ar fi util să avem o explicație despre ce reprezintă path aici.

birgire birgire
8 sept. 2016 21:35:11

Am adăugat clarificări suplimentare și detalii despre de ce acest lucru poate fi confuz.

jdm2112 jdm2112
8 sept. 2016 21:45:17

Uau. O dublă confuzie. Înțeleg că documentația poate fi un pic ambiguă (deși ar trebui să fie corectată), dar sunt foarte surprins că get_page_template_slug() nu returnează de fapt un slug!

Django Reinhardt Django Reinhardt
9 sept. 2016 12:09:19

De acord. Confirmând și mai mult ideea că "denumirea lucrurilor" este una dintre cele mai dificile sarcini atunci când scrii cod.

jdm2112 jdm2112
9 sept. 2016 17:38:55

Acest răspuns conține soluția "best practice". Totuși, dacă pagina ta folosește "template-ul implicit" (dar este de fapt un Page Template), acest răspuns te poate interesa.

rinogo rinogo
10 aug. 2018 02:12:42

Mulțumesc, @rinogo. Am adăugat o notă mai sus tocmai pentru că am întâlnit din nou această problemă, personal.

jdm2112 jdm2112
12 mai 2020 00:53:12
Arată celelalte 1 comentarii
3

Cred că cel mai bine este să spun că verifică numele FIȘIERULUI și în cazul tău ar fi page-homepage.php. Deci:

if (is_page_template('page-homepage.php')) { 
  ...

Altceva de luat în considerare este dacă fișierul template este de fapt stocat într-un alt folder în interiorul temei. citește mai multe

Încă un lucru, Template Name: Homepage este în general ceea ce este folosit pentru a identifica template-ul atunci când creezi o pagină sau un articol.

8 sept. 2016 21:26:36
Comentarii

După cum subliniază un alt răspuns - acesta ia în considerare și calea. page-templates/page-homepage.php este diferit de șablonul din directorul rădăcină al temei.

Howdy_McGee Howdy_McGee
8 sept. 2016 21:31:39

Interesant și ceva ce nu știam, doar pentru a confirma, pot stoca șabloanele de pagină în afara folderului temei sau al temei copil?

Malisa Malisa
8 sept. 2016 21:36:30

FYI acesta funcționează și în mediul de dezvoltare Sage

Fred K Fred K
13 mai 2022 11:49:05