这是this question/answer. 关于这个问题的评论提到template_include
优先于template_redirect
从插件加载模板时。
但是,将此挂起到template\\u include会破坏网站上的所有内容(任何其他页面视图),但使用布局替代的布局除外http://pastebin.com/LWpSrfim 但是使用template\\u include只预先添加内容(到放置在主题目录覆盖中的任何模板文件)——例如,下面仍然输出标准的单一视图。
编辑:源代码
<?php
class moulding_templates {
public static function determine_template(){
global $post,$wp_query;
// custom post types
$post_type_array = array(\'moulding_profiles\',\'moulding_combination\',\'moulding_collection\',\'idea_gallery\');
foreach ($post_type_array as $post_type_single) {
global $post;
if (is_singular($post_type_single)) {
moulding_templates::loadSingleTemplate($post);
}
}
// custom taxonomies
$taxonomy_array = array(\'profile_categories\',\'combination_categories\',\'wood_types\');
foreach ($taxonomy_array as $taxonomy_single) {
if (is_tax($taxonomy_single)) {
moulding_templates::loadTaxonomyTemplate($taxonomy_single);
}
}
}
private static function loadSingleTemplate($post) {
$template_name = \'moulding-templates/single-\'.$post->post_type.\'.php\';
$template = locate_template(array($template_name), true);
if(empty($template)) {
include(MOULDINGS_BASE_DIR . \'includes/\' . $template_name);
exit();
}
}
private static function loadTaxonomyTemplate($taxonomy) {
$template_name = \'moulding-templates/taxonomy-\'.$taxonomy.\'.php\';
$template = locate_template(array($template_name), true);
if(empty($template)) {
include(MOULDINGS_BASE_DIR . \'includes/\' . $template_name);
exit();
}
}
}
add_action(\'template_include\', array(\'moulding_templates\', \'determine_template\'));
最合适的回答,由SO网友:Stephen Harris 整理而成
所以template_redirect
用于规范化、提要等,如果您想更改所提供的模板template_include
首选。
不像template_redirect
, template_include
是一个filter 它过滤模板页的路径。这意味着您不加载/包含模板,只需返回模板路径即可。WordPress直接包含返回的内容。
除了作为适当的钩子之外,它还允许函数被解除钩子或被覆盖,如果它将被分发的话,应该是这样。
Related question: Custom Taxonomy in plugin and template
正在运行的示例(GitHub Repo):https://github.com/stephenh1988/Event-Organiser/blob/master/includes/event-organiser-templates.php
示例用法:
function wpse51038_maybe_alter_template($template){
// is a specific custom taxonomy being shown?
$taxonomy_array = array(\'profile_categories\',\'combination_categories\',\'wood_types\');
foreach ($taxonomy_array as $taxonomy_single) {
if ( is_tax($taxonomy_single) ) {
//For plugins. You may want to check this template exists before over-riding
$template = plugin_dir_path(\'path/to/my/tax-template.php\', __FILE__ );
break;
}
}
return $template;
}
add_filter(\'template_include\',\'wpse51038_maybe_alter_template\');
您可能想看看上面链接的相关问题-这显示了如何允许主题超越插件(比如他们的主题/子主题中是否有一个特别命名的模板文件)。