Obtener el nombre del archivo de plantilla actual

54

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 plantillas, 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. ¿Existe una función condicional como is_frontend() ? ¿Quizás esto resolvería el problema?

    
pregunta chodorowicz 26.02.2011 - 16:47

9 respuestas

17

al parecer esto es suficiente:

add_action('wp_head', 'show_template');
function show_template() {
    global $template;
    echo basename($template);
}

o simplemente utilícelo directamente en la plantilla (tiendo a hacer eco en footer.php en el comentario HTML)

<?php global $template; echo basename($template); ?>
    
respondido por el chodorowicz 09.04.2011 - 18:25
62

Puede establecer una variable global durante el filtro template_include y luego verificar que vairable global para ver qué plantilla se ha incluido.

Naturalmente, no querrías la ruta completa junto con el archivo, así que recomiendo que trunques el nombre del archivo usando la función basename de PHP.

Código de ejemplo:
Dos funciones, una para configurar lo global, una para llamarla.

add_filter( 'template_include', 'var_template_include', 1000 );
function var_template_include( $t ){
    $GLOBALS['current_theme_template'] = basename($t);
    return $t;
}

function get_current_template( $echo = false ) {
    if( !isset( $GLOBALS['current_theme_template'] ) )
        return false;
    if( $echo )
        echo $GLOBALS['current_theme_template'];
    else
        return $GLOBALS['current_theme_template'];
}

Luego, puede llamar a get_current_template donde lo necesite en los archivos de temas, teniendo en cuenta que esto naturalmente debe ocurrir después de que se haya disparado la acción template_include (no tendrá que preocuparse por esto si la llamada se realiza desde adentro). un archivo de plantilla).

Para las plantillas de página hay is_page_template() , teniendo en cuenta que esto solo ayudará en el caso de las plantillas de página (una función mucho menos importante de capturar todo ).

Información sobre las funciones utilizadas o mencionadas anteriormente:

respondido por el t31os 27.02.2011 - 01:40
16

Entre las funciones WP nativas como get_template_part () y PHP nativo incluye la forma más confiable de ver los archivos de tema utilizados es buscar haga una lista de todos los archivos incluidos y filtre todo lo que no pertenezca al tema (o temas cuando se usa la combinación padre e hijo):

$included_files = get_included_files();
$stylesheet_dir = str_replace( '\', '/', get_stylesheet_directory() );
$template_dir   = str_replace( '\', '/', get_template_directory() );

foreach ( $included_files as $key => $path ) {

    $path   = str_replace( '\', '/', $path );

    if ( false === strpos( $path, $stylesheet_dir ) && false === strpos( $path, $template_dir ) )
        unset( $included_files[$key] );
}

var_dump( $included_files );
    
respondido por el Rarst 01.03.2013 - 19:27
8

Una adición (más código dulce) a otras respuestas aquí.

Nombre de la plantilla

Para obtener el nombre actual de la plantilla de la página , use la siguiente línea.

is_page() AND print get_page_template_slug( get_queried_object_id() );

Nombre de archivo

Cuando solo quieras repetir el nombre del archivo de la plantilla actual , ve a lo siguiente

Editar: Esta es la nueva versión del complemento que se incluye en una clase. Muestra tanto el nombre del archivo de la plantilla actual como el nombre del archivo de jerarquía de plantillas en el enlace de cierre que se encuentra en la parte inferior de la página.

Lo que te dice el plugin:

  • ¿Es la plantilla del elemento principal del elemento secundario / actual?
  • ¿Se sirve la plantilla desde una subcarpeta? En caso afirmativo: te dice el nombre
  • El nombre del archivo de la plantilla.

Simplemente copie el siguiente código en un archivo y asígnele el nombre wpse10537_template_info.php , cárguelo en su directorio de complementos y actívelo.

<?php
/** Plugin Name: (#10537) »kaiser« Get Template file name */

if ( ! class_exists( 'wpse10537_template_name' ) )
{
    add_action( 'plugins_loaded', array( 'wpse10537_template_name', 'init' ) );

class wpse10537_template_name
{
    protected static $instance;

    public $stack;

    public static function init()
    {
        is_null( self :: $instance ) AND self :: $instance = new self;
        return self :: $instance;
    }

    public function __construct()
    {
        if ( is_admin() )
            return;

        add_action( 'wp', array( $this, 'is_parent_template' ), 0 );
        add_action( 'wp', array( $this, 'get_template_file' ) );
        add_action( 'template_include', array( $this, 'get_template_name' ) );
        add_action( 'shutdown', array( $this, 'get_template_name' ) );
    }

    public function get_template_name( $file )
    {
        if ( 'template_include' === current_filter() )
        {
            $this->to_stack(
                 "Template file"
                ,basename( $file )
            );
            return $file;
        }

        // Return static var on echo call outside of filter
        if (
            current_user_can( 'manage_options' )
            AND defined( 'WP_DEBUG' )
            AND WP_DEBUG 
        )
            return print implode( " &ndash; ", $this->stack );
    }

    public function get_template_file()
    {
        if ( ! is_post_type_hierarchical( get_post_type() ) )
            return;

        $slug = get_page_template_slug( get_queried_object_id() );
        if ( ! strstr( $slug, "/" ) )
            return $this->to_stack( "Template", $slug );

        $this->to_stack(
             "Subdirectory"
            ,strstr( $slug, "/", true )
        );

        $this->to_stack(
             "Template (in subdirectory)"
            ,str_replace( "/", "", strstr( $slug, "/" ) )
        );
    }

    public function is_parent_template()
    {
        if ( ! is_null( wp_get_theme()->parent ) )
            return $this->to_stack( 'from parent theme' );

        $this->to_stack( 'from current/child theme' );
    }

    public function to_stack( $part, $item = '' )
    {
        $this->stack[] = "{$part}: {$item}";
    }
} // END Class wpse10537_template_name

} // endif;

Este complemento también puede ejecutarse como MU-Plugin.

Luego puede simplemente llamar a wpse10537_get_template_name() en cualquier punto (por ejemplo, en una plantilla de tema). Esto evita saturar el espacio de nombres global.

    
respondido por el kaiser 08.09.2012 - 04:16
4

El nombre de la plantilla se almacena en la tabla de postmeta, por lo que todo lo que necesita hacer es poner esto en algún lugar de su bucle:

$template = get_post_meta( $post->ID, '_wp_page_template', true );
echo "Template: " . $template;
    
respondido por el Simon Blackbourn 26.02.2011 - 18:51
2

Esto no responde a todas las preguntas del OP, pero el código a continuación es ciertamente más elegante que las expresiones regulares y analiza el propio archivo de plantilla.

Si está en una página que está utilizando una plantilla de página y desea obtener el nombre de la plantilla de la página (es decir, el nombre legible por el hombre que definió en los comentarios en la parte superior del archivo PHP de la plantilla), Puedes usar este pequeño nugget:

if ( is_page() && $current_template = get_page_template_slug( get_queried_object_id() ) ){
    $templates = wp_get_theme()->get_page_templates();
    $template_name = $templates[$current_template];
}

Quería obtener el nombre de la plantilla porque estaba realmente harta de los nombres de clase tontos y largos que crea la función incorporada WordPress body_class cuando estás usando 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:

add_filter( 'body_class', 'gs_body_classes', 10, 2 );
function gs_body_classes( $classes, $class ){
    if ( is_page() && $current_template = get_page_template_slug( get_queried_object_id() ) ){
        $templates = wp_get_theme()->get_page_templates();
        $template_name = str_replace( " ", "-", strtolower( $templates[$current_template] ) );

        $classes[] = $template_name;
    }

    return $classes;
}

Este filtro tomará lo que sea que nombró su plantilla de página, reemplazará los espacios con guiones y hará que todo esté en minúscula para que se vea como todas las demás clases de WordPress.

    
respondido por el Tom Auger 01.05.2013 - 03:56
0

Hay un problema con la línea preg_match_all . Prueba esto en su lugar:

preg_match_all("/Template Name:(.*)\n/siU",$template_contents,$template_name);

Además, puedes usar if (!is_admin()) { .... } para ejecutar cosas solo en el frontend.

    
respondido por el wyrfel 26.02.2011 - 17:43
0

Juega junto con:

echo '<ul><li>'.implode('</li><li>', str_replace(str_replace('\', '/', ABSPATH).'wp-content/', '', array_slice(str_replace('\', '/', get_included_files()), (array_search(str_replace('\', '/', ABSPATH).'wp-includes/template-loader.php', str_replace('\', '/', get_included_files())) + 1)))).'</li></ul>';

Escrito en:

¿Cómo averigua qué página de plantilla sirve la página actual?

si la ruta admin-bar stuff se muestra en la parte superior, o en cualquier otro archivo, cambie el nombre de archivo template-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 prioridad correcta (más pronto) para asegurarse de que no se ingresen archivos al final de esta lista. Por ejemplo:

add_action('admin_bar_menu', 'my_adminbar_template_monitor', -5);

la prioridad -5 hace que shure se cargue primero. La clave es representar esta línea en el momento adecuado.

No devuelve el archivo de plantilla "actual", sino todo el actual en uso para la carga de página actual. Tal vez "cortar" con un poco de lógica de esa idea .

La clave get_included_files() "último" es el último archivo incluido registrado, probablemente el último archivo de plantilla / parte usado en el pie de página por el widget de barra lateral o algo así. Probablemente, los archivos incluidos porque no se vuelven a registrar / rellenan nuevamente en get_included_files ().

De lo contrario, la intención debe ser clara para solucionar este problema . No hay forma de que un archivo incluido se informe a sí mismo como incluido, hasta que se haya incluido . Entonces es probable que sea tarde para usar el escenario.

La mayor parte del "tiempo" que le gustaría :

$template = get_current_loaded_template();
if($template == 'single-product.php') add_filter('the_title' ....
if($template == 'format-gallery.php') add_action('post_thumbnail' ....

Pero eso no es posible si la plantilla se carga fuera del método principal de Wordpress de get_template_part . ¡Re-diseñe sus necesidades en lugar de otro! Tal vez loop_start() , in_the_loop() y add_action('the_post') tienen la solución que desea, para alterar los datos según la plantilla que se cargará para cada entrada dentro de un bucle.

    
respondido por el Jonas Lundman 15.09.2017 - 08:49
-3
global $post;
$templateName = get_page_template_slug( $post->ID );
//echo $templateName;
var_dump( $templateName );
    
respondido por el Shafi 17.02.2016 - 09:54

Lea otras preguntas en las etiquetas