मैं प्लगइन से पेज टेम्प्लेट सूची में एक विकल्प कैसे जोड़ सकता हूं?


10

मैं एक प्लगइन के भीतर से एक कस्टम पेज टेम्पलेट बनाने के तरीके के लिए पिछले कुछ घंटों के लिए चारों ओर देख रहा हूं, लेकिन अभी तक कोई भाग्य नहीं था।

मैं विशेष रूप से जो करने की कोशिश कर रहा हूं वह एक पृष्ठ को संपादित करते समय उपलब्ध पृष्ठ टेम्पलेट्स की सूची में एक विकल्प जोड़ने के लिए है, और किसी अन्य विधि का उपयोग नहीं करना जैसेif( is_page( 'page-slug' ) ) { /* etc */ }

क्या कोई वैश्विक चर है जिसे मैं इसे करने के लिए संशोधित कर सकता हूं?

संपादित करें:

मैं वर्तमान में इस कोड का उपयोग कर रहा हूं, लिंक @ m0r7if3r के आधार पर मुझे एक टिप्पणी में दिया गया है, समस्या यह है कि यह फ़ंक्शन पेज को देखते समय चलेगा, लेकिन पेज को संपादित करते समय नहीं (पेज टेम्प्लेट के साथ ड्रॉपडाउन सूची को पॉप्युलेट करने के लिए) :

class JW_SiteGrader {

    private static $instance;

    private function __construct() {


        add_action( 'template_redirect', array( &$this, 'sitegrader_template_redirect' ), 20 );

    }

    public static function getInstance() {

        // Return the class data in a Singleton fashion
        if (self::$instance == null)
            self::$instance = new JW_SiteGrader();
        return self::$instance;

    }

    public function sitegrader_template_redirect() {

        add_filter( 'page_template', array( &$this, 'sitegrader_page_template' ), 10, 1 );

    }

    public function locate_plugin_template( $template_names, $load = false, $require_once = true ) {

        if ( !is_array( $template_names ) )
            return '';

        $located = '';

        $this_plugin_dir = WP_PLUGIN_DIR . '/' . str_replace( basename( __FILE__ ), '', plugin_basename( __FILE__ ) );

        foreach ( $template_names as $template_name ) {

            if ( !$template_name )
                continue;

            if ( file_exists( STYLESHEETPATH . '/' . $template_name ) ) {

                $located = STYLESHEETPATH . '/' . $template_name;
                break;

            } else if ( file_exists( TEMPLATEPATH . '/' . $template_name ) ) {

                $located = TEMPLATEPATH . '/' . $template_name;
                break;

            } else if ( file_exists( $this_plugin_dir .  $template_name ) ) {

                $located =  $this_plugin_dir . $template_name;
                break;

            }

        }

        if ( $load && '' != $located )
            load_template( $located, $require_once );

        return $located;
    }

    public function sitegrader_page_template( $template ) {

        $object = get_queried_object();

        if ( 'page' == $object->post_type ) {

            // New 
            $templates[] = "page-sitegrader.php";
            // Like in core
            $templates[] = "page-{$object->post_type}.php";
            $templates[] = "page.php";

            return locate_template( $templates );  

        }

        // return apply_filters('page_template', $template);
        return $template;
    }

}

2 संपादित करें:

ऐसा लगता है कि यह कार्यक्षमता भविष्य के अद्यतन में जारी की जाएगी, मैंने इस बारे में काफी कुछ टीआरसी टिकट पढ़े और कुछ चर्चा हुई लेकिन कोई वास्तविक उत्तर नहीं मिला (3.4 की उम्मीद है)। ट्रेक टिकट URL की सूची यहां थोड़ा सा दी जाएगी।

3 संपादित करें:

ऊपर दिया गया कोड काम करता है, लेकिन, इस मुद्दे पर मैं केवल एक ही मुद्दा है कि कोई भी टेम्पलेट ड्रॉपडाउन सूची में जोड़ा नहीं जा रहा है जब एक नया पृष्ठ संपादित / जोड़ रहा है। मैं कुछ चीजों की कोशिश कर रहा हूं और जल्द ही अपने सवाल को अपडेट करूंगा।


2
क्या आपने कुछ इस तरह की कोशिश की है ?
mor7ifer

@ m0r7if3r (यदि आप कोशिश करते हैं, तो कृपया एक संदेश छोड़ दें कि यह कैसे काम करता है - धन्यवाद!)
kaiser

@kaiser मैंने उनके द्वारा सुझाए गए कोड की कोशिश की, केवल अनुपलब्ध लिंक को ड्रॉपडाउन सूची में टेम्प्लेट जोड़ने के लिए मेटा बॉक्स प्राप्त करना है (जहाँ तक मुझे पता है!)।
जारेड

@Jared मेरे इस जवाब को एक समान क्यू और संबंधित ट्रेक टिकट के नीचे एक पर देखें। अपना कोड विज्ञापन करें) यदि यह हर पृष्ठ पर नहीं दिख रहा है, तो आप उदाहरण के लिए गलत हुक का उपयोग कर रहे हैं। आप कौन से हुक का उपयोग कर रहे हैं?
कैसर

@kaiser मैं page_templateहुक का उपयोग कर रहा हूं , मेरे संपादन में ऊपर का कोड वह है जो वर्तमान में उपयोग किया जा रहा है। क्या मुझे template_redirectहुक का उपयोग करने की आवश्यकता है और फिर page_templateफ़िल्टर को वहां जोड़ा जाएगा ?
Jared

जवाबों:


4

फिल्टर? किसी को?

नहीं है कोई फिल्टर मदद करने के लिए वहाँ: page_template_dropdown($template);ड्रॉप डाउन निर्माण करने के लिए प्रयोग किया जाता है और यह फ़िल्टर करने योग्य नहीं है।

अस्थायी सरणी में चुपके?

ड्रॉप डाउन सामग्री का निर्माण करने के लिए, कोर मेटा बॉक्स का उपयोग करता है get_page_templates()। अंदर से, फ़ंक्शन निम्न जैसा दिखता है:

$themes = get_themes();
$theme = get_current_theme();
$templates = $themes[$theme]['Template Files'];

लेकिन जब get_themes();तब देखते हैं तो टेम्पलेट्स की सूची को बाधित करने की कोई संभावना नहीं है। इसके अलावा, हमारे पास समस्या है, कि थीम निर्देशिका के बाहर से टेम्पलेट प्राप्त करने का कोई मौका नहीं है ...

... एक थीम फकिंग!

सिद्धांत और यह कमियां है ...

आप register_theme_directory()एक अतिरिक्त थीम निर्देशिका जोड़ने के लिए उपयोग कर सकते हैं जहां आप टेम्पलेट रख सकते हैं। तो सबसे आसान बात यह है कि अपने प्लगइन को थीम फ़ोल्डर के रूप में भी पंजीकृत करना होगा:

// Register during init hook:
register_theme_directory( plugin_dir_path( __FILE__ ).'templates' );

नोट: यह वह जगह है जहां मुझे यकीन नहीं है कि यह काम करेगा

प्लगइन सक्रियण के दौरान: फिर आपको style.css.phpअपने templatesफ़ोल्डर के अंदर एक फ़ाइल रखनी चाहिए । इससे आप अपनी फ़ाइल में चर जोड़ सकते हैं। यह चर तब मूल विषय होगा। और मूल विषय बस वर्तमान में सक्रिय विषय होना चाहिए। फिर अपनी सक्रिय थीम को अपने प्लगइन में अपडेट करें।

ड्राबैक # 2: के बारे में »उपस्थिति« यूआई ... शायद यह ध्यान दें कि यह "थीम" वास्तविक थीम के रूप में उपयोग करने के लिए नहीं है। मैं बाकी »इस विषय को सक्रिय करने से बचें« सामान आपकी कल्पना तक। वैसे भी: यह काम करना चाहिए।

ड्राबैक # 2: यह ट्रिक बच्चे के थीम को सफलतापूर्वक टाल देगा। आपको एक मूल विषय रखने की अनुमति है। और कुछ नहीं।


इसलिए मैं अनुमान लगा रहा हूं कि किसी भी निष्क्रिय विषय से कस्टम पेज टेम्पलेट्स का उपयोग करने का कोई वास्तविक तरीका नहीं है, सही है? मैं एक थीम डायरेक्टरी को रजिस्टर कर सकता था लेकिन टेम्प्लेट उपयोग के लिए तब तक उपलब्ध नहीं होते जब तक कि वह थीम सक्रिय न हो।
जारेड

1
ज़रुरी नहीं। यह सिर्फ होना चाहिए नहीं है और इसलिए कोर की कमी है। क्या आपने ऊपर ipstenu के लिंक की कोशिश की है? मैंने पहले से ही उस मार्ग पर जाने की कोशिश की, लेकिन एक अन्य तरीके से एक मृत तरीके से समाप्त हो गया। सबसे अच्छी शर्त यह होगी कि आप जहां भी हों, टिकटों का अनुसरण करें, उन्हें धक्का दें और लिंक करें। : /
केसर

2

एक संभावित कार्य के लिए सुझाव के रूप में आपने वर्डप्रेस फ़ाइल सिस्टम का उपयोग करके अपने प्लगइन से अपने वर्तमान सक्रिय थीम निर्देशिका में पेज टेम्पलेट फ़ाइल लिखने के लिए विचार किया है? इस प्रक्रिया पर आप कितना नियंत्रण चाहते हैं इसके आधार पर आप अपने प्लगइन को सक्रियण पर फ़ाइल लिख सकते हैं और इसे अनइंस्टॉल पर हटा सकते हैं। वैकल्पिक रूप से आप पृष्ठ टेम्पलेट फ़ाइलों को डायनामिक रूप से अपने प्लग इन यूआई के भीतर से बना सकते हैं, जिसमें कुछ मूल्यों जैसे पेज टेम्पलेट नाम, जो पोस्ट एडिट स्क्रीन के ड्रॉपडाउन बॉक्स में दिखाई देना है, का उपयोग करना चाहिए। आप एक बटन के क्लिक पर अपने प्लगइन UI के भीतर से पेज टेम्पलेट को सिद्धांत रूप में निकाल सकते हैं और इसी तरह विभिन्न उद्देश्यों के लिए कई टेम्पलेट जोड़ सकते हैं। ओटो के ब्लॉग पर फ़ाइल सिस्टम का उपयोग करने पर एक अच्छी पोस्ट है। मेरे पास अब मेरे साथ लिंक नहीं है लेकिन आप इसके लिए खोज कर सकते हैं।

मुझे आशा है कि वे अगले कोर रिलीज में एक हुक के माध्यम से जो आप करना चाहते थे, उसे जारी करेंगे।


1
मेरे पास पहले से इस तरह काम करने का एक तरीका था, लेकिन जब मैंने इसे आज़माया तो बहुत सारे मुद्दे वापस आ गए थे, क्योंकि जब कोई उपयोगकर्ता थीम स्विच करेगा, तो यह टेम्पलेट फ़ाइल को नहीं हटाएगा और यदि वे अपने सक्रिय विषय को कॉपी करके किसी अलग साइट पर डालेंगे। , वे एक कस्टम टेम्पलेट फ़ाइल अपलोड करने का जोखिम लेंगे जो काम नहीं करेगा। मुझे पता है कि इसके लिए कई वर्कअराउंड हैं, लेकिन मैं वास्तव में चाहता हूं कि यह स्वचालित हो । सुझाव के लिए हालांकि +1।
जारेड

1
हाय जारेड, मैं भी इसी मुद्दे पर चिंतित था। एकमात्र विकल्प जो मैं सोच सकता था कि इस वैकल्पिक विधि को और आगे बढ़ाया जा सकता है, यह है कि सक्रियण को वर्तमान थीम का नाम मिल जाए, तो यदि कोई उपयोगकर्ता / थीम को निष्क्रिय कर देता है, तो आप उस थीम से टेम्पलेट फ़ाइल को हटा सकते हैं और इसे नए सक्रिय में फिर से लिख सकते हैं। विषय। इस लिंक पर एक नज़र डालें जहाँ उन्होंने विषयों की जाँच के लिए अपनी सक्रियता / निष्क्रियता हुक बनाया। थोड़ा अतिरिक्त कोड के साथ मुझे लगता है कि यह सक्षम है।
एडम

बिल्कुल, मुझे लगता है कि काम हो सकता है। मैं इसे जाने देता हूं और अपने प्रश्न में परिणाम पोस्ट करता हूं। लिंक के लिए धन्यवाद, यह मदद करता है!
जारेड

1

मैंने स्रोत के माध्यम से एक ब्राउज़ लिया, और काफी चौंकाने वाला ऐसा करने का कोई तरीका नहीं दिखता है! मेरा सुझाव दिया हैक एक विषय ओवरराइड / दूसरे विषय ड्रॉपडाउन के साथ एक दूसरा मेटा बॉक्स जोड़ना होगा। तो इस फिल्टर में हुक:

# wp-includes/theme.php line 751 in 3.3.1:
return apply_filters( "{$type}_template", locate_template( $templates ) );

यदि यह ओवरराइड हो गया है तो अपनी थीम फाइल वापस करने के लिए। बेशक, आप केवल add_filter करना चाहते हैं यदि यह वह पोस्ट है जो आप चाहते हैं।

यदि आप फैंसी बनना चाहते हैं, तो आप मूल बॉक्स को स्क्रैप कर सकते हैं और इसे फिर से बना सकते हैं (निश्चित रूप से फिल्टर के माध्यम से, कोर कोड को संशोधित नहीं कर सकते)।

मैं उस कार्यक्षमता का अनुरोध करते हुए एक टीआरसी टिकट जोड़ने का सुझाव भी दूंगा (यदि इसके लिए वहां पहले से कोई नहीं है)।


1
wc के लिए इस पर सहमत w / सुझाव दें।
१३:१२ पर हेलगेटेवीकिंग

यह पहले से ही trac में लगता है: core.trac.wordpress.org/ticket/15803
Jared

1
मैं सिर्फ एक पोस्ट प्रकार के टेम्पलेट्स के बारे में एक और क्यू के लिए यह जांच की । उत्तर के अंत में आप Trac टिकट पा सकते हैं। चलो 3.4 के लिए आशा करते हैं।
कैसर

1

मैंने डिफ़ॉल्ट पृष्ठ टेम्प्लेट मेटाबॉक्स को हटाकर और फिर अपनी स्वयं की मेटाबॉक्स को जोड़कर इसे पूरा किया है। मेरे पास get_page_templates में निर्मित नया मेटाबॉक्स का उपयोग था और फिर मुझे प्रोग्राम में दूसरों की ज़रूरत थी। एक सेव पर यह पेज टेम्पलेट को उसी तरह अपडेट कर सकता है जैसे वर्डप्रेस करता है।


क्या आप पूरा कोड दिखाना चाहेंगे? वर्तमान में यह केवल एक कठिन अवधारणा है। धन्यवाद।
काजेर

1

हुक का theme_page_templatesउपयोग करें, द्वारा उपयोग किया जाता हैget_page_templates फ़ंक्शन , फ़िल्टर 4.4 में अद्यतन 3.9 के बाद से जोड़ा गया:

apply_filters( 'theme_page_templates', $page_templates, $this, $post );

अधिक पूरी तरह से यहाँ समझाया: wordpress.stackexchange.com/a/255820/75495
cjbj

-2

DuckDuckGo के साथ एक सर्च रिजल्ट में एक वर्डप्रेस पेज टेम्प्लेट जोड़ा गया, जिसका जवाब मेरे लिए wpmu.org पेज पर वर्डप्रेस कस्टम पेज टेम्प्लेट ट्यूटोरियल नाम के पेज पर दिया गया ।

मूल रूप से, थीम डायरेक्टरी, wp-content / themes / your-theme के अंदर , मौजूदा पेज टेम्प्लेट को अपनी पसंद के नए php फ़ाइल नाम में कॉपी करें। नई फ़ाइल को संपादित करें, जादू को बदलने के लिए ध्यान रखना "टेम्पलेट का नाम:" फ़ाइल के शीर्ष पर टिप्पणी में संपत्ति का मूल्य।

बस इतना ही करना था। यह संभव है कि यह एक विशेषता है जो प्रश्न को पोस्ट-डेट करता है। मैं बीस_ विषय के साथ WP 3.5 का उपयोग कर रहा हूं।

यह भी संभव है कि किसी विषय का विस्तार करने के लिए क्लीनर तरीके हैं। इस तरह के संपादन को थीम अपडेट द्वारा अधिलेखित किया जा सकता है। मेया कुल्पा।


मुझे एक थीम से ड्रॉपडाउन सूची में टेम्पलेट जोड़ने के लिए एक समाधान की आवश्यकता है, न कि थीम की। :(
जेरेड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.