Получить имя текущего файла шаблона

Я нашел это, чтобы отобразить текущее имя файла, используемого в шаблоне:

function get_template_name () {
    foreach (debug_backtrace () как $ called_file) {
        foreach ($ called_file как $ index) {
            if (! is_array ($ index [0]) И strstr ($ index [0], '/themes /') AND! strstr ($ index [0], 'footer.php')) {
                $ template_file = $ index [0];
            }
        }
    }
    $ template_contents = file_get_contents ($ template_file);
    preg_match_all ("Имя шаблона: (. *) \ 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;
}

Источник: получить имя шаблона страницы на страница

Это работает довольно хорошо, за исключением того, что в бэкэнд в поле выбора шаблона я получаю эту уродливую дополнительную запись:

 screenshot

Кто-нибудь знает, как это исправить? Я даже не знаю, почему эта функция вызывается в бэкэнд. Есть ли такая условная функция, как is_frontend () - возможно, это решит проблему?

54 голоса | спросил chodorowicz 26 FebruaryEurope/MoscowbSat, 26 Feb 2011 18:47:14 +0300000000pmSat, 26 Feb 2011 18:47:14 +030011 2011, 18:47:14

9 ответов


17

очевидно, этого достаточно:

add_action ('wp_head', 'show_template');
function show_template () {
    глобальный шаблон $;
    echo basename (шаблон $);
}

или просто использовать его непосредственно в шаблоне (я хочу, чтобы echo в footer.php в комментарии HTML)

<? php global $ template; echo basename (шаблон $); ? >
ответил chodorowicz 9 PMpSat, 09 Apr 2011 20:25:16 +040025Saturday 2011, 20:25:16
60

Вы можете установить глобальную переменную во время фильтра template_include, а затем позже проверить, что глобальный vairable, чтобы увидеть, какой шаблон был включен.

Вам, естественно, не нужен полный путь вместе с файлом, поэтому я бы рекомендовал обрезать имя файла с помощью функции PHP basename PHP.

Пример кода:
Две функции, одна для установки глобальной, одна для вызова.

add_filter ('template_include', 'var_template_include', 1000);
функция 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'];
    еще
        return $ GLOBALS ['current_theme_template'];
}

Затем вы можете вызвать get_current_template, где вам это нужно, в файлах тем, отметив, что это, естественно, должно произойти после того, как действие template_include было запущено (вам не понадобится беспокоиться об этом, если вызов сделан внутри файла шаблона).

Для шаблонов страниц есть is_page_template (), имея в виду, что это поможет только в случае шаблонов страниц (гораздо меньше catch all ).

Информация о функциях, используемых или упомянутых выше:

ответил t31os 27 FebruaryEurope/MoscowbSun, 27 Feb 2011 03:40:03 +0300000000amSun, 27 Feb 2011 03:40:03 +030011 2011, 03:40:03
16

Между встроенными функциями 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 как $ 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);
ответил Rarst 1 MarpmFri, 01 Mar 2013 22:27:00 +04002013-03-01T22:27:00+04:0010 2013, 22:27:00
8

Добавление (более сладкий код) к другим ответам здесь.

Имя шаблона

Чтобы просто получить текущее шаблон страницы , используйте следующую строку.

is_page () И распечатать get_page_template_slug (get_queried_object_id ());

Имя файла

Если вы хотите просто откликнуться на текущее имя файла шаблона , перейдите к следующему

Изменить: Вот новая версия плагина, завернутого в класс. Он показывает как текущее имя файла шаблона, так и имя файла иерархии шаблонов в конце завершения работы в самой нижней части страницы.

Что плагин говорит вам:

  • Является ли шаблон родительским элементом темы child /current?
  • Является ли шаблон поданным из подпапки? Если да: Сообщает вам имя
  • Имя файла шаблона.

Просто скопируйте следующий код в файл и назовите его wpse10537_template_info.php, загрузите его в свой каталог плагинов и активируйте его.

& л;? PHP
/** Название плагина: (# 10537) Â »kaiser« Получить имя файла шаблона * /

if (! class_exists ('wpse10537_template_name'))
{
    add_action ('plugins_loaded', array ('wpse10537_template_name', 'init'));

class wpse10537_template_name
{
    защищенный static $ instance;

    public $ stack;

    public static function init ()
    {
        is_null (self :: $ instance) И self :: $ instance = new self;
        return self :: $ instance;
    }

    публичная функция __construct ()
    {
        if (is_admin ())
            вернуть;

        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 ())
        {
            $ Этом- > to_stack (
                 "Файл шаблона"
                , basename ($ file)
            );
            return $ file;
        }

        //Возвращение статического var для эхо-вызова вне фильтра
        если (
            current_user_can ('manage_options')
            И определено («WP_DEBUG»)
            И WP_DEBUG
        )
            return print implode ("& ndash;", $ this-> stack);
    }

    public function get_template_file ()
    {
        if (! is_post_type_hierarchical (get_post_type ()))
            вернуть;

        $ slug = get_page_template_slug (get_queried_object_id ());
        if (! strstr ($ slug, "/"))
            return $ this-> to_stack («Шаблон», $ slug);

        $ Этом- > to_stack (
             «Подкаталог»
            , strstr ($ slug, "/", true)
        );

        $ Этом- > to_stack (
             "Шаблон (в подкаталоге)"
            , str_replace ("/", "", strstr ($ slug, "/"))
        );
    }

    public function is_parent_template ()
    {
        if (! is_null (wp_get_theme () -> parent))
            return $ this-> to_stack ('от родительской темы');

        $ this-> to_stack ('от текущей /дочерней темы');
    }

    public function to_stack ($ part, $ item = '')
    {
        $ this-> stack [] = "{$ part}: {$ item}";
    }
} //END Класс wpse10537_template_name

} //endif;

Этот плагин может работать как MU-Plugin.

Затем вы можете просто вызвать wpse10537_get_template_name () в любой момент (например, шаблон темы). Это позволяет избежать загромождения глобального пространства имен.

ответил kaiser 8 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 08 Sep 2012 06:16:18 +0400 2012, 06:16:18
3

Имя шаблона хранится в таблице postmeta, поэтому все, что вам нужно сделать, это поместить это где-то в ваш цикл:

$ template = get_post_meta ($ post-> ID, '_wp_page_template', true);
echo "Шаблон:". $ Шаблон;
ответил Simon Blackbourn 26 FebruaryEurope/MoscowbSat, 26 Feb 2011 20:51:28 +0300000000pmSat, 26 Feb 2011 20:51:28 +030011 2011, 20:51:28
2

Это не относится ко всем вопросам 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);
функция 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.

ответил Tom Auger 1 Mayam13 2013, 05:56:21
0

Возникает проблема с строкой preg_match_all. Вместо этого попробуйте:

preg_match_all ("/Название шаблона: (. *) \ n /siU", $ template_contents, $ template_name);

Кроме того, вы можете использовать if (! is_admin ()) {....} для работы только с интерфейсом.

ответил wyrfel 26 FebruaryEurope/MoscowbSat, 26 Feb 2011 19:43:26 +0300000000pmSat, 26 Feb 2011 19:43:26 +030011 2011, 19:43:26
0

Играйте вместе с:

echo '<ul> <li>'. implode ('</li> <li & gt ;, 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> ';

Написано по адресу:

Как узнать, какая страница шаблона служит для текущей страницы?

, если bar-bar stuff показывает вверху или любой другой файл, измените имя файла template-loader.php в этой строке кода на: filname, с которым вам нужно сломаться.

, если вам нужно это в панели администратора, используйте правильную priotity (самая ранняя) , чтобы сделать shure файлов в конце этого списка. Например:

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

priority -5 сделать shure, который загружает в первую очередь. Ключ должен сделать эту строку в нужный момент.

Он не возвращает «текущий» шаблон-файл, а весь текущий, используемый для текущей загрузки страницы. Может быть, «вырезано» с некоторой логикой из этой идеи .

Ключ get_included_files () «последний» - последний зарегистрированный включенный файл, возможно последний файл-шаблон /часть, используемая в нижнем колонтитуле виджетами боковой панели или что-то в этом роде. Поддерживаемые, cos mutiple включенные файлы не перерегистрируются /заполняются снова в 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') имеет нужное решение, чтобы изменять данные в зависимости от шаблона, который собирается нагрузки для каждой записи в цикле.

ответил Jonas Lundman 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 15 Sep 2017 09:49:57 +0300 2017, 09:49:57
-3
global $ post;
$ templateName = get_page_template_slug ($ post-> ID);
//echo $ templateName;
var_dump ($ templateName);
ответил Shafi 17 FebruaryEurope/MoscowbWed, 17 Feb 2016 11:54:16 +0300000000amWed, 17 Feb 2016 11:54:16 +030016 2016, 11:54:16

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132