Я нашел этот код, чтобы отобразить текущее имя файла, используемого в шаблоне:
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 ;
}
Исчтоник: get name of page template on a page
Это работает довольно хорошо, за исключением того, что в бэкэнде, в поле выбора шаблона, я получаю эту некрасивую дополнительную запись:
У кого-нибудь есть идеи, как это исправить? Я даже не знаю, почему эта функция вызывается в бэкэнде. Существует ли условная функция, такая как is_frontend()
— возможно, это решит проблему?
Можете воспользоваться бесплатным плагином wordpress.org/extend/plugins/display-template-name
Проблема со строкой
preg_match_all
. Попробуйте вместо этого:Кроме того, вы можете использовать
if (! is_admin ()) {....}
для запуска только во внешнем интерфейсе.WP не запрещает вам делать что-либо. Но WP также не обещает вам, что вы можете перебрать debug_backtrace(), чтобы выяснить, какой файл шаблона вы используете. То, что вы нашли его на форуме поддержки WP, не означает, что это официально поддерживаемый код. Как вы можете видеть, ваша функция явно исключает footer.php. Вы также можете добавить другое условие, которое исключает functions.php. Кстати, ваша функция не ищет имя шаблона в каждом из файлов, ваш цикл закончился задолго до этого.
Достаточно: p>
или просто используйте его непосредственно в шаблоне (я склоняюсь к выводу footer.php в комментарии HTML)
Чтобы получить имя включенного файла, вам, вероятно, потребуется использовать что-то вроде этого
echo __FILE__;
Имя шаблона хранится в таблице postmeta, поэтому все, что вам нужно сделать, это поместить это где-то в вашем цикле:
Вы можете установить глобальную переменную во время фильтра
template_include
, а затем позже проверить эту глобальную переменную, чтобы увидеть, какой шаблон был включен.Естественно, вам не нужен полный путь вместе с файлом, поэтому я бы порекомендовал обрезать до имени файла функцию PHP
basename
.Пример кода:
Две функции, одна для установки глобальной, другая для ее вызова.
Затем вы можете вызывать
get_current_template
везде, где вам это нужно в файлах темы, отмечая, что это естественно должно произойти после того, как действиеtemplate_include
сработало (вам не нужно беспокоиться об этом, если вызов выполняется внутри файла шаблона).Для шаблонов страниц есть
is_page_template()
, принимая во внимание, что это поможет только в случае шаблонов страниц.Информация о функциях, использованных или упомянутых выше:
Между нативными функциями WP, такими как
get_template_part()
и нативным PHP, есть самый надежный способ просмотра файлов темы, используемых для извлечения: перечислите все включенные файлы и отфильтруйте все, что не относится к теме (или темам, когда используется родительская и дочерняя комбинация):Название шаблона
Чтобы получить текущее имя шаблона страницы , используйте следующую строку.
Имя файла
Просто скопируйте следующий код в файл и назовите его
wpse10537_template_info.php
, загрузите его в каталог плагинов и активируйте.Этот плагин также может работать как MU-Plugin.
Затем вы можете просто вызвать
wpse10537_get_template_name()
в любой момент (например, в шаблоне темы). Это позволяет избежать загромождения глобального пространства имен.