Obtém o nome do arquivo de modelo atual

54

Encontrei isso para exibir o nome atual do arquivo usado no modelo:

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 ;
}

Fonte: obter o nome do modelo de página em uma página

Funciona muito bem, exceto que, no backend, na caixa de seleção de modelo, recebo essa entrada extra:

Alguém tem alguma ideia de como consertar isso? Eu nem sei porque essa função é chamada no backend. Existe uma função condicional como is_frontend() - talvez isso resolvesse o problema?

    
por chodorowicz 26.02.2011 / 16:47
fonte

9 respostas

17

aparentemente isso é suficiente:

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

ou apenas usá-lo diretamente no modelo (eu tenho a tendência de ecoar em footer.php no comentário HTML)

<?php global $template; echo basename($template); ?>
    
por chodorowicz 09.04.2011 / 18:25
fonte
62

Você pode definir uma variável global durante o filtro template_include e depois verificar essa variável global para ver qual modelo foi incluído.

Você naturalmente não desejaria o caminho completo junto com o arquivo, então eu recomendo truncar o nome do arquivo usando a função basename do PHP.

Exemplo de código:
Duas funções, uma para definir o global, uma para invocá-lo.

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'];
}

Você pode então chamar get_current_template onde quer que seja necessário nos arquivos de tema, observando que isso naturalmente precisa ocorrer após a ação template_include ser disparada (você não precisará se preocupar com isso se a chamada for feita dentro um arquivo de modelo).

Para modelos de página, há is_page_template() , tendo em mente que isso só ajudará no caso de modelos de página (uma função muito menor capturar todos ).

Informações sobre funções usadas ou mencionadas acima:

por t31os 27.02.2011 / 01:40
fonte
16

Entre as funções nativas do WP, como get_template_part () e o nativo do PHP, inclui a maneira mais confiável de ver os arquivos do tema usados. lista de todos os arquivos incluídos e filtrar o que não pertence ao tema (ou temas quando a combinação pai e filho é usada):

$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 );
    
por Rarst 01.03.2013 / 19:27
fonte
8

Uma adição (código mais doce) para outras respostas aqui.

Nome do modelo

Para obter apenas o nome atual do modelo de página , use a seguinte linha.

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

Nome do arquivo

Quando você quiser apenas ecoar o nome do arquivo de modelo atual , siga o seguinte

Edit: Esta é a nova versão do plugin que será incluída em uma classe. Ele mostra o nome do arquivo de modelo atual, bem como o nome do arquivo de hierarquia do modelo no gancho de desligamento na parte inferior da página.

O que o plug-in diz a você:

  • O modelo é o pai do tema filho / atual?
  • O modelo é veiculado em uma subpasta? Se sim: diz a você o nome
  • O nome do arquivo de modelo.

Copie o seguinte código em um arquivo e nomeie-o como wpse10537_template_info.php , carregue-o no diretório de plug-ins e ative-o.

<?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 plugin também pode ser executado como Plugin MU.

Você pode simplesmente chamar wpse10537_get_template_name() a qualquer momento (por exemplo, um modelo de tema). Isso evita bagunçar o espaço de nomes global.

    
por kaiser 08.09.2012 / 04:16
fonte
4

O nome do template é armazenado na tabela postmeta, então tudo que você precisa fazer é colocar isto em algum lugar no seu loop:

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

Isso não aborda todas as perguntas do OP, mas o código abaixo é certamente mais elegante do que as expressões regulares e a análise do próprio arquivo de modelo.

Se você estiver em uma Página que esteja usando um Modelo de Página e desejar obter o Nome do modelo de página (isto é: o nome legível que você definiu nos comentários na parte superior do arquivo PHP do modelo), você pode usar esse pequeno 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];
}

Eu queria obter o nome do modelo porque eu estava realmente farto dos nomes das classes bobas longas que a função body_class do WordPress cria quando você está usando um modelo. Felizmente, há um gancho de filtro no final dessa função para permitir que você anexe seus próprios nomes de classe também. Aqui está o meu filtro. Espero que alguém ache ú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 terá o nome que você tiver dado ao seu modelo de página, substituirá os espaços por traços e fará tudo em minúsculas para que pareça com todas as outras classes do WordPress.

    
por Tom Auger 01.05.2013 / 03:56
fonte
0

Existe um problema com a linha preg_match_all . Tente isso:

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

Além disso, você pode usar if (!is_admin()) { .... } para executar coisas apenas no frontend.

    
por wyrfel 26.02.2011 / 17:43
fonte
0

Jogue com:

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 em:

Como você descobre qual página de modelo está veiculando a página atual?

se admin-bar stuff caminho estiver aparecendo no topo, ou qualquer outro arquivo, mude o nome do arquivo template-loader.php nesta linha de código para: qualquer nome de arquivo que você precise quebrar.

se você precisar disso na barra de administração, use a priotity correta (mais antiga) para garantir que nenhum arquivo seja inserido no final dessa lista. Por exemplo:

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

priority -5 garante que ele seja carregado primeiro. A chave é processar essa linha no momento certo.

Ele não retorna o arquivo de modelo "atual", mas todo o atual em uso para a carga de página atual. Talvez "recorte" com alguma lógica dessa ideia .

A tecla get_included_files() "última" é o último arquivo incluído registrado, provavelmente o último arquivo de modelo / -part usado no rodapé pelo widget da barra lateral ou algo assim. Provavelmente, muitos arquivos incluídos no cos não se registram / preenchem novamente em get_included_files ().

Caso contrário, a intenção deve estar clara para hackear este problema . Não há como um arquivo incluído se reportar como incluído, até que seja incluído . Então é provável que seja tarde para usar o cenário.

A maior parte do "tempo" que você gostaria :

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

Mas isso não é possível se o modelo for carregado fora do método principal do Wordpress de get_template_part . Reprojetar suas necessidades em vez disso! Talvez loop_start() , in_the_loop() e add_action('the_post') tenham a solução desejada, para alterar dados dependendo do modelo que será carregado para cada entrada em um loop.

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

Tags