Cosa confronta is_page_template()?
Guardando la documentazione WordPress, si dice che is_page_template()
confronta con un "nome del template", se ne viene fornito uno.
Ho un template salvato in page-homepage.php
chiamato Homepage
:
/*
* Nome Template: Homepage
* Descrizione: Il template per visualizzare la homepage
*/
E ho del codice che vorrei eseguire nel mio functions.php quando uso quel template:
if (is_page_template('Homepage')) {
...
Ma non viene attivato quando sono su una pagina che usa quel template.
Quando guardo il codice che WordPress esegue per is_page_template()
, sembra che in realtà controlli il nome del documento, non il nome del template...?
function is_page_template( $template = '' ) {
$page_template = get_page_template_slug( get_queried_object_id() );
if ( $template == $page_template )
return true;
Nel mio caso sembra che $page_template
sia page-homepage.php
-- non il nome del template, come suggerisce la documentazione...?
Sto facendo qualcosa di sbagliato?

La tua condizione dovrebbe essere scritta così:
if (is_page_template('percorso/file.php')) {
// Fai qualcosa
}
Credo che la confusione derivi da due fattori:
- La documentazione fa riferimento al "nome" in modo ambiguo. Specificare "nome del file" renderebbe la documentazione molto più chiara.
- Il codice dietro
is_page_template()
mostra la funzioneget_page_template_slug()
come suo nucleo. Questa funzione in realtà restituisce un nome di file, non lo slug del template. https://codex.wordpress.org/Function_Reference/get_page_template_slug
Quando specifichi un argomento per la funzione is_page_template()
(come nell'esempio sopra), il percorso del file è relativo alla root del tema.
Questa funzione non funziona all'interno del loop.
MODIFICA: un altro aspetto importante da notare è che la funzione is_page_template()
restituirà vuoto/falso se la pagina sta usando il template predefinito della gerarchia. Se non è assegnato un template personalizzato, devi usare un altro metodo, come basename(get_page_template())
. Vedi la risposta di Jacob qui per maggiori dettagli: https://wordpress.stackexchange.com/a/328427/45202
MODIFICA 2: Questa nota sul "template predefinito" include anche i template che usano lo slug della pagina o altre convenzioni di denominazione (es. page-mio-slug.php) dalla mia esperienza personale.

Sarebbe bello avere una spiegazione su cosa rappresenta path in questo contesto.

Aggiunte ulteriori chiarimenti e dettagli sul perché questo possa creare confusione.

Wow. Un doppio colpo di confusione. Posso capire che la documentazione sia un po' ambigua (anche se andrebbe davvero sistemata), ma sono davvero sorpreso che get_page_template_slug()
non restituisca effettivamente uno slug!

Concordo. Questo supporta ulteriormente l'idea che "dare i nomi alle cose" sia una delle parti più difficili quando si scrive codice.

Questa risposta contiene la soluzione "best practice". Tuttavia, se la tua pagina utilizza il "template predefinito" (ma in realtà è un Page Template), questa risposta potrebbe interessarti.

Penso che la cosa migliore da dire sia che controlla il nome del FILE e nel tuo caso sarebbe page-homepage.php. Quindi:
if (is_page_template('page-homepage.php')) {
...
Altre cose da considerare sono se il file template è effettivamente memorizzato in un'altra cartella all'interno del tema. leggi di più
Un'altra cosa, il Template Name: Homepage
è generalmente ciò che viene utilizzato per identificare il template quando si crea una pagina o un articolo.

Come sottolinea un'altra risposta - tiene anche conto del percorso. page-templates/page-homepage.php
è diverso dal template nella root del tema.

Interessante e qualcosa che non sapevo, solo per confermare, posso memorizzare i template di pagina al di fuori della cartella del tema o del child theme?
