什么允许在子主题中复制和覆盖插件中的模板文件?

时间:2019-04-24 作者:macondo_buendia

在流行的插件中,如WooCoommer,开发人员可以将模板文件复制到[子]主题中以覆盖文件。我相信这在Beaver Builder以及他们的一些模块中是可能的。我试图寻找这是如何发生的,或者文件是如何加载到这些插件和web上的其他地方的,但都没有成功。

我的第一个问题是,是什么函数或加载器实现了这一点?其次,这是一个全球Wordpress功能,还是插件开发人员必须将此功能构建到插件中?

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

我的第一个问题是,是什么函数或加载器实现了这一点?其次,这是一个全球Wordpress功能,还是插件开发人员必须将此功能构建到插件中?

这不是WordPress的功能。不完全是这样。每个插件都创建了自己的加载模板文件的功能,在从插件加载模板文件之前检查模板文件的主题。

在WooCommerce中,这是wc_locate_template() 作用此函数使用locate_template() 在子主题和父主题中查找给定文件,如果找到,则加载该文件,否则返回到其自己的模板目录中的文件。在内部,WooCommerce在加载模板时使用此功能,允许主题替换模板文件。Beaver Builder可能具有非常类似的功能。

像这样的函数的一个非常简单(未经测试)的版本是:

function wpse_336136_load_template( $template_name ) {
    $template_name = ltrim( $template_name, \'/\' );
    $template_path = locate_template( \'my-plugin/\' . $template_name );

    if ( ! $template_path ) {
        $template_path = plugin_dir_path( \'templates/\' . $template_name, __FILE__ );
    }

    return $template_path;
}
那么现在函数wpse_336136_load_template() 将检查给定文件的主题my-plugin/ 目录,如果找不到它,它将从templates/ 插件的目录。

例如,如果使用:

$template_path = wpse_336136_load_template( \'partials/header.php\' )
它将按以下顺序检查这些目录:

wp-content/themes/child-theme/my-plugin/partials/header.php 
wp-content/themes/parent-theme/my-plugin/partials/header.php 
wp-content/plugins/my-plugin/templates/partials/header.php 
所以只要你用wpse_336136_load_template() 在插件内部,用户可以替换插件中的任何文件templates/ 通过将文件复制到my-plugin/ 他们主题的目录。

相关推荐