我在这段代码的第3,6和7行收到了未定义索引“id”的注意事项。我无法弄清楚我做错了什么:
if ( isset($_POST['action']) && $_POST['action'] == 'save' ) {
foreach ($options as $value) {
if(($value['type'] === "checkbox" or $value['type'] === "multiselect" ) and is_array($_REQUEST[ $value['id'] ]))
{ $_REQUEST[ $value['id'] ]=implode(',',$_REQUEST[ $value['id'] ]); //This will take from the array and make one string
}
$key = $value['id'];
$val = $_REQUEST[$key];
$settings[$key] = $val;
}
我认为这是一件很小的事情要解决,但我尝试过的任何东西都没有运气。我做的一件事是运行var_dump($ key),有时$ key是null,有时候不是。所以我假设它与此有关。
顺便说一句,这是WordPress主题的选项页面的一部分。这是作为“保存”功能的一部分运行的代码。
如果关闭调试模式,脚本实际上可以正常工作,但是当调试模式打开时,当按下选项页面上的保存按钮时会弹出这些注意事项。提前感谢任何见解,如果我需要发布更多代码以提供更多上下文,请告诉我。
编辑:我在pastebin中发布了选项页面。它的长。它包含t13lo的修复程序。问题代码在1957行。谢谢:http://pastebin.com/NGX6qzgr
答案 0 :(得分:1)
您可以将第3行更改为:
if ( ($value['type'] === "checkbox" || $value['type'] === "multiselect" ) && isset($_REQUEST['id']) && is_array($_REQUEST[ $value['id'] ]) )
但是,foreach中的其余代码似乎依赖于$value['id']
。并不总是设置此值,因此它可以生成以下行:
$key = $value['id'];
$val = $_REQUEST[$key];
$settings[$key] = $val;
如果未设置$value['id']
,则无关紧要。如果是这种情况,将当前在foreach中的所有代码放在if (isset($value['id'])) {
中可能是合适的。
您需要进一步分析和理解代码是什么(以及需要做什么)才能确定正确的逻辑。
答案 1 :(得分:1)
不知道你的代码是做什么的,但根据你发布的内容给出了一个镜头..(显然只替换代码的foreach循环部分)..
foreach ($options as $value) {
if( !isset( $value['id'] ) )
continue;
if( !isset( $_REQUEST[$value['id']] ) ) {
$settings[$value['id']] = '';
continue;
}
if( $value['type'] === "checkbox" || $value['type'] === "multiselect" ) {
// No isset check here, the top conditional catches non-set items
if( is_array( $_REQUEST[$value['id']] ) )
$_REQUEST[$value['id']] = implode( ',', $_REQUEST[$value['id']] );
}
$settings[$value['id']] = $_REQUEST[$value['id']];
}
应该与之前完全相同,除了检查变量首先设置,同时在$ settings数组中将值设置为空字符串时,匹配的$ _REQUEST var未设置..(假设我' m遵循代码正确的做法,即...)
编辑: 在评论中进行了讨论后,我更新了上面的代码,这应该修复1957行的通知。有意义的是,不为代码设置该密钥,并非$options
中的所有数组项都是实际选项,有些是指在主题选项页面上输出的标题/标签(无论如何)(所以在上面的循环中跳过它们是有意义的。)
我认为这样可以解决您的问题,但我已经说过,我认为重要的是要指出该功能中的代码并不理想,整个保存机制整体看起来并不是很好。我倾向于建议将该页面的所需功能设置为manage_options
,因此它至少限制在管理员之前,直到可以实施替换为止(建议应该在单独的问题中,理想情况下)在WPSE)。
答案 2 :(得分:0)
试试这个:
if(($value['type'] === "checkbox" || $value['type'] === "multiselect" ) && isset($value['id']) && is_array($_REQUEST[ $value['id'] ])){ ...