有没有可能制作孙子题材?

时间:2012-09-21 作者:urok93

如果我使用Genesis等流行的框架之一,是否可以创建孙子主题?

例如,我想使用Genesis作为我所有站点的主干。《创世纪》被称为一个框架,但实际上是一个父主题。

然后我选择了一个Genesis儿童主题在StudioPress出售,并想继续为我的每个网站定制它。我会为我所有的网站创建一个孙子主题吗?我会怎么做?

2 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

“排序”;“是”;作为一个技术问题,in practice No.

您可以指定一个子-父主题作为父主题,没有任何东西可以阻止这一点,WordPress将尝试使用它。

However

You will run into major issues, 更不用说,核心开发人员明确表示,这是不可取的行为,他们不会努力支持孙子主题。

例如,WP API区分了样式表和模板URL/目录,其中样式表总是指活动主题,模板指父主题,但如果包含祖辈主题,则会get_template_directory_uri 是指父母还是祖父母?现在很多API调用都是模棱两可的,不同的人会期望不同的行为,包括核心中的代码。您还需要加载functions.php 无论是父母还是祖父母,都要确保按照正确的顺序进行。

这也被认为是非常糟糕的做法<如果你需要孙子主题,那么你的方法就走错了方向,你需要后退一步,重新评估事情

我建议你避免孙子主题的概念,这会导致更多的问题。相反,子主题中更多的钩子过滤器操作和模块化应该使您能够保持子主题共享组件相同,并让您轻松地进行分支/分叉。尝试将公共元素移动到svn外部/git子模块中。

还有一种模型,您将子主题作为基础,并将其分叉,而不是将其作为父主题,目的是处理副本,而不是子/重写。

SO网友:krembo99

我没有完全测试下面描述的方法,也没有测试正常的“孙子”主题,但给出了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";\'));
尽管如此,我不确定这是做事情的最佳方式。

结束

相关推荐