Я нашел это, чтобы отобразить текущее имя файла, используемого в шаблоне:
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 ;
}
Источник: получить название шаблона страницы на странице
Это работает довольно хорошо, за исключением того, что в бэкэнде, в поле выбора шаблона, я получаю эту некрасивую дополнительную запись:
У кого-нибудь есть идеи, как это исправить? Я даже не знаю, почему эта функция вызывается в бэкэнде. Есть ли условная функция, как is_frontend()
- может быть, это решит проблему?
functions.php
ошибкой, я полностью согласен с вашей предпосылкой. Чтобы усугубить ситуацию, я отсканировал основной код WordPress и нашел около 5 мест, где мог бы быть хук, позволяющий решить эту проблему, но я не нашел ни одного. Я бы предложил разместить тикет на core.trac.wordpress.org .template_include
перехват, который предложил t31os, решить проблему? Или, может быть, я вас неправильно понял.Ответы:
Вы можете установить глобальную переменную во время
template_include
фильтра, а затем проверить эту глобальную переменную, чтобы увидеть, какой шаблон был включен.Естественно, вам не нужен полный путь вместе с файлом, поэтому я бы порекомендовал обрезать до имени файла
basename
функцию PHP .Пример кода:
две функции, одна для установки глобальной, другая для ее вызова.
Затем вы можете вызывать все, что
get_current_template
вам нужно, в файлах темы, отмечая, что это естественно должно произойти послеtemplate_include
запуска действия (вам не нужно беспокоиться об этом, если вызов выполняется внутри файла шаблона).Для шаблонов страниц есть
is_page_template()
, имея в виду , что только поможет в случае шаблонов страниц (гораздо меньше , поймать все функции).Информация о функциях, используемых или упомянутых выше:
источник
видимо этого достаточно
или просто использовать его непосредственно в шаблоне (я склонен выводить его в footer.php в комментарии HTML)
источник
echo __FILE__;
echo __FILE__
- потому что это не будет работать, он отображает только основной, исходный шаблонМежду нативными функциями WP, такими как get_template_part () и нативным PHP, наиболее надежным способом просмотра файлов темы является получение списка всех включенных файлов и отфильтровывание того, что не принадлежит теме (или темам, когда используется родительская и дочерняя комбинации). :
источник
Дополнение (более приятный код) к другим ответам здесь.
Имя Шаблона
Чтобы просто получить имя шаблона текущей страницы , используйте следующую строку.
Имя файла
Если вы просто хотите отобразить текущее имя файла шаблона , перейдите к следующему
Изменить: Вот новая версия плагина, завернутый в класс. Он отображает как текущее имя файла шаблона, так и имя файла иерархии шаблонов в обработчике завершения работы в самой нижней части страницы.
Что плагин говорит вам:
Просто скопируйте следующий код в файл и назовите его
wpse10537_template_info.php
, загрузите в каталог плагинов и активируйте его.Этот плагин может работать как MU-плагин тоже.
Затем вы можете просто позвонить
wpse10537_get_template_name()
в любой момент (например, в шаблоне темы). Это позволяет избежать загромождения глобального пространства имен.источник
template_redirect
не проходит ничего, я думаю, что вы путаете сtemplate_include
. Также я бы проверил, если внутри фильтра, а не заполнен ли статический var Если какой-то код решит запустить ловушку дополнительное время, это может испортить вещи.Имя шаблона хранится в таблице postmeta, поэтому все, что вам нужно сделать, это поместить это где-то в вашем цикле:
источник
front-page.php
,index.php
,single.php
,page.php
или любой другой файл. Ваш код отображает имя шаблона только для страниц с пользовательским шаблоном страницы.Это не решает всех вопросов OP, но приведенный ниже код, безусловно, более элегантен, чем регулярные выражения и синтаксический анализ самого файла шаблона.
Если вы находитесь на странице, которая использует шаблон страницы, и вы хотите получить имя шаблона страницы (то есть: удобочитаемое имя, которое вы определили в комментариях в верхней части вашего файла PHP шаблона), вы можете использовать этот маленький самородок:
Я хотел получить имя шаблона, потому что мне надоели глупые имена классов, которые встроенная
body_class
функция WordPress создает при использовании шаблона. К счастью, в самом конце этой функции есть фильтр, позволяющий вам также добавлять собственные имена классов. Вот мой фильтр. Надеюсь, кто-то найдет это полезным:Этот фильтр будет использовать любой названный вами шаблон страницы, заменять пробелы тире и делать все строчными, чтобы он выглядел как все другие классы WordPress.
источник
Есть проблема с
preg_match_all
линией. Попробуйте это вместо этого:Кроме того, вы можете использовать
if (!is_admin()) { .... }
для запуска вещи только на веб-интерфейс.источник
functions.php
находки"/Template Name:(.*)\n/siU"
и таким образом обрабатываетfunctions.php
файл как шаблон. Я думаю, что это ошибка WP, она даже не должна смотреть на этот файл. Решение: переместить файл в подкаталог.functions.php
файл. Лично для меня это ошибка (небольшая, но в любом случае), но я думаю, что это вопрос обсуждения. Я думаю, вы не можете сказать, что сама функция глючит.Template Name
в каждом из файлов, ваш цикл закончился задолго до этого.debug_backtrace()
я могу удалить весь код и просто уйтиpreg_match_all("/Template Name...
, или даже просто,// Template Name:
и WP обрабатывает егоfunctions.php
как файл шаблона, но спасибо за комментарии - это такая уникальная проблема, что, как вы говорите, нечестно сказать это ошибка Решение t31os является чистым и решает всю проблему. Здоровается.Играть вместе с:
Написано по адресу:
Как вы узнаете, какая страница шаблона обслуживает текущую страницу?
если
admin-bar stuff
путь отображается вверху, или любой другой файл, измените имя файлаtemplate-loader.php
в этой строке кода на: любое имя файла, из которого вам нужно отказаться.если вам это нужно в админ-панели, используйте правильную привилегию (как можно раньше), чтобы убедиться, что в конце списка нет файлов . Например:
приоритет
-5
сделать так, чтобы он загружался первым. Ключ должен сделать эту линию в нужный момент.Он не возвращает «текущий» шаблон-файл, но все текущие, используемые для текущей загрузки страницы. Может быть, "вырезать" с некоторой логикой из этой идеи .
get_included_files()
«Последний» ключ последний зарегистрированный включаемый файл, Propably последний шаблон-файл / -часть используется в сноске на боковой панели виджетов или что - то. Вероятно, потому что несколько включенных файлов не перерегистрируются / заполняются снова в get_included_files ().В противном случае, намерение должно быть ясно, чтобы взломать эту проблему . Включенный файл не может сообщить о себе как включенный, пока он не будет включен . Тогда, вероятно, поздно использовать сценарий.
Большую часть «времени» вам бы хотелось:
Но это невозможно, если шаблон загружен вне основного метода Wordpress
get_template_part
. Перепроектируйте свои потребности вместо этого! Может бытьloop_start()
,in_the_loop()
иadd_action('the_post')
есть решение, которое вы хотите, чтобы изменить данные в зависимости от шаблона, который будет загружаться для каждой записи в цикле.источник
источник