Server side validation

时间:2014-11-26 作者:john23klipp

我正在尝试对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;
    }
}

5 个回复
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。

SO网友:Nicolai Grossherr

在我看来,实现这一目标最简单的方法就是利用PHP: Sessions, so the $_SESSION global or some thing like »WP Session Manager«. 使用会话时,您可以在重定向之前将post数据添加到会话变量中,并在重定向之后使数据可用。

SO网友:chrisdillon

Autosave妨碍了您。

How to properly turn off REVISIONS and AUTOSAVE for whole site and optionally for a custom post type only

(我只想留下一条评论,但我缺乏可信度。)

SO网友:Privateer

虽然已经有一段时间了,但我认为使用wp\\u die()然后点击后退按钮将重新显示页面,表单数据保持原样。

如果是这种情况,您可以使用wp\\u die提供一条消息,说明问题是什么,可能是如何解决的,并在浏览器中选择后退按钮,解决问题,然后重试。

更好的方法可能是:

使用pre\\u post\\u更新挂钩,进行验证,然后。。。

创建未验证的每个字段的列表,可能还有解释

  • 将验证失败的内容更改为用户更改前的内容,编写一个包含错误数组的自定义用户元条目,在表单显示中写入post数据(已清除了错误数据),抓取创建的用户元,并使用它覆盖显示的数据,并提供有关每个字段错误的注释

    保存的用户元可能如下所示:

    $meta_value = array(
       \'field_name\' => array(
          \'bad_value\' => $users_bad_value,
          \'problem\' => \'Your data had this problem with it\'
       )
    );
    update_user_meta( $user_id, "_edit_post_problems_{$post_id}", $meta_value );
    
    只是不要忘记在页面加载期间读取元数据后删除它。

  • SO网友:Fyn

    这听起来像是可以在AJAX的帮助下解决的问题。查看WordPress插件手册的“JavaScript、AJAX和jQuery”部分:

    https://developer.wordpress.org/plugins/javascript/jquery/

    不要让它是一本插件手册这一事实激怒你。为这项任务创建一个小插件可能很有用,否则您可以使用函数中的说明。php

    阅读手册说明后,我会这样做:

    我会使用希望用jquery验证的字段的更改或模糊事件来触发ajax请求

    结束

    相关推荐

    Comment form validation

    如何设置注释字段的验证规则?我更改了评论者姓名/电子邮件/主页onmouseover和onblur的值(我使用它而不是标签-因此如果字段为空,它会显示“您的电子邮件”、“您的主页”等)。问题是,在提交时,它会在主页字段中提交此文本(因为它没有验证,而不像电子邮件字段,如果您输入了除[email protected]).如何验证主页字段?