問題描述

如果我使用諸如創世紀的流行框架之一,是否可以創建孫子主題?

例如,我想使用創世紀作為我所有網站的支柱。創世紀被稱為框架,但實際上是一個父主題。

然後,我在 StudioPress 中選擇一個 Genesis 兒童主題,然後繼續為我的每個網站定製。我會為我的所有網站創建一個孫子主題,我該怎麼辦?

最佳解決方案

是和否

您可以創建一個指定另一個子主題作為父項的子主題,WordPress 會嘗試使用它。

然而

你會遇到問題,更不用説核心開發商明確表示這不是理想的行為,而且他們不會努力支持孫子主題。

例如,WP API 區分樣式表和模板 URL /目錄,其中樣式表總是引用活動主題,模板是指父主題,但如果包含祖父母主題,get_template_directory_uri 是否引用父項或祖父母?許多 API 調用現在是模糊的,不同的人會期待不同的行為,包括核心的代碼。您還需要加載父母或祖父母的 functions.php,並確保按正確的順序完成。

這也被認為是非常糟糕的做法。如果你需要孫子主題,那麼你的方法已經錯了,你需要退後一步,並且 re-evaluate 的東西。

我建議你避免孫子主題的概念,會導致更多的問題。相反,更多的鈎子可以過濾孩子主題中的操作和模塊性,使您能夠保持子主題共享組件相同,並讓您的分支/分支很難。嘗試將公共元素移動到 svn 外部/git 子模塊中。

還有_s 模型,你把你的小孩主題作為一個基礎,並分叉,而不是把它作為一個父母,你打算在副本上工作,而不是一個孩子/覆蓋。

次佳解決方案

我沒有完全測試下面描述的方法,也沒有正常的”grandchild” 主題,但是給出了 template_include 過濾器的功能:

    /*
    Plugin Name: Grandchild Themes
    Plugin URI: http://www.who-cares.com/
    Description: A concept for Grandchild themes Plugin
    Author: See Plugin URI
    Version: 0.0.0.0.1-Alpha
    */

    add_action('wp_head', 'grnd_chld_add_headers', 0);
    add_action('init', 'grnd_chld_add_css');

    // Load template if exists.
function grandchild_template_include( $template ) {

    if ( file_exists( untrailingslashit( plugin_dir_path( __FILE__ ) ) . '/grnd_chld_templates/' . basename( $template ) ) )
        $template = untrailingslashit( plugin_dir_path( __FILE__ ) ) . '/grnd_chld_templates/' . basename( $template );

    return $template;
}

// This is the actual filter that we want .
add_filter( 'template_include', 'grandchild_template_include', 11 );

    function grnd_chld_add_headers () {
        wp_enqueue_style('my_grandchild_style');
    }

    function grnd_chld_add_css() {
        $stamp = @filemtime(plugin_dir_path(__FILE__).'/style.css'); // easy versioning
        wp_register_style ('my_grandchild_style', plugins_url('style.css', __FILE__).'', array(), $stamp);
    }

    // From here , what you got is like a normal functions.php.

您也可以以類似的方式嘗試更具體的過濾器,例如 archive_template

add_filter ('archive_template', create_function ('', 'return plugin_dir_path(__FILE__)."archive.php";'));

所有這一切表示和做的,我不知道這是做什麼的最好辦法。

參考文獻

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