可以制作孙子主题吗?


15

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

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

然后,我选择在StudioPress上出售的Genesis子主题之一,并希望继续为我的每个站点自定义它。我会为我所有的站点创建一个孙子主题吗,我将如何处理?

Answers:


17

是和否

您可以创建一个子主题,将另一个子主题指定为父主题,WordPress将尝试使用该主题。

然而

您会遇到很多问题,更不用说核心开发人员已明确声明这不是可取的行为,他们也不会努力支持孙子主题。

例如,WP API在样式表和模板URL /目录之间进行了区分,其中样式表始终是指活动主题,而模板是指父主题,但是如果包含祖父母主题,是get_template_directory_uri引用父还是祖父母?现在许多API调用是模棱两可的,并且不同的人会期望不同的行为,包括核心代码。您还需要加载functions.php父项或祖父母项的,并确保以正确的顺序进行。

这也被认为是非常不好的做法。如果您需要孙子主题,那么您的方法就走了错误的路线,您需要退后一步并重新评估。

我建议您避免使用孙子主题的概念,否则会导致更多问题。相反,子主题中的更多挂钩筛选器操作和模块化应使您能够使子主题共享组件保持相同,并让您轻松进行分支/分支。尝试将公共元素移动到svn external / git子模块中。

还有_s模型,您将子主题作为基础并进行分叉,而不是出于您要复制的目的而将其作为父主题而不是子/替代主题。


因此,就我而言,如果我选择《创世纪》,我只需要直接修改子主题,对吗?对Git不太熟悉,但是会对帮助我保持原始儿童主题完整的方法感兴趣。
urok93 2012年

是的,您在这里没有太多选择。
汤姆·J·诺维尔

我想知道如果您尝试制作一个伟大的孙子主题会怎样。
Chris_O 2012年

1
您提到如果需要的话,该方法已转错了方向。我对此感到好奇的原因是因为存在使用WooCommerce店面主题的情况。他们将子主题出售给店面,这些主题是针对各种事物而定制的。因此,如果我使用他们的子主题之一,但然后我想继续进行自己的更改,使他们在更新子主题时不会被覆盖...我将如何做?
德鲁·安杰尔

1
我不知道,这是店面主题的构建方式的局限性,那时您被迫派生子主题
Tom J Nowell

3

我没有完全测试下面描述的方法,也没有正常的“孙子”主题,但是给出了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";'));

说完所有的事情,我不确定这是做事的最佳方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.