วิธีโหลด parent_theme functions.php ก่อน child_theme


12

ฉันพบปัญหาที่ฉันต้องโหลดfunctions.phpไฟล์ของธีมหลักก่อนfunctions.phpโหลดไฟล์ของธีมลูก จำเป็นสำหรับขั้นตอนการตั้งค่าและเริ่มต้น ผมมองไปที่ตะขอภายใน /wp_core_root/wp-settings.php (ชื่อ: do_action('setup_theme');)

ปัญหาคือว่าฉันไม่ทราบวิธีการขอมีเพราะไฟล์แรกที่ฉันได้รับคือชุดรูปแบบของเด็กfunctions.phpดังนั้นadd_action( 'setup_theme', 'my_init_function' );จะไม่ทำงาน

แก้ไข:
ก) ฉันรู้ว่าปลั๊กอินโหลดเร็วกว่าธีมและสามารถเข้าถึงได้แม้กระทั่งคิวรีเริ่มต้น แต่ฉันไม่ต้องการพึ่งพาปลั๊กอิน
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' );

ฉันต้องการหลีกเลี่ยงสองสิ่ง: คำอธิบายแรก ๆ มากมายสำหรับผู้ใช้ โอกาสครั้งที่สองที่มีคนทำลายอะไรถ้าการตัดเชือกด้วยการลบขั้นตอนเริ่มต้นของผู้ปกครองโดยไม่ตั้งใจ ผู้คนจะต้องเล่นภายในฟังก์ชั่น. php โดยไม่ต้องเสี่ยงที่จะทำลายอะไรโดยไม่รู้ตัว

กล่าวอีกนัยหนึ่ง: ฉันจะรักษาความสะอาดของชุดรูปแบบไฟล์ของเด็ก ๆ ได้อย่างไรไฟล์ php แต่ทำ bootstrap ที่เป็นธีมหลักได้อย่างไร?

ความคิดใด ๆ ขอบคุณมาก!


คุณไม่สามารถรวมมันได้หรือ
wyrfel

คำถามของฉันคือ: จากที่ไหน functions.phpไฟล์แรกที่ได้รับการโหลดในบริบทธีมของธีมเด็ก ลองดูที่ไฟล์ "molto loko" wp-settings.phpในแกนกลาง (บรรทัด: 275-279 @wp 3.1 rc) ... มีลักษณะเช่นนี้: 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)ที่ด้านบนของชุดรูปแบบลูกของคุณ function.php แล้วทุกอย่างในนั้นจะโหลดก่อน ไม่?
wyrfel

@wyrfel: ฉันปรับปรุง Q ที่จะทำให้มันชัดเจนมากขึ้น
Kaiser

ฉันเข้าใจแล้วขอบคุณตอนนี้มันชัดเจนขึ้นมาก บวกฉันคิดว่าคุณเพิ่งทำสิ่งนี้เพื่อการติดตั้งครั้งเดียว
wyrfel

คำตอบ:


11

Justin Tadlock เพิ่งเขียนบทความที่ยอดเยี่ยมเกี่ยวกับการสร้างไฟล์ functions.php ที่ดีกว่า
ซึ่ง (ถ้าจำได้ถูกต้อง) เขาจัดการกับปัญหาที่แน่นอนนี้

น่าเสียดายที่ไซต์ของเขาไม่ทำงานในขณะนี้ดังนั้นฉันต้องพึ่งพาหน่วยความจำของฉันในตอนนี้

คุณอยู่ในเส้นทางที่ถูกต้องด้วยafter_setup_themeเบ็ด

  1. เท่าที่ฉันจำได้ว่าเคล็ดลับคือการห่อตัวกรองและการกระทำของคุณไว้ในฟังก์ชัน
    ดูตัวอย่างด้านล่าง
  2. คุณทำได้ทั้งในfunctions.phpไฟล์พาเรนต์และไฟล์ย่อย
  3. จากนั้นคุณสามารถเล่นกับลำดับความสำคัญของสอง hooks

โค้ดนิดหน่อยคุ้มค่าพันคำ - ธีมหลักของคุณ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จะสายเกินไปเนื่องจากไฟล์ functions.php ถูกโหลดแล้ว
ไกเซอร์

แก้ไข: หลังจากคิดใหม่รหัสของคุณและอ่าน "ทำอย่างนั้นทั้งในฟังก์ชั่นผู้ปกครองและเด็ก. php" & "เล่นด้วยความสำคัญ" มันเริ่มทำให้รู้สึก ยังคงค้นหาโซลูชันที่ดีกว่าที่ผู้ใช้ไม่สามารถทำลายได้ง่าย แต่ก็สมเหตุสมผล! ขอบคุณ!
ไกเซอร์

ไม่มีวิธีแก้ปัญหาจริงที่นี่ดังนั้นฉันตรวจสอบเครื่องหมายนี้เนื่องจากคุณเป็นคนแรกที่เสนอนี้
ไกเซอร์

9

ประการแรกคุณไม่สามารถ functions.php ของชุดรูปแบบเด็กจะโหลดครั้งแรกช่วงเวลา

ประการที่สองชุดรูปแบบไม่สามารถเชื่อมโยงกับ setup_theme ปลั๊กอินสามารถทำได้ แต่สิ่งแรกที่ธีมสามารถเชื่อมต่อได้คือ after_setup_theme

หากผู้ปกครองของคุณได้รับการออกแบบอย่างถูกต้องเด็กจะมีความสามารถในการเอาชนะฟังก์ชั่นและสิ่งต่าง ๆ ในผู้ปกครอง แต่เมื่อมันโหลดก่อน

พูดกว้างถ้าคุณคิดว่าคุณต้องโหลดไฟล์ฟังก์ชั่นของผู้ปกครองก่อนแล้วคุณอาจทำผิดอย่างใด คุณต้องอธิบายปัญหาที่ใหญ่ขึ้น


ขอบคุณสำหรับคำตอบ. ฉันเข้าใจถึงความจำเป็นในการโหลดปลั๊กอินก่อนธีมและตระหนักถึงความจริงแล้ว (อ่านข้างบน: "และฉันไม่ต้องการใช้ปลั๊กอินเพื่อเริ่มต้นธีมของฉัน") ในการอธิบายรายละเอียดกรณีของฉัน: ฉันได้รับไฟล์ ini ที่ใส่ใจเกี่ยวกับการโหลดส่วนเฟรมเวิร์กทั้งหมดของฉันซึ่งเริ่มต้นในฟังก์ชั่นหลักของชุดรูปแบบฟังก์ชั่น PHP ที่ต้องการไฟล์และโหลด init-class InitClass ใส่ใจกับการโหลด a) และอาร์เรย์ของข้อมูลจากธีมย่อย. ini-files และจากนั้นดันมันลงในคลาสที่แตกต่างกันสำหรับการประมวลผลเพิ่มเติม กล่องเมตาประเภทโพสต์ที่กำหนดเอง ฯลฯ
kaiser

ปัญหาของฉันคือฉันต้องเริ่มต้นทั้งหมดนี้จากไฟล์พ่อแม่ของฉัน function.php ดังนั้นผู้ใช้ปกติจะไม่สามารถทำลายมันได้เมื่อเล่นในธีมลูก ปัญหาที่สองของฉันคือชั้นเรียนเหล่านั้นทั้งหมดไม่สามารถใช้งานได้ในไฟล์ฟังก์ชั่นชุดรูปแบบของเด็กดังนั้นจึงไม่มีประโยชน์ ... แต่บางทีฉันอาจมีข้อผิดพลาดในการคิดขนาดใหญ่ที่นี่ ความคิดหรือข้อเสนอแนะเกี่ยวกับวิธีที่จะทำให้ดีขึ้น?
ไกเซอร์

3
.... ฉันคิดว่าคุณแค่ต้องยอมรับความจริงที่ว่าหากผู้ใช้แบ่งสิ่งต่าง ๆ นั่นเป็นปัญหาของพวกเขา บรรทัดด้านล่าง: ไม่มีวิธีที่จะโหลด function.php ของธีมหลักก่อนและปล่อยให้ธีมลูก "สะอาด" หากคุณต้องการบางสิ่งบางอย่างในชุดรูปแบบลูกเพื่อเรียกใช้หลังจากโหลดไฟล์ functions.php ของชุดรูปแบบแล้วคุณวางไว้ในฟังก์ชันที่เชื่อมโยงกับ after_setup_theme ที่ทำงานหลังจากโหลดไฟล์ functions.php ทั้งคู่
อ็อตโต

ตกลง. มันไม่ใช่ปัญหาใหญ่ ฉันแค่ขัดจังหวะถ้ามีความเป็นไปได้ คำถาม: อะไรคือ "กรอบการทำงานที่คุ้มค่าเป็นเกลือ" แล้วมีตะขอหลังจากขั้นตอนการเริ่มต้นและไม่เพียงแค่ใช้after_setup_themeเบ็ด? เพื่อไม่ให้ "สแปม" เบ็ดหรือเพราะมันเป็น "enterprisy" หรือ "kool" มากกว่า ฉันหมายถึง: แนวคิด "แนวปฏิบัติที่ดีที่สุด" ที่อยู่เบื้องหลังชุดรูปแบบเบ็ดขนานเฉพาะ "ปล่อยให้แกนยึดสำหรับปลั๊กอิน" หรือไม่ (นั่นเป็นวิธีที่ฉันจัดการกับมันในขณะนี้)
ไกเซอร์

"หากคุณกำลังจะทำเช่นนั้นอย่าไปสนใจกับสิ่งที่ต้องทำเพิ่มเพียงทำตาม after_setup_theme" ตกลง. ขอบคุณ +1
ไกเซอร์

4

ดังนั้นคุณจึงพยายามที่จะรันโค้ดจากฟังก์ชั่นของเด็ก ๆ แต่หลังจากที่โหลดธีมหลักแล้ว ง่ายเพียงใช้การกระทำที่กำหนดเอง:

ในตอนท้ายของ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 แทน ในหนึ่งประโยค: ฉันพยายามหลีกหนีจากสิ่งเก่า / โซลูชันของคุณและเข้าใกล้แกนกลางและ codex ให้มากที่สุด ปัญหาของฉันคือฉันไม่สามารถส่งมอบฟังก์ชั่นเดียวจากธีมลูกเพราะไม่มีคลาสหรืออื่น ๆ จาก bootstrap ของฉันที่มีอยู่ในไฟล์ฟังก์ชั่นเด็กธีม themes.php (ไม่พูดถึงแท็กแม่แบบกำหนดเอง / กรอบ)
ไกเซอร์

ดูคำตอบที่อัปเดต
scribu

ฉันอัพเดตคิวด้วย หลังจากอ่านคำตอบที่ 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: "ในคำอื่น ๆ : ฉันจะรักษาธีมลูกของฉันได้อย่างไรฟังก์ชั่นไฟล์. php แต่ทำ bootstrap ของ parent parent ได้อย่างไร?" ดียิ่งขึ้น: ฉันจะหลีกเลี่ยงการโทรจากภายในไฟล์ function.php ใด ๆ ได้อย่างไร? ทำไม: ผู้คนเคยชินเพียงแค่ทุบทุกอึที่พวกเขาไม่ต้องการให้มีในไฟล์เทมเพลตที่นั่น ดังนั้นจึงมีโอกาสสูงที่บางคนจะลบเส้นโดยไม่ตั้งใจ ประสบการณ์ของฉัน: ไม่มีใครอ่านความคิดเห็น readme หรือเอกสาร
ไกเซอร์

0

ฉันมีปัญหาที่คล้ายกันมาก่อนและฉันแก้ไขด้วยการสร้าง "child-Functions.php" ที่ว่างเปล่าเป็นพิเศษใน parent และรวมไว้ใน "functions.php" (parent เกินไป) หลังจากไฟล์ / ฟังก์ชั่นที่ฉันต้องการใช้ในเด็ก จากนั้นในชุดรูปแบบลูกฉันสร้างไฟล์ "child-Functions.php" และมีที่ฉันสามารถเริ่มจำลองการทำงานของเด็กฟังก์ชั่น. php หลังจากที่ผู้ปกครองไม่ได้เป็นทางออกที่สง่างาม แต่ทำงาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.