चाइल्ड_टम से पहले parent_theme functions.php लोड कैसे करें?


12

मुझे समस्या यह हुई कि मुझे functions.phpअपने बच्चे की functions.phpफ़ाइल के लोड होने से पहले अपने माता-पिता की फ़ाइल लोड करनी होगी । यह सेटअप और init प्रक्रिया के लिए आवश्यक है। मैंने /wp_core_root/wp-settings.php (नाम:) के अंदर हुक को देखा do_action('setup_theme');

समस्या यह है कि मैं नहीं जानता कि कैसे हुक करना है, क्योंकि मुझे जो पहली फ़ाइल मिलती है वह बच्चे की थीम है functions.php, इसलिए कोई add_action( 'setup_theme', 'my_init_function' );काम नहीं करेगा।

संपादित करें:
a) मुझे पता है कि प्लगइन्स थीम से पहले लोड होते हैं और इसलिए प्रारंभिक क्वेरी तक भी पहुंच सकते हैं, लेकिन मैं एक प्लगइन पर भरोसा नहीं करना चाहता।
b) यहाँ wp-settings.php फ़ाइल से कोड (छोटा) है

// happens a lot earlier:  
do_action( 'plugins_loaded' );

// localize stuff happening here
    do_action( 'setup_theme' );

        // Load the functions for the active theme, for both parent and child theme if applicable.
        if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) )
            include( STYLESHEETPATH . '/functions.php' );
        if ( file_exists( TEMPLATEPATH . '/functions.php' ) )
            include( TEMPLATEPATH . '/functions.php' );
    // first available hook, *after* functions.php was loaded
    do_action( 'after_setup_theme' );

मैं दो चीजों से बचना चाहता हूं: पहले उपयोगकर्ताओं को बहुत सारी व्याख्या। दूसरा मौका है कि किसी को कुछ भी टूट जाता है अगर माता-पिता की init प्रक्रिया को गलती से हटाने के साथ रस्सी कट जाती है। लोग बिना कुछ जाने समझे कुछ भी तोड़ने के लिए बस टास्क के अंदर खेलते रहेंगे।

दूसरे शब्दों में: मैं अपने बच्चे के विषयों को कैसे रखूं?

कोई विचार? आपका बहुत बहुत धन्यवाद!


क्या आप इसे शामिल नहीं कर सकते?
11

मेरा सवाल है: कहां से? थीम के संदर्भ में लोड होने वाली पहली फाइल चाइल्ड थीम की है functions.phpwp-settings.phpकोर में "मोल्टो लोको" फ़ाइल पर एक नज़र डालें (लाइन: 275-279 @wp 3.1 आरसी) ... इस तरह दिखता है: if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) ) include( STYLESHEETPATH . '/functions.php' ); if ( file_exists( TEMPLATEPATH . '/functions.php' ) ) include( TEMPLATEPATH . '/functions.php' );इसलिए मैं मौका नहीं देख सकता ... और मैं उपयोग नहीं करना चाहता मेरी थीम बूटस्ट्रैप करने के लिए एक प्लगइन।
कैसर

मैं यहाँ कुछ पूरी तरह से याद कर रहा हूँ, लेकिन अगर आप include(/path/to/parent/themes/functions.php)अपने बच्चे के विषयों में सबसे ऊपर कार्य करते हैं। नहीं?
wyrfel

@ वायफेल: मैंने क्यू को अद्यतन करने के लिए इसे और अधिक स्पष्ट किया
kaiser

मैं देखता हूं, धन्यवाद, यह अब बहुत स्पष्ट है। साथ ही मैंने मान लिया कि आप केवल एक ही इंस्टाल के लिए ऐसा कर रहे थे।
wyrfel

जवाबों:


11

जस्टिन टडलॉक ने हाल ही में एक बेहतर कार्य करने के बारे में एक शानदार पोस्ट लिखा है। एफपी फाइल
जहां (अगर मुझे सही याद है) तो वह इस सटीक मुद्दे से निपटता है।

दुर्भाग्य से उनकी साइट इस समय नीचे है, इसलिए मुझे अपनी स्मृति पर अभी से भरोसा करना होगा।

आप after_setup_themeहुक के साथ सही रास्ते पर हैं ।

  1. जहाँ तक मुझे याद है चाल अपने फिल्टर और कार्यों को लपेटने में है।
    नीचे उदाहरण देखें।
  2. आप माता-पिता और बच्चे दोनोंfunctions.php फ़ाइलों में ऐसा करते हैं।
  3. फिर आप इन दो हुक की प्राथमिकता के साथ खेल सकते हैं।

हजार शब्दों का थोड़ा सा कोड - आपके मूल विषय function.phpको इस तरह देखना चाहिए:

add_action( 'after_setup_theme', 'your_parent_theme_setup', 9 );
function your_parent_theme_setup() {    
    add_action(admin_init, your_admin_init);
    add_filter(the_content, your_content_filter);
}

function your_admin_init () {
...
}

function your_content_filter() {
...
}

एह, लिखने के लिए धन्यवाद (+1)। आपको एक प्रभावशाली मस्तिष्क मिला;) समस्या यह है कि after_setup_themeबहुत देर हो चुकी है, क्योंकि फ़ंक्शंस.php फ़ाइलें पहले ही लोड की गई थीं।
कैसर

संपादित करें: अपने कोड को पुनर्विचार करने और पढ़ने के बाद "माता-पिता और बच्चे दोनों के कार्यों में ऐसा करें।" फिर भी एक बेहतर समाधान की खोज करना जो उपयोगकर्ता को आसान नहीं तोड़ सकता है, लेकिन यह समझ में आता है! धन्यवाद!
कैसर

यहां कोई वास्तविक समाधान नहीं है, इसलिए मैं इसे चिह्नित करता हूं, क्योंकि आप इसे प्रस्तावित करने वाले पहले व्यक्ति थे।
कैसर

9

सबसे पहले, आप नहीं कर सकते। बच्चे की थीम के फ़ंक्शन। पीपीपी हमेशा पहले लोड होती है, अवधि।

दूसरा, थीम setup_theme को हुक नहीं कर सकता है। प्लगइन्स कर सकते हैं, लेकिन पहली बात एक विषय हुक कर सकते हैं after_setup_theme है।

यदि आपके माता-पिता को सही तरीके से डिज़ाइन किया गया है, तो बच्चा माता-पिता में कार्यों और सामान को ओवरराइड करने में सक्षम है, लेकिन केवल जब यह पहले लोड होता है।

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


आपके उत्तर के लिए धन्यवाद। मैं विषयों से पहले प्लगइन्स लोड करने की आवश्यकता को समझता हूं और पहले से ही इस तथ्य को महसूस कर चुका हूं (ऊपर पढ़ें: "और मैं अपनी थीम बूटस्ट्रैप करने के लिए प्लगइन का उपयोग नहीं करना चाहता हूं।")। मेरे मामले को विस्तृत करने के लिए: मुझे एक आईएनआई फ़ाइल मिली है जो मेरे सभी फ्रेमवर्क भागों को लोड करने की परवाह करती है, जो कि मूल विषयों में शुरू होती है फ़ाइल की आवश्यकता और इन-क्लास को लोड करने के साथ php। InitClass को चाइल्ड थीम .ini-files से डेटा) और सरणी लोड करने की परवाह है और फिर इसे आगे की प्रक्रिया के लिए अलग कक्षाओं में धकेल दिया जाता है। मेटा बॉक्स, कस्टम पोस्ट प्रकार, आदि
kaiser

मेरी समस्या यह है कि मुझे अपने माता-पिता के कार्यों से यह सब प्राप्त करना है। फाइल फ़ाइल, तो एक सामान्य उपयोगकर्ता इसे तोड़ नहीं सकता है, जब बच्चे के विषय के अंदर खेल रहा है। मेरी दूसरी समस्या यह है कि उन सभी वर्गों को बाल विषय के फंक्शन्स.php फ़ाइल के अंदर उपलब्ध नहीं है, इसलिए वे किसी काम के नहीं हैं ... लेकिन शायद मुझे यहाँ एक बड़ी सोच त्रुटि मिली । कैसे बेहतर बनाने के लिए कोई विचार या सुझाव?
kaiser

3
.... मुझे लगता है कि आप इस तथ्य को स्वीकार करने वाले हैं कि यदि कोई उपयोगकर्ता चीजों को तोड़ता है, तो यह वास्तव में उनकी समस्या है। नीचे पंक्ति: मूल विषय के कार्यों को लोड करने का कोई तरीका नहीं है। सबसे पहले और बच्चे के विषय "स्वच्छ" को छोड़ दें। अगर आपको पेरेंट थीम के फंक्शंस के बाद चलने के लिए चाइल्ड थीम में कुछ चाहिए। फाइल लोड हो गई है, तो आप इसे after_setup_theme के लिए कांटेक्ट किए गए फंक्शन के अंदर रख देते हैं। दोनों फंक्शंस के बाद चलता है। एफपी फाइलें लोड होती हैं।
ओटो

ठीक है। यह इतनी बड़ी समस्या नहीं है। अगर कोई संभावना है तो मैं सिर्फ इंटरसेस्ट हूं। प्रश्न: "नमक के लायक फ्रेमवर्क" के लिए क्या होता है, फिर इनिट प्रक्रिया के बाद हुक होता है और केवल after_setup_themeहुक का उपयोग नहीं करता है ? बस हुक "स्पैम" नहीं करने के लिए, या क्योंकि यह अधिक "एंटरप्रीसी" या "कूल" एर है? मेरा मतलब है: थीम विशिष्ट समानांतर हुक "प्लगइन्स के लिए कोर हुक" के पीछे "सबसे अच्छा अभ्यास" विचार है? (यही कारण है कि मैं इसे वर्तमान में संभालता हूं।)
kaiser

"यदि आप उस पर जा रहे हैं, तो अतिरिक्त कार्रवाई से परेशान न हों। बस after_setup_theme को हुक करें।" ठीक है। धन्यवाद। +1
केसर

4

इसलिए आप बच्चे के फंक्शन्स.php से कोड निष्पादित करने की कोशिश कर रहे हैं, लेकिन मूल विषय लोड होने के बाद। सरल, बस एक कस्टम क्रिया का उपयोग करें:

के अंत में parent/functions.php:

do_action('parent_loaded');

में child/functions.php:

function parent_loaded() {
    // do init stuff
}
add_action('parent_loaded', 'parent_loaded');

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


मैं यथासंभव अधिक से अधिक निर्देशों से बचने की कोशिश करता हूं। यही कारण है कि मैं बाल थीम फ़ोल्डर में config.php फ़ाइल से स्विच किया गया और अब इसके बजाय ini फ़ाइलों का उपयोग करता हूं। एक वाक्य में: मैं अपने पुराने / अपने समाधान से दूर जाने और जितना संभव हो सके कोर और कोडेक्स के करीब पहुंचने की कोशिश करता हूं। मेरी समस्या यह है कि मैं चाइल्ड थीम से एक भी फंक्शन डिलीवर नहीं कर सकता, क्योंकि मेरे बूटस्ट्रैप में से कोई भी क्लास या बाकी चाइल्ड थीम फंक्शन के अंदर उपलब्ध नहीं है। फाइल (कस्टम / फ्रेमवर्क टेम्प्लेट टैग के बारे में नहीं)
कैसर

अद्यतन उत्तर देखें।
स्क्रीबू

मैंने क्यू को भी अपडेट किया। यह पढ़ने के बाद कि 2/3 उत्तर मुझे उसी स्रोत (विषयगत, आपके संपादन से पहले) की ओर इशारा करते हैं, मुझे लगता है कि इसमें "जस्टिन टैडलॉक" विधि शामिल है, लेकिन मैं यह सुनिश्चित करना चाहता हूं।
कैसर

2
यदि आप उस पर जा रहे हैं, तो अतिरिक्त कार्रवाई से परेशान न हों। बस after_setup_theme को हुक करें।
ओटो

0

आप इस तरह से functions.phpचाइल्ड थीम की functions.phpफाइल में पेरेंट थीम की फाइल को शामिल क्यों नहीं करते हैं :

बच्चे के विषय की functions.phpफाइल में:

if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( TEMPLATEPATH . '/functions.php' ) )
            include( TEMPLATEPATH . '/functions.php' );

// code of child theme's functions.php file continues here

इस तरह, मूल विषय की functions.phpफ़ाइल नहीं बदली जाती (कभी-कभी यह महत्वपूर्ण होती है)।


जैसा कि Q में उल्लेख किया गया है: "दूसरे शब्दों में: मैं अपने बच्चे के विषयों को कैसे रखूं। फ़ंक्शन फ़ाइल को साफ करें, लेकिन क्या मूल विषय बूटस्ट्रैप किया गया है?" इससे भी बेहतर: मैं किसी भी फ़ंक्शन के अंदर कॉल से कैसे बच सकता हूं। पीएफ फ़ाइल? क्यों: लोगों को हर बकवास का उपयोग करने के लिए उपयोग किया जाता है जो वे टेम्पलेट फ़ाइलों में नहीं रखना चाहते हैं। तो एक उच्च संभावना है कि कोई व्यक्ति कुछ लाइनों को गलती से हटा देता है। मेरा अनुभव: कोई भी वास्तव में टिप्पणी, रीडमी या प्रलेखन नहीं पढ़ता है।
कैसर

0

मेरे पास पहले भी ऐसा ही एक मुद्दा था और मैं इसे माता-पिता में एक अतिरिक्त खाली "चाइल्ड-फ़ंक्शन्स.php" बनाकर ठीक करता हूं और फ़ाइनल / फ़ंक्शंस के ठीक बाद "फंक्शन्स। ऍफ़पी" (पेरेंट में भी) शामिल करता हूँ, जिसे मैं बच्चे में इस्तेमाल करना चाहता हूँ, आदि फिर चाइल्ड थीम में मैं एक "चाइल्ड-फंक्शन्स.php" फाइल बनाता हूं और वहां पर मैं चाइल्ड फंक्शन्स की नकल करना शुरू कर सकता हूं। पेरेंट के सुरुचिपूर्ण तरीके से हल न करने के बाद भी यह काम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.