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

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

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

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

screenshot

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

Понравился вопрос? Нужен ответ? Поддержите проект
WPAsk
Ответов: 10
  1. user16658

    Можете воспользоваться бесплатным плагином wordpress.org/extend/plugins/display-template-name

  2. wyrfel

    Проблема со строкой preg_match_all . Попробуйте вместо этого:

    preg_match_all("/Template Name:(.*)n/siU",$template_contents,$template_name);
    

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

    1. wyrfel

      WP не запрещает вам делать что-либо. Но WP также не обещает вам, что вы можете перебрать debug_backtrace(), чтобы выяснить, какой файл шаблона вы используете. То, что вы нашли его на форуме поддержки WP, не означает, что это официально поддерживаемый код. Как вы можете видеть, ваша функция явно исключает footer.php. Вы также можете добавить другое условие, которое исключает functions.php. Кстати, ваша функция не ищет имя шаблона в каждом из файлов, ваш цикл закончился задолго до этого.

  3. Shafi
    global $post;
    $templateName = get_page_template_slug( $post->ID );
    //echo $templateName;
    var_dump( $templateName );
    
  4. chodorowicz

    Достаточно:

    add_action('wp_head', 'show_template');
    function show_template() {
        global $template;
        echo basename($template);
    }
    

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

    <?php global $template; echo basename($template); ?>
    
    1. chodorowicz

      Чтобы получить имя включенного файла, вам, вероятно, потребуется использовать что-то вроде этого echo __FILE__;

  5. Simon Blackbourn

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

    $template = get_post_meta( $post->ID, '_wp_page_template', true );
    echo "Шаблон: " . $template;
    
  6. t31os

    Вы можете установить глобальную переменную во время фильтра 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() , принимая во внимание, что это поможет только в случае шаблонов страниц.

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

    • is_page_template()
    • add_filter()
    • basename()
  7. Rarst

    Между нативными функциями 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 );
    
  8. kaiser

    Название шаблона

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

    is_page() AND print get_page_template_slug( get_queried_object_id() );
    

    Имя файла

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

    <?php
    /** Plugin Name: 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;
            }
    
            // Возвращает статическую переменную при эхо-вызове вне фильтра
            if (
                current_user_can( 'manage_options' )
                AND defined( 'WP_DEBUG' )
                AND WP_DEBUG 
            )
                return print implode( " &ndash; ", $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}";
        }
    } // Конец класса wpse10537_template_name
    
    } // endif;
    

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

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

Добавить ответ

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: