我正在尝试对post字段(自定义和/或非自定义字段)进行服务器端验证。验证工作正常,但如果验证失败,我似乎无法阻止帖子保存。
我试过像这样的钩子save_post
, publish_post
, wp_insert_post_data
, 等等。所有这些钩子都被调用了,但除非我使用wp_die()
. 要明确的是,我不想改变职位状态;我只想返回到帖子页面(未保存),并在字段验证失败时显示一条消息。
我认为这是非常基本的东西,但无论我做什么,这篇文章都会被保存下来。
UPDATE:
好的,那么
pre_post_update
挂钩是一种选择。但是,如果验证失败,我需要使用
wp_redirect
返回编辑页而不保存。我正在存储失效MSG并将其显示在页面上,但通过这种方式
$_POST
数据已丢失。。。这当然是不可接受的。真的没有其他方法可以做到这一点吗?
以下是我目前的代码:
add_action(\'pre_post_update\', \'validate_meta\', 99, 2);
function validate_meta($post_id){
if ( defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE ) return $post_id;
if (!isset($_POST[\'post_type\']) ) return $post_id;
if ( !current_user_can( \'edit_posts\', $post_id ) ) return $post_id;
$errors = array();
if(trim($_POST[\'post_title\']) == \'\'){
$errors[] = new WP_Error(\'cpt_validation_titke\', \'Bitte einen Titel eintragen\', \'error\');
}
if (!empty($errors)) {
add_user_meta(get_current_user_id(), \'admin_notices\', $errors, true);
$url = admin_url( \'post.php?post=\' . $post_id ) . \'&action=edit\';
//exit;
wp_redirect( $url );
exit;
}
return $_POST;
}
// Display any errors
add_action( \'admin_notices\', \'admin_notice_handler\' );
function admin_notice_handler() {
$user_id = get_current_user_id();
$admin_notices = get_user_meta($user_id, \'admin_notices\', true);
if(!empty($admin_notices)){
$html = \'\';
if(is_wp_error($admin_notices[0])){
delete_user_meta($user_id, \'admin_notices\');
foreach($admin_notices AS $notice){
$msgs = $notice->get_error_messages();
if(!empty($msgs)){
$msg_type = $notice->get_error_data();
if(!empty($notice_type)){
$html .= \'<div class="\'.$msg_type.\'">\';
} else {
$html .= \'<div class="error">\';
$html .= \'<p><strong>Validation errors</strong></p>\';
}
foreach($msgs as $msg){
$html .= \'<p>- \'.$msg.\'</p>\';
}
$html .= \'</div>\';
}
}
}
echo $html;
}
}
SO网友:paxamus
您可以通过创建一个小插件或编辑主题函数文件来捕获表单提交,您可以使用ajax挂钩来实现这一点。在插件中,您可以将其加载到编辑帖子页面:
jQuery(document).ready(function(){
jQuery(\'#post\').submit(function(){
var request = jQuery(this).serializeArray();
request.push({name: \'action\', value: \'check_some_stuff\'});
jQuery.post(ajaxurl, request, function(response){
if(response.error){
response = jQuery.parseJSON(response);
jQuery(\'#local-storage-notice\').after(\'<div class="error">\'+response.error+\'</div>\');
});
return false;
} else {
return true;
}
});
});
当您返回false时,它将阻止表单提交。
ajax将调用函数check_some_stuff. 这个request
获取作为$\\u POST发送。然后,您可以根据需要验证服务器端:
add_action( \'wp_ajax_check_some_stuff\', \'check_some_stuff\' );
public function check_some_stuff()
{
//validate some stuff here
$valid = false;
if($valid){
$results = array(\'msg\'=>\'You win\');
print json_encode($results);
} else {
$results = array(\'error\'=>\'<pre>\'+print_r($_POST, true)+\'</pre>\');
print json_encode($results);
}
die();
}
如果需要,我可以更详细地介绍如何添加javascript。