Averiguar qué plantilla de WordPress se usa para una página desde la página de administración

5 minutos de lectura

avatar de usuario
capoko

Estoy tratando de recuperar el nombre de archivo/ruta de la plantilla utilizada en la página ‘Editar página’ en el Tablero.

parecido a lo que wp-includes/template-loader.php (fuente) hace en la parte delantera: descubrir qué plantilla renderizar.

Desafortunadamente, expresiones como is_front_page() – que WordPress’ template-loader.php utiliza para averiguar si debe utilizar get_front_page_template() – no funciona correctamente en la página de administración. Lo cual es de esperar porque esas expresiones usan el objeto global $wp_query, y no la consulta actual.

Lo que he probado hasta ahora:

Ejecutar un bucle de publicación dentro de la página de administración

$args = array(
    'p' => get_the_ID(),
    'post_type' => 'any'
);

$query = new \WP_Query($args);

if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post(); ?>

    <?= the_title(); ?><br>
    Is front page: <?= is_front_page() ? 'true' : 'false' ?>

<?php endwhile; endif; ?>

Pantallas:

Hogar

Es portada: falsa

Usando get_post_meta

<?= get_post_meta(get_the_ID(), '_wp_page_template', true); ?>

Pantallas:

defecto

…que sería lo mismo para front-page.php en Inicio y page.php en otra página predeterminada, así que esto no me ayuda.

En breve

Lo que estoy tratando de conseguir es front-page.php cuando estoy editando mi página de ‘Inicio’. O custom-template.php cuando estoy editando alguna página con la plantilla personalizada seleccionada. O about-page.php cuando estoy editando una página llamada ‘Acerca de’. ¿Cómo obtener el nombre de archivo o la ruta correctos?

  • Encontré una solución a este problema agregando una etiqueta meta que contiene el nombre de archivo de la plantilla en el front-end y usando php get_meta_tags desde el backend para obtener el nombre de archivo correcto. Aunque esto funciona, me pregunto si hay una solución más elegante. Comenzando una recompensa ahora.

    – kapoko

    5 de septiembre de 2017 a las 8:28


  • ¿Cómo estás ejecutando el intento de código anterior? ¿A través de un gancho?

    –Steve

    5 de septiembre de 2017 a las 14:27

  • En resumen: la metaetiqueta se inserta usando el wp_head gancho. Usando una función similar a Éste la ruta de la plantilla correcta se carga en la etiqueta meta. Luego, usando curl o get_meta_tags (probé ambos, ambos funcionaron), leí esa metaetiqueta desde el backend. Funciona, pero se siente como una solución sucia.

    – kapoko

    5 sep 2017 a las 14:42


  • Una semana después: gracias por las respuestas, aunque no encontré una mejor solución a mi problema. Todavía no puedo obtener el archivo de plantilla REAL que se carga cuando estoy en la página de administración, a menos que use el truco curl para cargar la página en el front-end descrito en el comentario anterior, que seguiré usando por ahora. .

    – kapoko

    12 de septiembre de 2017 a las 12:03

Si su problema específico es con la página de inicio, puede usar una combinación de get_page_template() y comparando el ID de la página editada con get_option('page_on_front') (ver Referencia de opciones de WordPress). También hay una opción, show_on_frontque indica si la página principal muestra publicaciones o una página estática.

¿Quizás esto ayude? No sé si hay otros casos extremos en los que se utilizará una plantilla diferente…

  • Gracias, esto de hecho ayudaría para la página principal. Desafortunadamente consideraría todo jerarquía de plantillas Casos casos extremos, que son muchos. Como estoy escribiendo un complemento que debería funcionar para diferentes temas, no puedo simplemente incorporar algunos de los casos extremos que necesito.

    – kapoko

    12/09/2017 a las 11:51

  • Sí, probablemente podría improvisar algo verificando la presencia de posibles archivos de plantilla uno por uno, teniendo en cuenta los temas secundarios, etc., lo que parece que se volvería frágil bastante rápido, su truco con curl es probablemente el más ¡Solución práctica!

    – klumme

    12/09/2017 a las 14:44

Usar get_page_template():

<?php echo realpath(get_page_template()); ?> 

Sale algo como /foo/bar/baz/wp-content/themes/your-theme/{page-template}.php

Puede optar por no utilizar realpath() y solo obtenga el nombre de la plantilla.

  • Esto devuelve la plantilla de página establecida en la página, no la plantilla que realmente está cargada. Por ejemplo, en el tablero cuando estoy editando la página de inicio, devuelve path/to/template/page.php mientras realmente carga path/to/template/front-page.phpporque WordPress da preferencia a eso.

    – kapoko

    8 sep 2017 a las 10:43

  • Esta función devuelve la plantilla asignada a la página actual. Período. Si está obteniendo “predeterminado” o page.php, entonces no ha configurado una plantilla personalizada en la pantalla de edición de la página… O, no se está guardando en la base de datos. WordPress carga la plantilla asignada a la página y, si no hay ninguna, sigue sus propios valores predeterminados según la jerarquía de la plantilla. Si esta función no le brinda lo que desea ver, o se está cargando alguna otra plantilla en lugar de la que le brinda esta función, entonces debe volver a examinar sus plantillas y declaraciones.

    – Espartaco

    08/09/2017 a las 16:45

  • Exactamente, WordPress sigue la jerarquía de plantillas. Lo cual no se refleja en los resultados de get_page_template(). yo obtengo page.php cuando hago eco de tu función en el archivo front-page.php. Probado en dos temas diferentes.

    – kapoko

    12 de septiembre de 2017 a las 11:27

  • y cual es la salida de get_page_template() si lo usa en una página con una plantilla personalizada? Por ejemplo, ahora estoy trabajando en una instalación que tiene una plantilla de portada personalizada y get_page_template() genera el nombre de archivo de plantilla adecuado. Estaría dispuesto a apostar que si tiene un front-page.php, y esta función aún muestra page.php, algo está mal con la configuración de la página principal.

    – Espartaco

    12/09/2017 a las 17:09

La única solución que encontré es esta:

global $template;
echo basename($template); // front-page.php

Sé que es feo, pero simplemente no pude encontrar una manera de no usar esta variable global.

  • ¡Gracias por tu sugerencia! El problema ya no es relevante para mí, así que no lo probé.

    – kapoko

    3 de diciembre de 2019 a las 10:59

¿Ha sido útil esta solución?