¿Contra qué compara is_page_template()?
Revisando la documentación de WordPress, dice que is_page_template()
compara contra un "nombre de plantilla", si se proporciona uno.
Tengo una plantilla almacenada en page-homepage.php
llamada Homepage
:
/*
* Template Name: Homepage
* Description: La plantilla para mostrar la página de inicio
*/
Y tengo código que deseo ejecutar en mi functions.php cuando estoy usando esa plantilla:
if (is_page_template('Homepage')) {
...
Pero no se activa cuando estoy en una página que usa esa plantilla.
Cuando miro el código que WordPress ejecuta para is_page_template()
, parece que en realidad verifica el nombre del documento, no el nombre de la plantilla...
function is_page_template( $template = '' ) {
$page_template = get_page_template_slug( get_queried_object_id() );
if ( $template == $page_template )
return true;
En mi caso, parece que $page_template
es page-homepage.php
-- ¡no el nombre de la plantilla, como sugiere la documentación...?
¿Estoy haciendo algo mal?

Tu condición debería escribirse así:
if (is_page_template('ruta/archivo.php')) {
// Hacer algo
}
Creo que la confusión es resultado de dos cosas:
- La documentación se refiere ambiguamente al "nombre". Especificar "nombre de archivo" haría la documentación mucho más clara.
- El código detrás de
is_page_template()
muestra la funciónget_page_template_slug()
en su núcleo. Esta función en realidad devuelve un nombre de archivo, no el slug de la plantilla. https://codex.wordpress.org/Function_Reference/get_page_template_slug
Cuando se especifica un argumento para la función is_page_template()
(como en el ejemplo anterior), la ruta del archivo es relativa a la raíz del tema.
Esta función no funcionará dentro del bucle (loop).
EDITADO: un problema importante que también hay que tener en cuenta aquí. La función is_page_template()
devolverá vacío/falso si la página está usando la plantilla por defecto de la jerarquía. Si no se ha asignado una plantilla personalizada, debes usar otro método, como basename(get_page_template())
. Consulta la respuesta de Jacob aquí para más detalles: https://wordpress.stackexchange.com/a/328427/45202
EDITADO 2: Esta nota sobre la "plantilla por defecto" incluye plantillas que usan el slug de la página u otras convenciones de nombres (por ejemplo, page-mi-slug-de-pagina.php) según mi propia experiencia.

Agregué aclaraciones adicionales y detalles sobre por qué esto puede resultar confuso.

Vaya. Un doble golpe de confusión. Puedo entender que la documentación sea un poco ambigua (aunque realmente debería corregirse), pero me sorprende mucho que get_page_template_slug()
¡en realidad no devuelva un slug!

De acuerdo. Apoya aún más la noción de que "nombrar cosas" es una de las tareas más difíciles al escribir código.

Esta respuesta contiene la solución de "mejores prácticas". Sin embargo, si tu página está usando la "plantilla predeterminada" (pero en realidad es una Plantilla de Página), esta respuesta puede interesarte.

Creo que lo mejor es decir que verifica el nombre del ARCHIVO y en tu caso sería page-homepage.php. Entonces:
if (is_page_template('page-homepage.php')) {
...
Otras cosas a considerar son si el archivo de plantilla está almacenado dentro de otra carpeta dentro del tema. leer más
Una cosa más, el Template Name: Homepage
es generalmente lo que se usa para identificar la plantilla al crear una página o entrada.

Como señala otra respuesta - también toma en cuenta la ruta. page-templates/page-homepage.php
es diferente a la plantilla en la raíz del tema.

Interesante y algo que no sabía, solo para confirmar, ¿puedo almacenar las plantillas de página fuera de la carpeta del tema o del tema hijo?
