我有一个函数,它在post类型上定义了一个自定义字段。假设该字段为“subhead”。
保存帖子后,我想对输入进行一些验证,必要时在帖子编辑屏幕上显示一条错误消息。类似于:
// Handle post updating
function wpse_update_post_custom_values($post_id, $post) {
// Do some checking...
if($_POST[\'subhead\'] != \'value i expect\') {
// Add an error here
$errors->add(\'oops\', \'There was an error.\');
}
return $errors;
}
add_action(\'save_post\',\'wpse_update_post_custom_values\',1,2);
我正试图将此链接到save\\u post操作,但我不知道如何处理错误。似乎没有错误对象传递到函数中,如果我创建自己的WP\\u error obj并返回它,那么无论何种机制在编辑后页面上抛出错误,都不会尊重它。
目前,我的自定义元框中有一条页面错误消息,但这并不理想——我宁愿有一个大的、红色的、顶部向上的错误,就像WP通常显示的那样。
有什么想法吗?
UPDATE:
根据@Denis的回答,我尝试了几种不同的方法。将错误存储为全局错误不起作用,因为Wordpress在save\\u post过程中执行重定向,这会在显示全局错误之前杀死全局错误。
我最终将它们存储在一个元字段中。问题是你需要清除它们,否则当你导航到另一个页面时,它们不会消失,所以我不得不在admin\\u页脚上添加另一个函数来清除错误。
我没想到对如此常见的事情(更新帖子)的错误处理会如此笨拙。我是否遗漏了一些明显的东西,或者这是最好的方法?
// Handle post updating
function wpse_5102_update_post_custom_values($post_id, $post) {
// To keep the errors in
$errors = false;
// Do some validation...
if($_POST[\'subhead\'] != \'value i expect\') {
// Add an error here
$errors .= \'whoops...there was an error.\';
}
update_option(\'my_admin_errors\', $errors);
return;
}
add_action(\'save_post\',\'wpse_5102_update_post_custom_values\',1,2);
// Display any errors
function wpse_5102_admin_notice_handler() {
$errors = get_option(\'my_admin_errors\');
if($errors) {
echo \'<div class="error"><p>\' . $errors . \'</p></div>\';
}
}
add_action( \'admin_notices\', \'wpse_5102_admin_notice_handler\' );
// Clear any errors
function wpse_5102__clear_errors() {
update_option(\'my_admin_errors\', false);
}
add_action( \'admin_footer\', \'wpse_5102_clear_errors\' );
SO网友:davidn
我建议使用会话,因为当两个用户同时编辑时,这不会产生奇怪的效果。我就是这么做的:
会话不是由wordpress启动的。所以你需要start a session 在插件中,函数。php甚至wp配置。php:
if (!session_id())
session_start();
保存帖子时,将错误和通知附加到会话:
function my_save_post($post_id, $post) {
if($something_went_wrong) {
//Append error notice if something went wrong
$_SESSION[\'my_admin_notices\'] .= \'<div class="error"><p>This or that went wrong</p></div>\';
return false; //might stop processing here
}
if($somthing_to_notice) { //i.e. successful saving
//Append notice if something went wrong
$_SESSION[\'my_admin_notices\'] .= \'<div class="updated"><p>Post updated</p></div>\';
}
return true;
}
add_action(\'save_post\',\'my_save_post\');
打印通知和错误,然后清除会话中的消息:
function my_admin_notices(){
if(!empty($_SESSION[\'my_admin_notices\'])) print $_SESSION[\'my_admin_notices\'];
unset ($_SESSION[\'my_admin_notices\']);
}
add_action( \'admin_notices\', \'my_admin_notices\' );
SO网友:Joshua Coady
基于pospi\'ssuggestion 使用transients, 我想到了以下几点。唯一的问题是没有钩子将消息放在h2
其他消息去哪里了,所以我不得不做一个jQuery黑客来把它弄到那里。
首先,将错误消息保存在save_post
(或类似)处理程序。我给它一个60秒的短生命周期,所以它在那里的时间刚好足够重定向发生。
if($has_error)
{
set_transient( "acme_plugin_error_msg_$post_id", $error_msg, 60 );
}
然后,只需在下一个页面加载时检索并显示该错误消息。我还删除了它,这样它就不会显示两次。
add_action(\'admin_notices\', \'acme_plugin_show_messages\');
function acme_plugin_show_messages()
{
global $post;
if ( false !== ( $msg = get_transient( "acme_plugin_error_msg_{$post->ID}" ) ) && $msg) {
delete_transient( "acme_plugin_error_msg_{$post->ID}" );
echo "<div id=\\"acme-plugin-message\\" class=\\"error below-h2\\"><p>$msg</p></div>";
}
}
自
admin_notices
在生成主页内容之前激发,通知不是其他post edit消息所在的位置,因此我必须使用此jQuery将其移动到那里:
jQuery(\'h2\').after(jQuery(\'#acme-plugin-message\'));
由于帖子ID是临时名称的一部分,因此除了多个用户同时编辑同一篇帖子外,这应该适用于大多数多用户环境。