问题描述
我遇到了一个有趣的问题,关于 get_template_part()
。
我创建了一个主题选项页面 (命名为 sitewideSettings.php)
通常我会将它包含在 functions.php 中,如下所示:
include(TEMPLATEPATH."sitewideSettings.php");
工作正常
但现在我试图使用 get_template_part();
get_template_part('sitewideSettings');
这也是正常工作,除了当点击’update’ 更新设置时,我收到一条错误消息:「你确定要这样做吗?请再试一次」 。
「请再试一次」 链接回主题选项页面,点击更新可以让您回到错误消息,让您回到主题选项,并且我们走遍。
除了使用 get_template_part();
之外,没有其他的改变
有人遇到这个问题吗?你是怎么碰到的?我相信它的东西简单明了,但完全是逃避了我。
(它不是在两个实例中都创建的 nonce 问题)
最佳解决方案
我知道你说这不是一个问题,但显然是。该通知是默认的 「这个 nonce 没有签出」 消息。我不知道为什么随机性失败,但这是发生了什么。
我会仔细检查你的随机数是如何创建和检查的。如果您使用 wp_nonce_field()
,请确保操作值和参数值都相同。此外,请双重检查变量的拼写,或任何可能导致随机数失败的 scope-related 问题。
EDIT
跟随你坚持认为这不是一个现在的问题 (这是现实的问题是由范围问题引起的),这里’s what’s 可能发生了。包含/必需的文件在其包含的范围内执行。我猜想你正在使用一个变量来构建随机数操作或随机数字名称。因为 get_template_part()
在该函数的范围内包含模板文件,所以不再在管理页面的显示回调范围内执行。您需要在所有位置全局化这些变量,或者需要使用常量而不是变量。
次佳解决方案
请不要在管理员/后端使用 get_template_part() 。它被设计用于模板使用 (显示主题,请参阅 codex),所以这是打算用于主题中的模板和 template-parts:
Function Reference/get template part
Load a template part into a template (other than header, sidebar, footer). Makes it easy for a theme to reuse sections of code in an easy to overload way for child themes.
该功能确实包括一般的源代码,但是你所经历的 (正如约翰指出的) 可能与范围有关。因为我不知道你的代码,所以我不能肯定地说,如果这是你所面临的问题的确切原因 (可变范围),所以我倾向于在我的答案中保持简单:
该函数只是不按规定的 php 代码替换,例如写入管理页面。
所以只要不要使用它,如果你的管理页面,除非你真的知道你在做什么。
更新:
如果要在查看子目录和父主题目录时将 php 文件加载到全局范围内,可以使用为您搜索文件的功能:locate_template():
Retrieve the name of the highest priority template file that exists.
Searches in the STYLESHEETPATH before TEMPLATEPATH so that themes which inherit from a parent theme can just overload one file.
给定的例子包括 include(TEMPLATEPATH."sitewideSettings.php");
这可以写成:
include(locate_template('sitewideSettings.php'));
这允许您控制文件的包含位置和方式 (include /_once; require /_cone),并且阻止您在示例中发生破坏 NONCE 机制的范围问题。
「请再试一次」 消息是因为 wp-admin 无法验证请求,更具体地说是所谓的 nonce 。可能有两个原因:请求中没有 (例如,表单不提供任何信息,或者没有被管理员代码转移或读取) 或该随机数是无效的。永远代表一连串的动作,如果连锁被打破,你会得到这个消息。但是这条消息并不告诉你那条链坏了。
管理员中的这些错误消息并不总是很丰富,甚至可能会导致误导 (相关:#14060) 。要了解这里发生了什么,最有效的是在出现错误的系统上进行调试,因为它可能是相当具体的哪个链的哪个部分被破坏。
请参阅 codex,了解如何为您的主题或插件创建管理页面以获取更多有关随机数,管理页面等的 in-depth 信息。由于某些原因,管理员请求无法验证该随机数。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。