¿Contra qué compara is_page_template()?

8 sept 2016, 20:56:13
Vistas: 50.4K
Votos: 17

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?

1
Comentarios

Buena observación con respecto a la documentación.

birgire birgire
8 sept 2016 21:32:22
Todas las respuestas a la pregunta 2
6
22

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:

  1. La documentación se refiere ambiguamente al "nombre". Especificar "nombre de archivo" haría la documentación mucho más clara.
  2. El código detrás de is_page_template() muestra la función get_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.

8 sept 2016 21:24:08
Comentarios

Sería bueno tener una explicación de qué significa path aquí.

birgire birgire
8 sept 2016 21:35:11

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

jdm2112 jdm2112
8 sept 2016 21:45:17

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!

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

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.

jdm2112 jdm2112
9 sept 2016 17:38:55

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.

rinogo rinogo
10 ago 2018 02:12:42

Gracias, @rinogo. Agregué una nota arriba ya que acabo de encontrarme con este problema nuevamente, personalmente.

jdm2112 jdm2112
12 may 2020 00:53:12
Mostrar los 1 comentarios restantes
3

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.

8 sept 2016 21:26:36
Comentarios

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.

Howdy_McGee Howdy_McGee
8 sept 2016 21:31:39

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?

Malisa Malisa
8 sept 2016 21:36:30

Para tu información, este también funciona en el entorno de desarrollo Sage

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