Eu 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 da página em uma página
Funciona muito bem, exceto que no back-end, na caixa de seleção de modelo, recebo esta entrada extra feia:
Alguém tem alguma idéia de como consertar isso? Nem sei por que essa função é chamada no back-end. Existe uma função condicional como is_frontend()
- talvez isso resolva o problema?
functions.php
bug, eu concordo completamente com sua premissa. Para piorar as coisas, examinei o código principal do WordPress e encontrei cerca de 5 lugares onde poderia haver um gancho para permitir que você lidasse com esse problema, mas não encontrei nenhum. Sugiro que você publique um ticket no core.trac.wordpress.org .template_include
hook, que t31os sugeriu, resolve o problema? Ou talvez eu tenha entendido mal você.Respostas:
Você pode definir uma variável global durante o
template_include
filtro e depois verificar essa variável global para ver qual modelo foi incluído.Você naturalmente não gostaria do caminho completo junto com o arquivo, então eu recomendo truncar o nome do arquivo usando a
basename
função PHP .Código de exemplo:
duas funções, uma para definir o global e outra para chamá-lo.
Em seguida, você pode recorrer
get_current_template
sempre que precisar nos arquivos do tema, observando que isso naturalmente ocorre depois que atemplate_include
ação foi acionada (você não precisará se preocupar com isso se a chamada for feita dentro de um arquivo de modelo).Para os modelos de página
is_page_template()
, lembre-se de que isso só ajudará no caso de modelos de página (muito menos pegar todas as funções).Informações sobre funções usadas ou referenciadas acima:
fonte
aparentemente isso é suficiente:
ou apenas usá-lo diretamente no modelo (eu tendem a ecoar no footer.php no comentário HTML)
fonte
echo __FILE__;
echo __FILE__
- porque isso não vai funcionar, ele apresenta apenas principal, inicial templateEntre as funções nativas do WP, como get_template_part () e o nativo do PHP, a maneira mais confiável de ver os arquivos do tema usados é buscar a 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) :
fonte
Uma adição (código mais interessante) a outras respostas aqui.
Nome do modelo
Para obter apenas o nome do modelo de página atual , use a seguinte linha.
Nome do arquivo
Quando você quiser apenas repetir o nome do arquivo de modelo atual , siga as seguintes
Edit: Aqui está a nova versão do plugin agrupada em uma classe. Ele mostra o nome atual do arquivo de modelo, bem como o nome do arquivo de hierarquia de modelos no gancho de desligamento na parte inferior da página.
O que o plugin diz a você:
Apenas copie o código a seguir em um arquivo e nomeie-o
wpse10537_template_info.php
, faça o upload para o diretório de plugins e ative-o.Este plugin também pode ser executado como MU-Plugin.
Você pode simplesmente ligar
wpse10537_get_template_name()
a qualquer momento (por exemplo, um modelo de tema). Isso evita bagunçar o espaço para nome global.fonte
template_redirect
não está passando nada, acho que você está confusotemplate_include
. Além disso, eu verificaria se dentro do filtro, em vez de se a var estática estiver preenchida. Se algum código decidir executar o gancho por mais tempo, ele poderá danificar as coisas.O nome do modelo é armazenado na tabela postmeta, então tudo o que você precisa fazer é colocar isso em algum lugar do seu loop:
fonte
front-page.php
,index.php
,single.php
,page.php
ou qualquer outro arquivo. Seu código exibe o nome do modelo apenas para páginas com modelo de página personalizado.Isso não trata de todas as questões do OP, mas o código abaixo é certamente mais elegante que as expressões regulares e analisa o próprio arquivo de modelo.
Se você estiver em uma página que está usando um modelo de página e deseja obter o nome do modelo da página (ou seja: o nome legível por humanos que você definiu nos comentários na parte superior do arquivo PHP do modelo), você pode usar esta pequena pepita:
Eu queria obter o nome do modelo porque estava realmente cansado dos nomes de classe idiotas que a
body_class
função interna do WordPress cria quando você está usando um modelo. Felizmente, existe um gancho de filtro no final dessa função para permitir que você adicione também seus próprios nomes de classe. Aqui está o meu filtro. Espero que alguém ache útil:Esse filtro pega o que você nomeou para o modelo da sua página, substitui espaços por hífens e deixa tudo em letras minúsculas para que pareça com todas as outras classes do WordPress.
fonte
Há um problema com a
preg_match_all
linha. Tente isso:Além disso, você pode usar
if (!is_admin()) { .... }
para executar coisas apenas no frontend.fonte
functions.php
encontrar o"/Template Name:(.*)\n/siU"
e, assim, trata ofunctions.php
arquivo como modelo. Eu acho que isso é bug do WP, ele nem deveria olhar para esse arquivo. A solução: mova o arquivo para o subdiretório.functions.php
arquivo. Para mim, pessoalmente, isso é um bug (pequeno, mas mesmo assim), mas é isso que está em discussão, suponho. Eu acho que você não pode dizer que a função em si é de buggy.Template Name
em cada um dos arquivos; seu loop terminou muito antes disso.debug_backtrace()
- eu posso remover todo o código e apenas sairpreg_match_all("/Template Name...
, ou até mesmo apenas// Template Name:
e o WP o tratafunctions.php
como arquivo de modelo, mas obrigado pelos comentários - esse é um problema tão único que, como você diz, não é justo dizer é um bug. A solução t31os é limpa e resolve todo o problema. Cumprimenta.Toque junto com:
Escrito em:
Como você descobre qual página de modelo está servindo a página atual?
se o
admin-bar stuff
caminho estiver aparecendo na parte superior ou em qualquer outro arquivo, altere o nome do arquivotemplate-loader.php
nesta linha de código para: qualquer nome de arquivo do qual você precise interromper.se você precisar disso na barra de administração, use a prioridade certa (antes) para garantir que nenhum arquivo seja inserido no final desta lista. Por exemplo:
prioridade
-5
faça com que ele carregue primeiro. A chave é renderizar essa linha no momento certo.Ele não retorna o arquivo de modelo "atual", mas todo o atual em uso para o carregamento de página atual. Talvez "recorte" com alguma lógica dessa idéia .
A
get_included_files()
tecla "last" é o último arquivo incluído registrado, provavelmente o último arquivo-modelo / parte usado no rodapé pelo widget da barra lateral ou algo assim. Provavelmente, porque os arquivos incluídos em vários arquivos não são registrados / preenchidos novamente em get_included_files ().Caso contrário, a intenção deve ser clara para solucionar esse problema . Não há como um arquivo incluído se reportar como incluído, até que tenha sido incluído . Então é provável que seja tarde demais para usar o cenário.
Na maioria das vezes "você gostaria " :
Mas isso não é possível se o modelo for carregado fora do método principal do Wordpress
get_template_part
. Redesenhe suas necessidades! Talvezloop_start()
,in_the_loop()
eadd_action('the_post')
tenha a solução que você deseja, altere os dados, dependendo do modelo que será carregado para cada entrada em um loop.fonte
fonte