¿Con qué se compara is_page_template ()?

10

Mirando la documentación de Wordpress , dice que se is_page_template()compara con un "nombre de plantilla", si se proporciona uno.

Tengo una plantilla almacenada en page-homepage.phpllamada Homepage:

/*
 * Template Name: Homepage
 * Description: The template for displaying the homepage
 */

Y tengo un código que deseo ejecutar en mis 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 ejecuta Wordpress is_page_template(), parece que realmente comprueba 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_templatees page-homepage.php- no es el nombre de la plantilla, como la documentación sugiere ...?

¿Estoy haciendo algo mal?

Django Reinhardt
fuente
Buena observación con respecto a la documentación.
Birgire

Respuestas:

15

Su condición debe escribirse así:

if (is_page_template('path/file.php')) { 
    // Do stuff
}

Creo que la confusión es el resultado de dos cosas:

  1. Los documentos se refieren a "nombre" de forma ambigua. Especificar "nombre de archivo" haría la documentación mucho más clara.
  2. El código detrás is_page_template()muestra la get_page_template_slug()función en su núcleo. Esta función en realidad devuelve un nombre de archivo, no la plantilla slug. https://codex.wordpress.org/Function_Reference/get_page_template_slug

Al especificar un argumento para la is_page_template()función (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.

jdm2112
fuente
2
Sería bueno tener una explicación de qué camino representa aquí.
Birgire
1
Se agregaron aclaraciones adicionales y detalles sobre por qué esto puede ser confuso.
jdm2112
3
Guau. Un doble golpe de confusión. Puedo entender que los documentos sean un poco ambiguos (aunque realmente deberían arreglarse), ¡pero estoy realmente sorprendido de que en get_page_template_slug()realidad no devuelva una bala!
Django Reinhardt
Convenido. Prestar más apoyo a la idea de que "nombrar cosas" es una de las cosas más difíciles al escribir código.
jdm2112
Esta respuesta contiene la solución de "mejores prácticas". Sin embargo, si su página está utilizando la "plantilla predeterminada" (pero en realidad es una plantilla de página), esta respuesta puede interesarle.
rinogo
7

Creo que lo mejor que puede decir es que verifica el nombre del ARCHIVO y en su caso sería page-homepage.php. entonces:

if (is_page_template('page-homepage.php')) { 
  ...

Otra cosa a tener en cuenta es si el archivo de plantilla está realmente almacenado dentro de otra carpeta dentro del tema. Lee mas

Una cosa más, Template Name: Homepagegeneralmente se usa para identificar la plantilla al crear una página o publicación.

Malisa
fuente
Como señala otra respuesta, también tiene en cuenta el camino. page-templates/page-homepage.phpes diferente a la plantilla en la raíz del tema.
Howdy_McGee
Interesante y algo que no sabía, solo para confirmar, ¿puedo almacenar las plantillas de página fuera del tema o la carpeta de temas secundarios?
Malisa