Encontré esto para mostrar el nombre actual del archivo utilizado en la plantilla:
function get_template_name () {
foreach ( debug_backtrace() as $called_file ) {
foreach ( $called_file as $index ) {
if ( !is_array($index[0]) AND strstr($index[0],'/themes/') AND !strstr($index[0],'footer.php') ) {
$template_file = $index[0] ;
}
}
}
$template_contents = file_get_contents($template_file) ;
preg_match_all("Template Name:(.*)\n)siU",$template_contents,$template_name);
$template_name = trim($template_name[1][0]);
if ( !$template_name ) { $template_name = '(default)' ; }
$template_file = array_pop(explode('/themes/', basename($template_file)));
return $template_file . ' > '. $template_name ;
}
Fuente: obtener el nombre de la plantilla de página en una página
Funciona bastante bien, excepto que en el backend, en el cuadro de selección de plantilla, obtengo esta entrada extra fea:
¿Alguien tiene alguna idea de cómo solucionarlo? Ni siquiera sé por qué esta función se llama en el backend. ¿Hay una función condicional como is_frontend()
: tal vez esto resolvería el problema?
functions.php
como un error, estaré completamente de acuerdo con su premisa. Para empeorar las cosas, escaneé el código central de WordPress y encontré alrededor de 5 lugares donde podría haber un enganche para permitirle manejar este problema, pero no encontré ninguno. Sugeriría publicar un ticket en core.trac.wordpress.org .template_include
engancha, ¿qué t31os sugirió, resolver el problema? O tal vez te he entendido mal.Respuestas:
Puede establecer una variable global durante el
template_include
filtro y luego verificar esa variable global para ver qué plantilla se ha incluido.Naturalmente, no querría la ruta completa junto con el archivo, por lo que recomendaría truncar el nombre del archivo utilizando la
basename
función de PHP .Código de ejemplo:
dos funciones, una para configurar el global y otra para invocarlo.
Luego puede recurrir a
get_current_template
donde sea que lo necesite en los archivos de tema, y tenga en cuenta que esto naturalmente debe ocurrir después de que latemplate_include
acción se haya disparado (no tendrá que preocuparse por esto si la llamada se realiza dentro de un archivo de plantilla).Para las plantillas de página, hay que
is_page_template()
tener en cuenta que solo ayudará en el caso de las plantillas de página (una función mucho menor de capturar todas ).Información sobre las funciones utilizadas o mencionadas anteriormente:
fuente
aparentemente esto es suficiente:
o simplemente usarlo directamente en la plantilla (tiendo a hacer eco en footer.php en el comentario HTML)
fuente
echo __FILE__;
echo __FILE__
, porque esto no funcionará, solo muestra la plantilla principal inicialEntre las funciones nativas de WP como get_template_part () y la nativa de PHP, la forma más confiable de ver los archivos de tema utilizados es buscar una lista de todos los archivos incluidos y filtrar lo que no pertenece al tema (o temas cuando se usa la combinación padre e hijo) :
fuente
Una adición (más código dulce) a otras respuestas aquí.
Nombre de la plantilla
Para obtener el nombre de la plantilla de página actual , use la siguiente línea.
Nombre del archivo
Cuando solo desee hacer eco del nombre del archivo de plantilla actual , vaya con lo siguiente
Editar: Aquí está la nueva versión del complemento envuelto en una clase. Muestra el nombre del archivo de plantilla actual, así como el nombre del archivo de jerarquía de plantilla en el gancho de cierre en la parte inferior de la página.
Lo que te dice el complemento:
Simplemente copie el siguiente código en un archivo y asígnele un nombre
wpse10537_template_info.php
, cárguelo en su directorio de complementos y actívelo.Este complemento también puede ejecutarse como MU-Plugin.
Luego, simplemente puede llamar
wpse10537_get_template_name()
en cualquier momento (por ejemplo, una plantilla de tema). Esto evita saturar el espacio de nombres global.fuente
template_redirect
no está pasando nada, creo que te estás confundiendotemplate_include
. También verificaría si dentro del filtro en lugar de si la var estática está llena. Si algún código decide ejecutar hook tiempo adicional, puede destruir cosas.El nombre de la plantilla se almacena en la tabla postmeta, por lo que todo lo que necesita hacer es poner esto en algún lugar de su bucle:
fuente
front-page.php
,index.php
,single.php
,page.php
o cualquier otro archivo. Su código muestra el nombre de la plantilla solo para páginas con una plantilla de página personalizada.Esto no aborda todas las preguntas del OP, pero el código a continuación es ciertamente más elegante que las expresiones regulares y analiza el archivo de plantilla en sí.
Si está en una página que usa una plantilla de página y desea obtener el nombre de la plantilla de página (es decir, el nombre legible por humanos que definió en los comentarios en la parte superior de su archivo PHP de plantilla), puede usar esta pequeña pepita:
Quería obtener el nombre de la plantilla porque estaba realmente harto de los nombres de clase tontos que la función incorporada de WordPress
body_class
crea cuando usas una plantilla. Afortunadamente, hay un gancho de filtro al final de esa función que le permite agregar sus propios nombres de clase también. Aquí está mi filtro. Espero que alguien lo encuentre útil:Este filtro tomará lo que haya llamado su plantilla de página, reemplazará espacios con guiones y hará que todo esté en minúsculas para que se vea como todas las otras clases de WordPress.
fuente
Hay un problema con la
preg_match_all
línea. Intenta esto en su lugar:Además, puede usar
if (!is_admin()) { .... }
para ejecutar cosas solo en la interfaz.fuente
functions.php
encontrar el archivo"/Template Name:(.*)\n/siU"
y, por lo tanto, lo tratafunctions.php
como un archivo de plantilla. Creo que este es un error de WP, ni siquiera debería mirar este archivo. La solución: mover el archivo al subdirectorio.functions.php
archivo. Para mí, personalmente, eso es un error, (pequeño, pero de todos modos) pero supongo que eso depende de la discusión. Creo que no se puede decir que la función en sí es defectuosa.Template Name
dentro de cada uno de los archivos, su ciclo ha terminado mucho antes.debug_backtrace()
: puedo eliminar todo el código y simplemente dejarlopreg_match_all("/Template Name...
, o incluso solo// Template Name:
y WP lo tratafunctions.php
como un archivo de plantilla, pero gracias por los comentarios: este es un problema tan único que, como usted dice, no es justo decir Es un error. La solución t31os es limpia y resuelve todo el problema. SaludosJuega junto con:
Escrito en:
¿Cómo saber qué página de plantilla sirve la página actual?
si la
admin-bar stuff
ruta se muestra en la parte superior o en cualquier otro archivo, cambie el nombre del archivotemplate-loader.php
en esta línea de código a: cualquier nombre de archivo del que deba separarse.si necesita esto en la barra de administración, use la priotity correcta (la más temprana) para asegurarse de que no se ingresen archivos al final de esta lista. Por ejemplo:
La prioridad
-5
hace que se cargue primero. La clave es representar esta línea en el momento correcto.No devuelve el archivo de plantilla "actual", sino todo el actual en uso para la carga de página actual. Tal vez "cortar" con algo de lógica de esa idea .
La
get_included_files()
"última" clave es el último archivo incluido registrado, probablemente la última plantilla / archivo / parte utilizada en el pie de página por el widget de la barra lateral o algo así. Probablemente, los archivos incluidos en cos mutiple no se vuelven a registrar / rellenan nuevamente en get_included_files ().De lo contrario, la intención debe ser clara para hackear este problema . No hay forma de que un archivo incluido se informe como incluido, hasta que se haya incluido . Entonces es probable que sea demasiado tarde para usar el escenario.
La mayor parte del "tiempo" que le gustaría:
Pero eso no es posible si la plantilla se carga fuera del método principal de Wordpress
get_template_part
. ¡Rediseña tus necesidades en su lugar! Tal vezloop_start()
,in_the_loop()
yadd_action('the_post')
tiene la solución que desea, para alterar los datos dependiendo de la plantilla que se cargará para cada entrada dentro de un ciclo.fuente
fuente