你的问题是,如果你想切换主题,你必须很早就切换,在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再次执行请求这是一项艰巨的任务,需要大量的工作,而且性能非常低。当然,您可以使用\'template_include\'
筛选以从另一个主题目录加载模板文件,而不更改当前主题(可能是您编写代码的目的),但在这种情况下,您将从一个主题加载模板文件,并从另一个主题加载样式表、函数和脚本:可能这不是您想要的,在最好的情况下,它将被破坏,在最坏的情况下,它将使用未定义的函数中断页面,并出现致命错误。
总之,如果你的目标是改变单个帖子的外观,我建议看一个插件,它可以将页面模板功能扩展到帖子,我知道的一个插件是this one.然后,您可以从不同的主题复制单个帖子模板的标记和样式。。。