問題描述

我收到了一個問題,我必須加載我的父主題的 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' );

我想避免兩件事情:首先很多的説明給用户。第二,如果切斷繩子意外刪除父母的初始化程序,有人會打破任何事情的機會。人們只要在 functions.php 裏面玩,而不用弄清楚什麼就不用了。

換句話説:我如何保持我的小孩主題的 functions.php 文件乾淨,但父主題引導完成?

有任何想法嗎?非常感謝!

最佳解決方案

Justin Tadlock 最近寫了一篇關於製作一個更好的 functions.php 文件的偉大文章,其中 (如果我記得正確的話) 他處理這個確切的問題。

不幸的是,他的網站目前正在下降,所以現在我不得不依靠我的 memory 。

您正在 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() {
...
}

次佳解決方案

首先,你不能。孩子主題的 functions.php 總是先加載,期間。

二,主題不能掛鈎到 setup_theme 。插件可以,但主題可以掛鈎的第一件事是 after_setup_theme 。

如果您的父母設計正確,那麼該子項能夠覆蓋父項中的功能和內容,但只有在首次加載時才可以。

一般來説,如果您認為您需要首先加載父級的函數文件,那麼您可能會做錯,不知何故。你需要解釋更大的問題。

第三種解決方案

所以你試圖從孩子的 functions.php 執行代碼,但在父主題加載完畢之後。簡單,只需使用自定義操作:

parent/functions.php 結束時:

do_action('parent_loaded');

child/functions.php

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

所有值得他們的鹽的父母主題都是這樣做的。此外,他們還有幾個其他的操作和過濾器,以供兒童主題使用。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。