Cosa confronta is_page_template()?

8 set 2016, 20:56:13
Visualizzazioni: 50.4K
Voti: 17

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?

1
Commenti

Ottima osservazione riguardo alla documentazione.

birgire birgire
8 set 2016 21:32:22
Tutte le risposte alla domanda 2
6
22

La tua condizione dovrebbe essere scritta così:

if (is_page_template('percorso/file.php')) { 
    // Fai qualcosa
}

Credo che la confusione derivi da due fattori:

  1. La documentazione fa riferimento al "nome" in modo ambiguo. Specificare "nome del file" renderebbe la documentazione molto più chiara.
  2. Il codice dietro is_page_template() mostra la funzione get_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.

8 set 2016 21:24:08
Commenti

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

birgire birgire
8 set 2016 21:35:11

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

jdm2112 jdm2112
8 set 2016 21:45:17

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!

Django Reinhardt Django Reinhardt
9 set 2016 12:09:19

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

jdm2112 jdm2112
9 set 2016 17:38:55

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.

rinogo rinogo
10 ago 2018 02:12:42

Grazie, @rinogo. Ho aggiunto una nota sopra poiché mi sono appena imbattuto nuovamente in questo problema personalmente.

jdm2112 jdm2112
12 mag 2020 00:53:12
Mostra i restanti 1 commenti
3

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.

8 set 2016 21:26:36
Commenti

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

Howdy_McGee Howdy_McGee
8 set 2016 21:31:39

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?

Malisa Malisa
8 set 2016 21:36:30

Per tua informazione, questo funziona anche nell'ambiente di sviluppo Sage

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