子主题的GET_STYLESET_DIRECTORY()与GET_TEMPLATE_DIRECTORY()的比较

时间:2015-06-19 作者:Ahmed Saad

假设我的父主题文件夹中有以下文件:\'theme-folder/inc/custom.php\'

然后我创建了一个儿童主题。

如何检查该文件是否存在于子主题中,然后获取它,否则从父主题获取它?

get_template_directory() 始终从父主题获取文件。

虽然get_stylesheet_directory() 要求文件存在于子主题中。

2 个回复
最合适的回答,由SO网友:Mathew Tinsley 整理而成

locate_template 将尝试在子主题中查找指定的文件,如果父主题不存在,则返回父主题:

locate_template(\'inc/custom.php\', true);
将第二个参数设置为true 导致它需要文件,而不仅仅是确定路径。

顾名思义,locate_template 用于加载模板文件。它有一些额外的开销,您很可能不需要加载库。精简版应为:

function load_theme_file($path) {
    if ( file_exists( STYLESHEETPATH . \'/\' . $path )) {
        include( STYLESHEETPATH . \'/\' . $path );
    } else {
        require( TEMPLATEPATH . \'/\' . $path );
    }
}
用法:

load_theme_file(\'inc/custom.php\');
编辑:我只是想简要说明一下这种整体方法的潜在问题。

让子主题覆盖文件对于模板很有效,但对于库,错误的空间更大。如果子主题需要修改单个函数,则必须复制整个文件,并在此过程中覆盖该文件中的每个函数。

如果更新了父主题,并且对覆盖文件中的任何函数进行了更改,则可能会导致问题。您可以通过将库分解成更小的块来缓解此问题,但这会使代码库更难维护。

在我看来,更好的解决方案是使用面向对象的方法。允许子主题扩展您定义的类,然后使用子主题的类。在实现类中,子主题只需定义它需要覆盖的方法。在父主题中,您可以通过使哪些方法final.

通过大量使用过滤器和操作,还可以减少子主题替换整个文件的需要。

SO网友:s_ha_dum

get_template_part() 如果我理解你的问题,我会这么做的。

get_template_part(\'inc/custom\');
如果我对你的理解正确的话,它就是为了做到这一点而构建的:

使主题可以轻松地重用代码部分,并使子主题可以轻松地替换其父主题的部分。

结束

相关推荐

Child-theme breaks site

所以,我有一个子主题,里面除了所需的CSS文件之外什么都没有。一旦我激活了这个儿童主题,我的整个网站就关闭了。最后我有两个问题:激活一个只有CSS的子主题怎么能破坏我的网站</我怎样才能回到我原来的主题</这些是网站给我的错误:Warning: require_once(/wp-content/themes/interio_child/admin/options-framework.php) [function.require-once]: 无法打开流:中没有此类文件或目录/wp-c