使用GET_TEMPLATE_PART()提交表单时出错

时间:2010-09-14 作者:Ashley G

我遇到了一个关于get_template_part() .

我创建了一个主题选项页面(名为sitewidettings.php)

通常我会在函数中包含这一点。php类似:

include(TEMPLATEPATH."sitewideSettings.php");
这很好用。

但现在我想用get_template_part();

get_template_part(\'sitewideSettings\');
除了单击“更新”更新设置时,我会收到一条错误消息:“是否确实要执行此操作?请重试”,其他操作也正常。

“请重试”链接回主题选项页,单击更新将返回错误消息,该消息将返回主题选项和循环。

除了使用get_template_part();

还有其他人遇到过这个问题吗?你是怎么解决的?我确信这是一件简单而明显的事情,但我完全不知道它到底是什么。

(这不是一个nonce问题,因为在这两个实例中都创建了nonce)

5 个回复
最合适的回答,由SO网友:John P Bloch 整理而成

我知道你说这不是暂时的问题,但显然是。该通知是默认的“此nonce未签出”消息。我不知道为什么nonce会失败,但这就是正在发生的事情。

我会仔细检查您的nonce是如何创建和检查的。如果你正在使用wp_nonce_field() 确保操作值和参数值相同。此外,还要仔细检查变量的拼写,或任何可能导致nonce失败的与范围相关的问题。

编辑您坚持认为这不是临时问题(事实就是这样。临时问题是由范围问题引起的),下面是可能发生的情况。包含/必需的文件在其包含的范围内执行。我猜您正在使用一个变量来构建nonce操作或nonce名称。因为get_template_part() 将模板文件包含在该函数的作用域中,它不再在管理页的显示回调的作用域中执行。您要么需要在所有位置全球化这些变量,要么需要使用常量而不是变量。

SO网友:hakre

请不要在管理/后端中使用get\\u template\\u part()。它是为模板使用而设计的(显示主题,请参见codex), 因此,这旨在用于主题中的模板和模板部分:

函数引用/获取模板部分

将模板部件加载到模板中(页眉、侧栏、页脚除外)。使主题可以轻松地以易于重载的方式重用子主题的代码段。

该函数实际上也包含一般的源代码,但您所经历的(正如John所指出的)可能与范围有关。由于我不知道您的代码,我不能肯定这是否是您面临的问题(可变范围)的确切原因,因此我倾向于在回答中保持简单:

该函数的设计并不是为了替换标准php代码,例如编写管理页面。

所以,除非你真的知道自己在做什么,否则不要在你的管理页面上使用它。


Update:

如果要在查找子主题目录和父主题目录时将php文件加载到全局范围,可以使用一个函数为您搜索文件:locate_template():

检索存在的最高优先级模板文件的名称。

在TEMPLATEPATH之前的STYLESHEETPATH中进行搜索,以便从父主题继承的主题可以只重载一个文件。

对于给定的示例,包括include(TEMPLATEPATH."sitewideSettings.php"); 这可以写为:

include(locate_template(\'sitewideSettings.php\'));
这允许您控制文件包含的位置和方式(include/\\u once;require/\\u cone),并防止在示例中出现范围问题,从而打破NONCE机制。

出现“请重试”消息是因为wp admin无法验证请求,更具体地说是所谓的nonce. 可能有两个原因:请求中没有任何内容(例如,表单没有提供任何内容,或者没有通过管理代码传输或读取get),或者nonce无效。nonce总是代表一个动作链,如果这个链断了,你就会得到这个信息。但这条信息并没有告诉你链条在哪里断了。

管理中的这些错误消息并不总是很有信息性,甚至可能会产生误导(相关:#14060). 要了解这里发生了什么,最有效的方法是在出现错误的系统上进行调试,因为可以非常明确地知道链的哪一部分断开了。

请参阅关于如何为主题或插件创建管理页面的codex,以获取有关nonce、管理页面等的更深入信息。由于某种原因,管理员请求无法验证nonce。

SO网友:Rarst

很难猜测,这是整个功能阶梯。get_template_part() 呼叫locate_template() 哪个呼叫load_template() 是的require.

我建议你从下到上试试看get_template_part() 或者介于两者之间的函数。

SO网友:zeo

locate_template( array( \'sitewideSettings.php\' ), true )?

SO网友:icc97

这是对第一个答案的更详细解释,即“范围就是你的问题”

我对get\\u template\\u部分的简单可视化如下:

function get_template_part($slug) {
  require("$slug.php");
}
因此,如果您在sitewideSettings中有以下内容。php:

<?php
echo $nonce;
?>

Template with include:

<?php
$nonce = \'xxx\';
include(\'sitewideSettings.php\');
?>
将(通过PHP)转换为:

<?php
$nonce = \'xxx\';
echo $nonce;
?>

Template with get_template_part:

<?php
$nonce = \'xxx\';
get_template_part(\'sitewideSettings\');
?>
转换为:

<?php
$nonce = \'xxx\';
get_template_part(
  echo $nonce;
);
?>
因此,现在模板部分中的任何内容都包装在一个函数中,模板部分中的任何变量都需要global 在他们身上。

Thus to get it to work you need a global 在sitewideSettings中。php,可转换为:

<?php
$nonce = \'xxx\';
get_template_part(
  global $nonce;
  echo $nonce;
);
?>

结束

相关推荐

WP-ADMIN似乎正在重定向

我的w-admin登录有一个奇怪的问题。这是从我升级到3.0以后才开始的,当我转到wp admin时,登录表单显示正常,但当我输入用户名并通过时,每次都会再次显示登录表单。使用密码恢复功能会导致电子邮件未找到错误。我知道用户名密码和电子邮件是正确的,b/c我可以访问mysql数据库,我可以看到值(至少用户名和电子邮件) 有人知道会出什么问题吗