首先—plugins are for generating content, themes are for displaying it. 所以实际上,插件不应该这样做。但也有一些灰色区域,例如在与“事件”相关的插件中,最好显示日期、地点等,而WordPress主题通常不会显示这些内容。
我建议
使插件模板可以在主题/子主题中使用同名模板能够“关闭”模板的插件强制要更改正在使用的模板,可以使用template_include
滤器这是分类法模板的一个示例,但对于自定义帖子类型也可以使用类似的过程。
add_filter(\'template_include\', \'wpse50201_set_template\');
function wpse50201_set_template( $template ){
//Add option for plugin to turn this off? If so just return $template
//Check if the taxonomy is being viewed
//Suggested: check also if the current template is \'suitable\'
if( is_tax(\'event-venue\') && !wpse50201_is_template($template))
$template = plugin_dir_url(__FILE__ ).\'templates/taxonomy-event-venue.php\';
return $template;
}
Note 它假设插件模板位于相对于当前控制器的模板子文件夹中。
逻辑这只是检查是否正在查看“活动地点”分类。如果不是,则将使用原始模板。
这个wpse50201_is_template
函数将检查WordPress是否已从调用的主题/子主题中选择模板taxonomy-event-venue.php
或taxonomy-event-venue-{term-slug}.php
. 如果是-将使用原始模板。
这允许插件的用户将它们复制到主题中并进行编辑,插件将对主题/子主题模板进行优先级排序。只有当它找不到它们时,才会返回插件模板。
function wpse50201_is_template( $template_path ){
//Get template name
$template = basename($template_path);
//Check if template is taxonomy-event-venue.php
//Check if template is taxonomy-event-venue-{term-slug}.php
if( 1 == preg_match(\'/^taxonomy-event-venue((-(\\S*))?).php/\',$template) )
return true;
return false;
}
我在一个插件中使用了这种方法-您可以看到上面的一个工作示例
here.