我目前正在编写WP插件,需要覆盖模板。
我的过滤器钩子看起来像 - 并执行:
add_filter('template_include', 'mcd_set_template',10);
function mcd_set_template()只返回字符串所需的路径 - 如果文件不存在,则返回默认的WP模板。
我已经玩了好几个小时了,甚至可以包含那个替代模板(但它出现在页面底部)。
所以我的问题是,如何强制WP 3.2.1只加载另一个模板文件而不是 - 并且需要哪个优先级?
更新: 另外我注意到使用var_dump时...它几乎输出到文件的末尾 - 但应该出现在打开的HTML标记之前...
根据此票证,它应该与template_include hook:http://core.trac.wordpress.org/ticket/11242
一起使用或者是挂钩这些过滤器的唯一方法: http://codex.wordpress.org/Template_Hierarchy#Filter_Hierarchy ?
答案 0 :(得分:13)
您可以使用如上所示的template_redirect,但这确实需要退出,并且它会对WordPress通常用于查找当前模板的所有其他内容进行践踏。您可能希望发生这种情况,然后将逻辑应用于当前模板。
使用上面的一些内容......
add_action('template_include', 'mcd_set_template');
function mcd_set_template() {
return locate_template('templatename.php');
}
这很简单,您也可以将数组传递给locate_template()来定义层次结构。如果你使用如上所示的'template_redirect,你应该仍然使用locate_template,这是如何。
add_action('template_redirect', 'mcd_set_template');
function mcd_set_template() {
/**
* Order of templates in this array reflect their hierarchy.
* You'll want to have fallbacks like index.php in case yours is not found.
*/
$templates = array('templatename.php', 'othertemplate.php', 'index.php');
/**
* The first param will be prefixed to '_template' to create a filter
* The second will be passed to locate_template and loaded.
*/
include( get_query_template('mcd', $templates) );
exit;
}
最后,最好的方法是过滤特定类型而不是整个层次结构。例如,您可以过滤'category_template'或'page_template'。这将更具体,如果你不想,它将避免搞乱整个模板层次结构 - 它让WordPress做更多的繁重工作
例如:
add_filter('category_template', 'filter_category_template');
function filter_category_template($template){
/* Get current category */
$category = get_queried_object();
/* Create hierarchical list of desired templates */
$templates = array (
'category.php',
'custom-category-template.php',
'category-{$category->slug}.php',
'category-{$category->term_id}.php',
'index.php'
);
return locate_template($templates);
}
当然,您可以在使用locate_template()时创建分层模板数组。使用此方法,您可以轻松地看到,您可以轻松地创建各种非常详细和特定的层次结构,作为本机模板层次结构的一部分或与之分离。
答案 1 :(得分:2)
您是否尝试过使用add_action?例如,您可能希望尝试在插件中执行以下操作:
add_action('template_redirect', 'mcd_set_template');
//Redirect to a preferred template.
function mcd_set_template() {
$template_path = TEMPLATEPATH . '/' . "templatename.php";
if(file_exists($template_path)){
include($template_path);
exit;
}
}
这是一个有用的参考:http://www.mihaivalentin.com/wordpress-tutorial-load-the-template-you-want-with-template_redirect/