If has_term, load other theme

时间:2014-01-07 作者:yluijten

这就是我想要完成的。我创建了一个名为categorie 使用条款app, webbranding. 当一个项目有术语app时,我想加载另一个主题/博客。当一个项目有术语web或branding时,我想加载single.php. 最后一个很好用。

这是我目前的代码

function load_single_template($template) {
$new_template = \'\';

if( is_single() ) {
    global $post;

    if( has_term(\'app\', \'categorie\', $post) ) {
        $new_template = get_theme_roots(\'themeApp\');
    } else {
        $new_template = locate_template(array(\'single.php\' ));
    }
}
return (\'\' != $new_template) ? $new_template : $template;
 }
 add_action(\'template_include\', \'load_single_template\');
所以当一个项目有术语app时,我想加载主题themeApp. 有什么建议吗?提前谢谢。

1 个回复
SO网友:gmazzap

你的问题是,如果你想切换主题,你必须很早就切换,在fqact中,你可以为该任务钩住的最新动作是setup_theme 这是在实际加载主题之前触发的,因此-首先-如果你想更改主题,你应该使用插件而不是主题,这是合乎逻辑的:如果你有代码在当前主题中切换主题,它应该用另一个主题替换自己,这是不可能的。

代码失败的第一个原因:\'template_include\' 钩住它太晚了。

第二个原因:get_theme_roots 不接受任何参数,并返回一个主题基目录数组,如果所有主题都在同一目录中,则返回单个主题目录(这是最常见的情况,它返回类似somting的/path/to/wp/wp-content/themes/). 所以你使用这个函数是错误的:挂钩\'template_include\' 您应该返回单个文件,而不是主题的根。

现在,让我们承认您使用插件来切换当前主题,最简单有效的方法是操纵\'template\' 选项,使用\'pre_option_{$option_name}\' 钩子,在这种情况下\'pre_option_template\'.

看见this answer 并替换为\'template\' 随处可见\'stylesheet\'.

然而,在链接的答案中,我不依赖当前的请求来选择主题,而只依赖于当前的日期,可以在请求的很早就计算出来,因为它是独立的。

在您的情况下,您应该检查当前请求,然后切换主题,但通常WordPress在运行请求之前设置主题,这意味着您应该

自己检查请求

  • 切换主题
  • 让WordPress再次执行请求
    1. 这是一项艰巨的任务,需要大量的工作,而且性能非常低。

      当然,您可以使用\'template_include\' 筛选以从另一个主题目录加载模板文件,而不更改当前主题(可能是您编写代码的目的),但在这种情况下,您将从一个主题加载模板文件,并从另一个主题加载样式表、函数和脚本:可能这不是您想要的,在最好的情况下,它将被破坏,在最坏的情况下,它将使用未定义的函数中断页面,并出现致命错误。

      总之,如果你的目标是改变单个帖子的外观,我建议看一个插件,它可以将页面模板功能扩展到帖子,我知道的一个插件是this one.然后,您可以从不同的主题复制单个帖子模板的标记和样式。。。

    结束