从阅读通知开始——它们非常明确地告诉你问题是什么。
让我们从第一个开始:
Notice: Undefined index: _wr_event_speaker in /Users/my/htdocs/wr/wp-content/themes/wr/functions.php on line 246
首先,这只是一个“通知”。这意味着实际上没有发生错误。PHP只是告诉您有些地方不太正确,但它跳过了问题并继续执行脚本的其余部分。
接下来,通知本身是“未定义索引:\\u wr\\u event\\u speaker”。“未定义索引”表示您正在尝试访问实际上不存在的数组键(键为“\\u wr\\u event\\u speaker”)。对于元框,您可能正在执行以下操作:
<input type="text" name="something" value="<?php echo $my_array[\'_wr_event_speaker\'] ?>" />
但由于您正在创建一篇新帖子,因此还没有为\\u wr\\u event\\u speaker设置值,因此您试图回应一些不存在的内容,并触发通知。这解释了为什么通知只发生在新帖子上——旧帖子确实为\\u wr\\u event\\u speaker设置了一个值,所以没有问题。
现在,看看通知的结尾。它告诉您,该通知是在文件“/Users/my/htdocs/wr/wp-content/themes/wr/functions.php”的第246行触发的。这就是您将看到有问题的代码的地方(可能与上面的示例类似)。
您可以通过许多不同的方式避免此类警告。所有这些都涉及在尝试访问数组键之前检查数组键是否已实际设置。一种方法(如果要内联执行)是在echo语句中使用“三元运算符”,如下所示:
<input type="text" name="something" value="<?php echo ( isset( $my_array[\'_wr_event_speaker\'] ) ? $my_array[\'_wr_event_speaker\'] : \'\' ); ?>" />
这对php说:“如果设置了$my\\u array[\'\\u wr\\u event\\u speaker\',请打印其值,否则打印一个空字符串”。它将阻止通知被绊倒。
最好的做法是在打印数组键或对象属性之前,始终检查其是否存在。
EDIT BASED ON OP\'S COMMENTS
以下是我根据您发布的代码剪报建议的修改。看起来很多,但我添加了一些评论(我希望)让它更清楚。其要点是,除了使用“isset”(问题的最初症结所在)之外,在将任何函数挂接到save\\u post操作时,您应该始终添加以下样板。为了避免未来的问题,需要解释一些奇怪之处。
add_action(\'save_post\', \'save_details\');
function save_details($post_id){
// Check for autosaves and quickedits. This is really important.
// These types of saves DON\'T pass in any custom meta box values, so for autosaves
// and quickedits, just bail right away, or our post meta values will be
// overwritten with blank ones!
if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE || (defined(\'DOING_AJAX\') && DOING_AJAX) )
return;
// The "save_post" action runs whenever any item of any type is saved, so you have to figure out what kind of item this is, and handle it accordingly.
// Otherwise, your DB will fill up with blank values for this post meta, associated with all post types.
$post_type = isset($_POST[\'post_type\']) ? $_POST[\'post_type\'] : \'\';
switch($post_type) {
// If this is the "post" post type
case "post":
// Update the _wr_event_review value
$wr_event_review = isset($_POST[\'_wr_event_review\']) ? wp_filter_post_kses($_POST[\'_wr_event_review\']) : \'\';
update_post_meta($post->ID, \'event_review\', $wr_event_review);
break;
}
}
编辑注意:此时您应该真正清理输入。看起来这是一个文本区域?在这种情况下,你至少想通过
$_POST["_wr_event_review"]
通过
wp_filter_post_kses()
保存前。