我的第一个问题是,是什么函数或加载器实现了这一点?其次,这是一个全球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/
他们主题的目录。