问题是如何使用不在主题文件夹中,但在插件文件夹中的模板。模板需要用于特定页面。是否需要答案并不重要。有必要;我该怎么做?
答案是使用template_include
过滤器(参见here) . 以下是我对答案的解释:
我正在开发的插件创建了一个页面。然后,该页面需要使用插件提供的模板。我可以这样做
创造一个全新的主题(太多的工作-过度);
将模板复制到主题文件夹(对主题不礼貌);
创建一个儿童主题(再次过度);
将代码放入函数中。php文件(编辑主题的function.php文件不礼貌或不好;在子主题中更好,但这不好);
设置页面元以按名称指定模板(但这需要主题文件夹中的模板);
或者更改页面使用的模板(因此产生了这个问题)。
我用于执行此操作的代码如下所示。我要使用的模板文件位于插件的templates文件夹中。我的插件以前创建过“我的自定义页面”页面。
// include our template
add_filter( \'template_include\', \'use_our_page_template\', 99 );
function use_our_page_template( $template ) {
if ( is_page( \'My Custom Page\' ) ) {
$new_template = plugin_dir_path( __FILE__ ) . \'templates/mycustomtemplate.php\';
return $new_template;
}
return;
The
is_page()
函数可以使用页面的ID、标题或slug(请参阅
docs). 我使用页面标题作为参数。
请注意,如果您编辑“我的自定义页面”,您将不会在编辑屏幕的模板字段中看到正在使用的模板名称。这并不困扰我,但可能是可以解决的。没关系;我的模板用于输出页面。
我把上面的代码放在插件的代码中。只要插件启用,过滤器就可用。是的,可能会对性能造成轻微影响,因为过滤器已为整个站点启用,但我可以接受。我可能会更改页面名称,使其完全唯一。
因此,我的解决方案解决了这个问题:如何设置页面以使用主题文件夹外的模板。其他答案虽然包含一些有用的信息,但没有回答原来的问题。
这是可行的。
(注:this question from 2010 向我指出了最终的解决方案。)