वर्तमान टेम्पलेट फ़ाइल का नाम प्राप्त करें


57

मैंने टेम्प्लेट में उपयोग की गई फ़ाइल का वर्तमान नाम प्रदर्शित करने के लिए यह पाया है:

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()- शायद यह समस्या को हल करेगा?


2
@chodorowicz - जब मैं functions.phpएक बग के रूप में चयन को कॉल करने से एक कदम कम रोकूंगा , तो मैं आपके आधार के साथ पूरी तरह सहमत हो जाऊंगा । मामलों को बदतर बनाने के लिए मैंने वर्डप्रेस कोर कोड को स्कैन किया और लगभग 5 जगहों पर पाया, जहां आपको इस मुद्दे को संभालने की अनुमति देने के लिए एक हुक हो सकता था फिर भी मुझे कोई भी नहीं मिला। मैं आपको core.trac.wordpress.org पर टिकट पोस्ट करने का सुझाव दूंगा
माइकस्किंकेल

@MikeSchinkel - टिप्पणी के लिए धन्यवाद, लेकिन template_includeहुक नहीं है , जो t31os ने सुझाव दिया, इस मुद्दे को हल करें? या हो सकता है कि मैंने आपको गलत समझा हो।
चोदोरोविज़

1
@ मायकेसिंकेल - यह पहले से ही एक पैच है :) core.trac.wordpress.org/ticket/16689
चोदोरोविक्ज़

1
मैंने वर्तमान टेम्पलेट प्रदर्शित करने के लिए एक नया प्लगइन बनाया है। पर इसकी जांच करें wordpress.org/extend/plugins/display-template-name

4
^ यानी। आपने मेरे उत्तर से कोड लिया और उसे एक प्लगइन में लपेट दिया। और आपने वह सब किया, जो मूल को कोई श्रेय प्रदान किए बिना, न तो खुद को और न ही WP
स्टैकएक्सचेंज

जवाबों:


68

आप 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(), यह ध्यान में रखते हुए कि केवल पेज टेम्प्लेट के मामले में मदद मिलेगी ( सभी फ़ंक्शन को बहुत कम पकड़ें )।

उपर्युक्त या संदर्भित कार्यों पर जानकारी:


बहुत बढ़िया! मुझे पता था कि एक सरल तरीका होना चाहिए।
राश्टला

मेरी डीबगिंग फ़ंक्शन सूची में सबसे ऊपर जोड़ने के लिए एक।
जूल्स

23

स्पष्ट रूप से यह पर्याप्त है:

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

या बस सीधे टेम्पलेट में उपयोग करें (मैं HTML टिप्पणी में footer.php में प्रतिध्वनित करता हूं)

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

1
गेट-टेम्प्लेट-पार्ट के साथ काम नहीं करेगा, इसलिए आप जानते हैं, यह केवल एकल दिखाता है। उदाहरण के लिए (उदाहरण के लिए) और न ही यह फ़ाइल में है।
m-torin

हाँ यह सच हे। शामिल फ़ाइल का नाम पाने के लिए आपको संभवतः कुछ इस तरह का उपयोग करने की आवश्यकता होगीecho __FILE__;
chodorowicz

यह ठीक है, उदाहरण के लिए मामलों में जब आप बैकऑफ़िस में किसी पोस्ट को असाइन किए बिना डिफ़ॉल्ट टेम्पलेट को संशोधित करते हैं। उदाहरण के लिए कस्टम मार्गों और टेम्पलेट_संकल फ़िल्टर का उपयोग करना। धन्यवाद।
लुका रेजेलिन

मैं इसे एक पाश के भीतर कैसे कर सकता हूं? मैं URL को प्रत्येक टेम्पलेट फ़ाइल के एक पृष्ठ पर आउटपुट करने का प्रयास कर रहा हूं।
जैकब डेव

@JacobTheDev शायद का उपयोग कर echo __FILE__- क्योंकि यह काम नहीं करेगा, यह केवल मुख्य, प्रारंभिक टेम्पलेट प्रदर्शित करता है
चोदोरोविज़

17

मूल 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 );

9

अन्य उत्तरों के लिए एक अतिरिक्त (अधिक मीठा कोड) यहाँ।

टेम्पलेट नाम

बस वर्तमान पृष्ठ टेम्पलेट नाम प्राप्त करने के लिए, निम्नलिखित लाइन का उपयोग करें।

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( " &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}";
    }
} // END Class wpse10537_template_name

} // endif;

यह प्लगइन MU-Plugin के रूप में भी चल सकता है।

आप तब wpse10537_get_template_name()किसी भी बिंदु पर कॉल कर सकते हैं (उदाहरण के लिए थीम टेम्पलेट)। यह वैश्विक नाम स्थान को अव्यवस्थित करने से बचता है।


1
template_redirectकुछ भी नहीं गुजर रहा है, मुझे लगता है कि आप के साथ भ्रमित कर रहे हैं template_include। इसके अलावा अगर फिल्टर के अंदर अगर स्टैटिक संस्करण भर जाता है तो मैं जाँच करूँगा। अगर कुछ कोड हुक अतिरिक्त समय चलाने का फैसला करता है तो यह चीजों को नष्ट कर सकता है।
रारस्ट

@ रिस्ट डन / फिक्स्ड। संकेत के लिए धन्यवाद और फ़िल्टर नाम को इंगित करता है।
केसर

5

टेम्प्लेट नाम पोस्टमेटा तालिका में संग्रहीत किया जाता है, इसलिए आपको बस इतना करना है कि इसे अपने पाश में कहीं रखें:

$template = get_post_meta( $post->ID, '_wp_page_template', true );
echo "Template: " . $template;

2
हां, मुझे इस बारे में पता है, लेकिन समस्या यह है कि यह केवल तभी काम करता है जब किसी पृष्ठ पर एक सेट टेम्पलेट होता है। कोड मैं पोस्ट के बारे में अच्छी बात यह है कि यह वर्तमान पृष्ठ का उपयोग कर रहा है, तो आपको बता देंगे है front-page.php, index.php, single.php, page.phpया किसी अन्य फ़ाइल। आपका कोड केवल कस्टम पेज टेम्पलेट वाले पृष्ठों के लिए टेम्पलेट नाम प्रदर्शित करता है।
चोदोरोविक्ज़

आह, क्षमा करें - आपके प्रश्न की मेरी गलतफहमी।
साइमन ब्लैकबोरन

@SimonBlackbourn यह मेरी आवश्यकता के लिए मदद है। धन्यवाद।
करशो

3

यह ओपी के सभी प्रश्नों को संबोधित नहीं करता है, लेकिन नीचे दिए गए कोड निश्चित रूप से नियमित अभिव्यक्तियों की तुलना में अधिक सुरुचिपूर्ण हैं और टेम्पलेट फ़ाइल को पार्स कर रहे हैं।

यदि आप एक पृष्ठ पर हैं जो एक पृष्ठ टेम्पलेट का उपयोग कर रहा है, और आप पृष्ठ टेम्पलेट का नाम प्राप्त करना चाहते हैं (यानी: मानव-पठनीय नाम जिसे आपने अपनी टेम्पलेट 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];
}

मैं टेम्पलेट नाम प्राप्त करना चाहता था क्योंकि मैं वास्तव में मूर्ख-लंबे-गधा वर्ग के नाम से बीमार था जो अंतर्निहित वर्डप्रेस 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;
}

यह फ़िल्टर आपके पेज टेम्प्लेट का नाम जो भी लेगा, वह स्थान को डैश के साथ बदल देगा और सब कुछ कम कर देगा ताकि यह अन्य वर्डप्रेस वर्गों की तरह दिखे।


0

preg_match_allलाइन के साथ एक समस्या है । इसके बजाय यह प्रयास करें:

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

इसके अलावा, आप if (!is_admin()) { .... }केवल फ्रंटएंड पर चीजों को चलाने के लिए उपयोग कर सकते हैं ।


सुझाव के लिए धन्यवाद, वे समस्या का समाधान नहीं करते हैं, लेकिन उन्होंने मुझे समाधान में निर्देशित किया। यह पता चलता है कि WP, टेम्प्लेट सूची बनाते समय, यहां तक ​​कि खोजने में भी लग रहा functions.phpहै "/Template Name:(.*)\n/siU"और इस प्रकार functions.phpटेम्पलेट फ़ाइल के रूप में व्यवहार करता है । मुझे लगता है कि यह WP बग है, यह इस फाइल को भी नहीं देखना चाहिए। समाधान: फ़ाइल को उपनिर्देशिका में स्थानांतरित करें।
चोदोरोविज़

@chodorowicz: यह WP में बग नहीं है, यह आपके फ़ंक्शन में एक बग है।
wyrfel

तो मूल रूप से WP आपको functions.phpफ़ाइल में स्ट्रिंग "टेम्पलेट नाम:" (यहां तक ​​कि टिप्पणी में) डालने के लिए मना करता है । मेरे लिए, व्यक्तिगत रूप से, यह एक बग है, (छोटा, लेकिन वैसे भी) लेकिन यह चर्चा करने के लिए है, मुझे लगता है। मुझे लगता है कि आप यह नहीं कह सकते हैं कि फ़ंक्शन ही छोटी गाड़ी है।
चोदोरोविज़

WP आपको कुछ भी करने से मना नहीं करता है। लेकिन WP आपको यह वादा भी नहीं करता है कि आप एक डिबग_बैकट्रेस () पर लूप कर सकते हैं ताकि यह पता लगाया जा सके कि आप किस टेम्पलेट फ़ाइल का उपयोग कर रहे हैं। सिर्फ इसलिए कि आपने इसे WP समर्थन मंच पर पाया इसका मतलब यह नहीं है कि यह आधिकारिक रूप से समर्थित कोड है। जैसा कि आप देख सकते हैं, आपका फ़ंक्शन स्पष्ट रूप से footer.php की खोज करता है। आप एक और शर्त जोड़ सकते हैं, जो फ़ंक्शन को शामिल करती है। पीपी। BTW: आपका फ़ंक्शन Template Nameप्रत्येक फ़ाइलों के भीतर नहीं दिखता है , आपका लूप उससे बहुत पहले समाप्त हो गया है।
wyrfel

समस्या यह नहीं थी debug_backtrace()- मैं सभी कोड निकाल सकता हूँ और बस छोड़ सकता हूँ preg_match_all("/Template Name..., या यहाँ तक कि बस // Template Name:और WP तो functions.phpटेम्पलेट फ़ाइल के रूप में व्यवहार करता है , लेकिन टिप्पणियों के लिए धन्यवाद - यह एक ऐसी अनोखी समस्या है, जैसा कि आप कहते हैं, यह कहना उचित नहीं है यह एक बग है। t31os समाधान साफ ​​है और पूरे मुद्दे को हल करता है। स्वागत करती हैं।
चोदोरोविज़

0

साथ खेलें:

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);

प्राथमिकता -5यह सुनिश्चित करती है कि यह पहले लोड हो जाए। कुंजी सही समय पर इस लाइन को प्रस्तुत करना है।

यह "वर्तमान" टेम्पलेट-फ़ाइल नहीं लौटाता है, लेकिन वर्तमान पृष्ठ-लोड के लिए उपयोग में सभी वर्तमान। शायद उस विचार से कुछ तर्क के साथ "कट आउट"

get_included_files()"पिछले" कुंजी पंजीकृत फ़ाइल, propably पिछले टेम्पलेट फ़ाइल / साइडबार विजेट या कुछ और से पाद लेख में प्रयुक्त भाग शामिल पिछले है। आमतौर पर, कॉस म्यूटेंट में फ़ाइलें शामिल हैं जो फिर से रजिस्टर / पॉप्युलेट नहीं करती हैं 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')पास जो समाधान है, वह टेम्पलेट के आधार पर डेटा को बदलने के लिए है, जो लूप के भीतर प्रत्येक प्रविष्टि के लिए लोड होने वाला है।


-3
global $post;
$templateName = get_page_template_slug( $post->ID );
//echo $templateName;
var_dump( $templateName );
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.