Получить имя текущего файла шаблона
-
-
@chodorowicz - Я остановлюсь на шаге до того,чтобы назвать выбор `functions.php` ошибкой,но я полностью согласен с вашей предпосылкой.Что еще хуже,я просканировал основной код WordPress и нашел около 5 мест,где могла быть ловушка,позволяющая решить эту проблему,но я не нашел ни одного.Я предлагаю разместить заявку на http://core.trac.wordpress.org.@chodorowicz - While I will stop one step short of calling the selection of `functions.php` as a bug, I will agree completely with your premise. To make matters worse I scanned the WordPress core code and found about 5 places where there could have been a hook to allow you to handle this issue yet I found none. I'd suggest posting a ticket on http://core.trac.wordpress.org.
- 2
- 2011-02-26
- MikeSchinkel
-
@MikeSchinkel - спасибо за комментарий,но не решает ли хук `template_include`,предложенныйt31os?Или,может быть,я вас неправильно понял.@MikeSchinkel - thanks for comment, but doesn't `template_include` hook, which t31os suggested, solve the issue? Or maybe I've misunderstood you.
- 0
- 2011-02-27
- chodorowicz
-
@chodorowicz - Вы меня очень запутали.Ответ @t31os решает проблему,которая сильно отличается от той,которую,как я понял,вы задавали,основываясь на своем вопросе и ваших последующих комментариях к ответам других.Но если ответ @t31os решил вашу реальную потребность,тогда мое замешательство здесь неважно,поскольку на ваш вопрос был дан ответ.@chodorowicz - You now have me very confused. The answer @t31os gave solves a problem that is very different from the one that I understood you were asking based on your question and your follow up comments to other's answers. But if @t31os' answer solved your actual need, then my confusion here is unimportant as your question has been answered.
- 0
- 2011-02-27
- MikeSchinkel
-
Да,на самом деле необходимо было отобразить имя файла темы,который используется в данный момент,в опубликованном мною коде была ошибка (которую можно решить,переместив функцию из основной папки темы),но решение @t31os намного чище иудовлетворяет потребность,но,если я правильно вас понял,настоящая проблема (WP не должна пытаться читать `functions.php` как файл шаблона страницы) все еще сохраняется.Попробую выложить наtrac,пока не делал.Приветствия!Yes, the actual need was to display the name of the currently used theme file, the code I posted had a flaw (which can be solved by moving the function out of the main theme folder), but @t31os' solution is much cleaner and fulfills the need, but, if I understand you correctly, the real problem (WP shouldn't try to read `functions.php` as page template file) still persists. I'll try to post it on trac, haven't done it yet. Greetings!
- 0
- 2011-02-27
- chodorowicz
-
@MikeSchinkel - патч уже есть :) http://core.trac.wordpress.org/ticket/16689@MikeSchinkel - it already has a patch :) http://core.trac.wordpress.org/ticket/16689
- 1
- 2011-02-28
- chodorowicz
-
@chodorowicz - Да,мой комментарий касался реальной проблемы,удерживая WP от попыток прочитать `functions.php` и/или позволяя вам написать ловушку для изменения.Рад видеть,что вы нашли патч,а не дублировали его;так сложно найти существующие билеты.@chodorowicz - Yes, my comment was addressing the real problem, keeping WP from trying to read `functions.php` and/or allowing you to write a hook to change was is returned. Glad to see you found a patch rather than duplicate it; it's so hard to find those existing tickets.
- 0
- 2011-02-28
- MikeSchinkel
-
^ т.е.вы взяли код из моего ответа и превратили его в плагин.И все это вы сделали,не указав ни меня,ни меня,ни WP stackexchange ... хорошо ...:/^ ie. you took the code from my answer and wrapped it into a plugin. And you did all that without providing any credit to the origin, neither myself or the WP stackexchange... nice... :/
- 4
- 2014-03-30
- t31os
-
9 ответ
- голосов
-
- 2011-04-09
видимо этого достаточно:
add_action('wp_head', 'show_template'); function show_template() { global $template; echo basename($template); }
или просто используйте его непосредственно в шаблоне (я обычно повторяю его вfooter.php в HTML-комментарии)
<?php global $template; echo basename($template); ?>
apparently this is enough:
add_action('wp_head', 'show_template'); function show_template() { global $template; echo basename($template); }
or just use it directly in template (I tend to echo in footer.php in HTML comment)
<?php global $template; echo basename($template); ?>
-
Это не будет работать сget-template-part,просто чтобы вы знали,он показывает только single.php (например),а не файл,в котором он находится.That won't work with get-template-part just so you know, it only shows single.php (for example) and not the file it is in.
- 1
- 2012-09-25
- m-torin
-
Да,это правда.Чтобы получить имя включенного файла,вам,вероятно,потребуется использовать что-то вроде этого `echo __FILE __;`Yes, it's true. To get the name of included file you'd probably need to use something like this `echo __FILE__;`
- 0
- 2012-10-05
- chodorowicz
-
это нормально,например,в случаях,когда вы изменяете шаблон по умолчанию,не назначая его сообщению в бэк-офисе.Например,используя настраиваемые маршруты и фильтрtemplate_include.Спасибо.this is fine, for example in cases when you modify the default template without assigning it to a post in backoffice. For example using custom routes and the template_include filter. Thank you.
- 0
- 2016-09-15
- Luca Reghellin
-
Как я мог сделать это в цикле?Я пытаюсь вывести URL-адрес на одну страницу каждого файла шаблона.How could I do this within a loop? I'm trying to output the URL to one page of each template file.
- 0
- 2017-02-28
- JacobTheDev
-
@JacobTheDev может использовать `echo __FILE__` - потому что это не сработает,он отображает только основной,начальный шаблон@JacobTheDev maybe using `echo __FILE__` - because this won't work, it displays only main, initial template
- 0
- 2017-03-07
- chodorowicz
-
- 2011-02-27
Вы можете установить глобальную переменную во время фильтра
template_include
,а затем проверить эту глобальную переменную,чтобы увидеть,какой шаблон был включен.Естественно,вам не нужен полный путь вместе с файлом,поэтому я бы рекомендовал обрезать его до имени файла с помощью функции PHP
basename
.Пример кода:
Две функции,одна для установки глобальной,другая для ее вызова.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']; }
Затем вы можете вызывать
get_current_template
в любом месте файлов темы,отмечая,что это,естественно,должно произойти после запуска действияtemplate_include
(вам не понадобится беспокоиться об этом,если вызов выполняется внутри файла шаблона).Для шаблонов страниц существует
is_page_template()
,помните,что это поможет только в случае шаблонов страниц (гораздо менее полезная функция catch all ).Информация об использованных или упомянутых выше функциях:
You could set a global variable during the
template_include
filter and then later check that global vairable to see which template has been included.You naturally wouldn't want the complete path along with the file, so i'd recommend truncating down to the filename using PHP's
basename
function.Example code:
Two functions, one to set the global, one to call upon it.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']; }
You can then call upon
get_current_template
wherever you need it in the theme files, noting this naturally needs to occur after thetemplate_include
action has fired(you won't need to worry about this if the call is made inside a template file).For page templates there is
is_page_template()
, bearing in mind that will only help in the case of page templates(a far less catch all function).Information on functions used or referenced above:
-
- 2013-03-01
Между встроенными функциями WP,такими как get_template_part () ,и встроенными функциями PHP,самый надежный способ просмотра используемых файлов темы - получениесписок всех включенных файлов и отфильтруйте все,что не принадлежит теме (или темам,если используется комбинация родительского и дочернего):
$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 );
Between native WP functions like get_template_part() and PHP's native includes the most reliable way to see theme's files used is to fetch list of all included files and filter out whatever doesn't belong to theme (or themes when parent and child combination is used):
$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 );
-
- 2012-09-08
Дополнение (более приятный код) к другим ответам здесь.
Название шаблона
Чтобы просто получить имя текущего шаблона страницы ,используйте следующую строку.
is_page() AND print get_page_template_slug( get_queried_object_id() );
Имя файла
Если вы просто хотите повторить имя текущего файла шаблона ,используйте следующее
Изменить: вот новая версия плагина,заключенная в класс. Он показывает как текущее имя файла шаблона,так и имя файла иерархии шаблонов в обработчике завершения работы в самом низу страницы.
Что сообщает плагин:
- Является ли шаблон родительским для дочерней/текущей темы?
- Используется ли шаблон из подпапки? Если да: сообщает имя.
- Имя файла шаблона.
Просто скопируйте следующий код в файл и назовите его
wpse10537_template_info.php
,загрузите его в каталог своих плагинов и активируйте.<?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( " – ", $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;
Этот плагин также может работать как MU-Plugin.
Затем вы можете просто вызвать
wpse10537_get_template_name()
в любой точке (например,в шаблоне темы). Это позволяет избежать загромождения глобального пространства имен.An addition (more sweet code) to other answers here.
Template Name
To just get the current page template name, use the following line.
is_page() AND print get_page_template_slug( get_queried_object_id() );
File Name
When you just want to echo the current template file name, go with the following
Edit: Here's the new version of the plugin wrapped up in a class. It shows both the current template file name, as well as the template hierarchy file name in the shutdown hook at the most bottom of the page.
What the plugin tells you:
- Is the template from the parent of child/current theme?
- Is the template served from a subfolder? If yes: Tells you the name
- The template file name.
Just copy the following code into a file and name it
wpse10537_template_info.php
, upload it to your plugins directory and activate it.<?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( " – ", $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;
This plugin can run as MU-Plugin too.
You can then simply call
wpse10537_get_template_name()
at any point (in for example a theme template). This avoids cluttering the global namespace.-
`template_redirect` ничего не передает,я думаю,вы путаете с`template_include`.Также я бы проверил,находится ли внутри фильтра,а не заполнен ли статический var.Если какой-то код решит запустить ловушку дополнительное время,это может привести к поломке.`template_redirect` is not passing anything, I think you are confusing with `template_include`. Also I'd check if inside the filter instead of if static var filled. If some code decides to run hook additional time it can wreck things.
- 1
- 2012-09-15
- Rarst
-
@Rarst Готово/Исправлено.Спасибо за подсказку и указание на название фильтра.@Rarst Done/Fixed. Thanks for the hint and pointing out the filter name.
- 0
- 2012-09-15
- kaiser
-
- 2011-02-26
Имя шаблона хранится в таблицеpostmeta,поэтому все,что вам нужно сделать,это поместить его где-нибудь в свой цикл:
$template = get_post_meta( $post->ID, '_wp_page_template', true ); echo "Template: " . $template;
The template name is stored in the postmeta table, so all you need to do is put this somewhere in your loop:
$template = get_post_meta( $post->ID, '_wp_page_template', true ); echo "Template: " . $template;
-
Да,я знаю об этом,но проблема в том,что это работает только тогда,когда на странице есть заданный шаблон.В опубликованном мной коде замечательно то,что он сообщит вам,использует ли текущая страница `front-page.php`,`index.php`,`single.php`,`page.php` или любой другой файл.Ваш код отображает имя шаблона только для страниц с настраиваемым шаблоном страницы.Yes, I know about this, but the problem is that it works only when a page has a set template. The cool thing about the code I posted is that it will tell you if current page is using `front-page.php`, `index.php`, `single.php`, `page.php` or any other file. Your code displays template name only for pages with custom page template.
- 2
- 2011-02-26
- chodorowicz
-
ах,извините - мое непонимание вашего вопроса.ah, sorry - my misunderstanding of your question.
- 0
- 2011-02-26
- Simon Blackbourn
-
@SimonBlackbourn Это помогает моим требованиям.Благодарю.@SimonBlackbourn It's help for my requirement. Thanks.
- 0
- 2013-10-08
- KarSho
-
- 2013-05-01
Это не касается всего вопроса OP,но приведенный ниже код,безусловно,более элегантен,чем регулярные выражения и анализ самого файла шаблона.
Если вы находитесь на странице,которая использует шаблон страницы,и вы хотите получить имя шаблона страницы (то есть удобочитаемое имя,которое вы определили в комментариях в верхней части файла PHP шаблона),вы можете использовать этот маленький самородок:
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]; }
Я хотел получить имя шаблона,потому что меня действительно тошнило от глупых длинных имен классов,которые создает встроенная функция WordPress
body_class
,когда вы используете шаблон. К счастью,в самом конце этой функции есть перехватчик фильтра,который позволяет вам также добавлять собственные имена классов. Вот мой фильтр. Надеюсь,кто-то сочтет это полезным: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; }
Этот фильтр возьмет все,что вы назвали в шаблоне страницы,заменит пробелы на дефис и сделает все в нижнем регистре,чтобы оно выглядело как все другие классы WordPress.
This doesn't address all of the OP's question, but the code below is certainly more elegant than regular expressions and parsing the template file itself.
If you're on a Page that is using a Page Template, and you want to get the page template's Name (ie: the human-readable name that you defined in the comments at the top of your template PHP file), you can use this little 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]; }
I wanted to get the template name because I was really sick of the silly-long-ass class names that the built-in WordPress
body_class
function creates when you're using a template. Luckily there's a filter hook at the very end of that function to let you append your own class names as well. Here's my filter. Hope someone finds it useful: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; }
This filter will take whatever you named your page template, replace spaces with dashes and make everything lower case so it looks like all the other WordPress classes.
-
- 2011-02-26
Возникла проблема со строкой
preg_match_all
.Попробуйте вместо этого:preg_match_all("/Template Name:(.*)\n/siU",$template_contents,$template_name);
Кроме того,вы можете использовать
if (!is_admin()) { .... }
для запуска вещей только во внешнем интерфейсе.There's an issue with the
preg_match_all
line. Try this instead:preg_match_all("/Template Name:(.*)\n/siU",$template_contents,$template_name);
Also, you can use
if (!is_admin()) { .... }
to run things on the frontend only.-
Спасибо за предложение,они не решают проблему,но они вроде как направили меня на решения.Оказывается,WP при создании списка шаблонов просматривает даже `functions.php`,находит` "/Template Name: (. *) \ N/siU" `и,таким образом,рассматривает`functions.php` как файл шаблона..Я думаю,это ошибка WP,даже не надо смотреть на этот файл.Решение: переместите файл в подкаталог.Thanks for suggestion, they don't solve the problem, but they kinda directed me into solutions. It turns out that WP, while generating templates list, is looking even into `functions.php` finds the `"/Template Name:(.*)\n/siU"` and thus treats the `functions.php` as template file. I think this is WP bug, it shouldn't even look at this file. The solution: move the file into subdirectory.
- 0
- 2011-02-26
- chodorowicz
-
@chodorowicz: Это не ошибка WP,это ошибка вашей функции.@chodorowicz: That's not a bug in WP, it's a bug in your function.
- 0
- 2011-02-26
- wyrfel
-
Таким образом,WP запрещает вам помещать строку «Имя шаблона:» (даже в комментарии) в файл `functions.php`.Лично для меня это ошибка (небольшая,но все же),но,полагаю,это предмет обсуждения.Думаю,нельзя сказать,что глючит сама функция.So basically WP forbids you to put string "Template Name:" (even in comment) in `functions.php` file. For me, personally, that's a bug, (small, but anyway) but that's the up to discussion, I suppose. I think you cannot say that the function itself is buggy.
- 0
- 2011-02-26
- chodorowicz
-
WP не запрещает вам что-либо делать.Но WP также не обещает вам,что вы можете перебрать debug_backtrace (),чтобы узнать,какой файл шаблона вы используете.Тот факт,что вы нашли его на форуме поддержки WP,не означает,что это официально поддерживаемый код.Как видите,ваша функция явно исключаетfooter.php.Вы также можете добавить еще одно условие,исключающееfunctions.php.Кстати: ваша функция не ищет `Template Name` в каждом из файлов,ваш цикл закончился задолго до этого.WP doesn't forbid you to do anything. But WP also doesn't promise you that you can loop over a debug_backtrace() to find out what template file you're using. Just because you found it on a WP support forum doesn't mean it's officially supported code. As you may see, your function explicitly expludes footer.php. You may as well add another condition that excludes functions.php. BTW: your function doesn't look for `Template Name` within each of the files, your loop has ended long before that.
- 0
- 2011-02-27
- wyrfel
-
Проблема была не в `debug_backtrace ()` - я могу удалить весь код и просто оставить `preg_match_all ("/Template Name ... `,или даже просто`//Template Name: `,а WP обрабатывает тогда` функции.php` как файл шаблона,но спасибо за комментарии - это настолько уникальная проблема,что,как вы говорите,несправедливо называть это ошибкой. Решениеt31os чистое и решает всю проблему.The problem wasn't with `debug_backtrace()` - I can remove all the code and just leave `preg_match_all("/Template Name...`, or even just `// Template Name:` and WP treats then `functions.php` as template file, but thanks for comments - this is such a unique problem that, as you say, it's not fair to say it's a bug. t31os solution is clean and solves the whole issue. Greets.
- 0
- 2011-02-27
- chodorowicz
-
- 2017-09-15
Играйте вместе с:
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>';
Написано по адресу:
Как узнать,какой шаблон страницы обслуживает текущую страницу?
если вверху отображается путь
admin-bar stuff
или любой другой файл,измените имя файлаtemplate-loader.php
в этой строке кода на: имя,от которого нужно оторваться.если вам это нужно на панели администратора, используйте правильную приоритетность (самое раннее) ,чтобы убедиться,что в конце этого списка нет файлов. Например:
add_action('admin_bar_menu', 'my_adminbar_template_monitor', -5);
priority
-5
убедитесь,что он загружается первым. Главное - отобразить эту строку в нужный момент.Он не возвращает «текущий» файл шаблона,но возвращает все текущие данные,используемые для текущей загрузки страницы. Может быть,"вырежьте" какую-то логику из этой идеи .
get_included_files()
«последний» ключ - это последний зарегистрированный включенный файл,возможно,последняя часть/файл шаблона,используемая в нижнем колонтитуле виджетами боковой панели или чем-то еще. Вероятно,из-за того,что несколько включенных файлов не повторно регистрируются/не заполняются снова вget_included_files ().В противном случае должно быть ясно намерение взломать эту проблему . Включенный файл не может сообщить о себе как включенный,пока он не был включен . Тогда,вероятно,слишком поздно использовать этот сценарий.
В большинстве случаев вы хотели бы :
$template = get_current_loaded_template(); if($template == 'single-product.php') add_filter('the_title' .... if($template == 'format-gallery.php') add_action('post_thumbnail' ....
Но это невозможно ,если шаблон загружается вне основного метода Wordpress
get_template_part
. Вместо этого измените свои потребности! Возможно,вloop_start()
,in_the_loop()
иadd_action('the_post')
есть решение,которое вы хотите,для изменения данных в зависимости от шаблона,который будет загрузка для каждой записи в цикле.Play along with:
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>';
Written at:
How do you find out which template page is serving the current page?
if
admin-bar stuff
path is showing at the top, or any other file, change the filenametemplate-loader.php
in this line of code to: whatever filname you need to break from.if you need this in the admin bar, use the right priotity (earliest) to make shure no files are entered at the end of this list. For example:
add_action('admin_bar_menu', 'my_adminbar_template_monitor', -5);
priority
-5
make shure it loads first. The key is to render this line at the right moment.It does not returning the "current" template-file, but all the current in use for the current page-load. Maybe "cut out" with some logic from that idea.
The
get_included_files()
"last" key is the last registered included file, propably the last template-file/ -part used in the footer by sidebar widget or something. Propably, cos mutiple included files does not re-register/ populates again in get_included_files().Otherwise, the intension must be clear to hack this problem. There is no way for a included file to report itself as included, until it has been included. Then its propably to late to use the scenario.
Most of the "time" you would like:
$template = get_current_loaded_template(); if($template == 'single-product.php') add_filter('the_title' .... if($template == 'format-gallery.php') add_action('post_thumbnail' ....
But thats not possible if the template is loaded outside Wordpress core method of
get_template_part
. Re-design your needs instead! Maybeloop_start()
,in_the_loop()
andadd_action('the_post')
has the solution you want, to alter data depending of template thats gonna load for each entry within a loop. -
Я нашел это для отображения текущего имени файла,используемого в шаблоне:
Источник: получить имя шаблона страницы на страница
Он работает достаточно хорошо,за исключением того,что в бэкэнде в поле выбора шаблона я получаю эту уродливую дополнительную запись:
Кто-нибудь знает,как это исправить? Я даже не знаю,почему эта функция вызывается в бэкэнде. Есть ли условная функция вроде
is_frontend()
- может,это решит проблему?