Cu ce compară is_page_template()?
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?

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:
- Documentația se referă ambiguu la "nume". Specificând "numele fișierului" ar face documentația mult mai clară.
- Codul din spatele funcției
is_page_template()
arată funcțiaget_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ță.

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

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!

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

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.

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.

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.

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