如果缺少WordPress,编辑配置文件验证将刷新所有字段

时间:2017-07-10 作者:Charles Xavier

在编辑配置文件部分,每当我更新一个字段时,如果我错过了一个必填字段(昵称)并将电子邮件地址更改为新的,WordPress验证将刷新所有字段,并且我输入的新电子邮件地址将丢失。

我没有使用任何第三方插件来编辑配置文件,只有通用的WP插件。这是用户编辑页面https://github.com/WordPress/WordPress/blob/master/wp-admin/user-edit.php

enter image description here

enter image description here

1 个回复
最合适的回答,由SO网友:Johansson 整理而成

方法1,禁用保存按钮,您可以做的是防止用户在必填字段未填写时保存表单。这可以通过javascript简单地完成。

function require_fields_script(){
    echo "
        <script type=\'text/javascript\'>
            (function($){
                $(\'#submit\').on(\'click\',function(e){
                    if (!$(\'#email\').val() || !$(\'#nickname\').val()){
                        e.preventDefault();
                        if (!$(\'#email\').val()) {
                            window.alert(\'Please enter your email before saving.\');
                        } else {
                            window.alert(\'Please enter your nickname before saving.\');
                        }
                    }
                });
            })(jQuery);
        </script>";
}
add_action( \'admin_footer\', \'require_fields_script\' );
这也可以通过将值保存在瞬态/全局变量中并在失败保存后检索它们来实现,但这不是必需的。

关键是,如果没有设置字段,那么就没有理由让用户首先保存它。

方法2,恢复到默认值,还有另一个技巧。加载页面时,会有一些默认/预保存的值,如电子邮件和昵称。如果用户试图在不输入这些值的情况下保存表单,可以将其设置回旧值。要做到这一点,您可以这样做:

function require_fields_script(){
    echo "
        <script type=\'text/javascript\'>
            (function($){
                var currentMail = $(\'#email\').val();
                var currentNickname = $(\'#nickname\').val();
                $(\'#submit\').on(\'click\',function(e){
                    if (!$(\'#email\').val()){
                        $(\'#email\').val(currentMail);
                    }
                    if (!$(\'#nickname\').val()){
                        $(\'#nickname\').val(currentNickname);
                    }
                });
            })(jQuery);
        </script>";
}
add_action( \'admin_footer\', \'require_fields_script\' );
方法3,使用jQuery伪造管理警报我们可以使用$.before 如果未设置字段。我们就是这样做的:

function require_fields_script(){
    echo "
        <script type=\'text/javascript\'>
            (function($){
                $(\'#submit\').on(\'click\',function(e){
                    if (!$(\'#email\').val()){
                        e.preventDefault();
                        $( \'#your-profile\' ).before( \'<div class=\\\'error\\\'><p><strong>ERROR</strong>: Please enter an email.</p><button type=\\\'button\\\' class=\\\'notice-dismiss\\\'><span class=\\\'screen-reader-text\\\'>Dismiss this notice.</span></button></div>\' );
                        $(\'html,body\').animate({scrollTop:0},700);
                    }
                    if (!$(\'#nickname\').val()){
                        e.preventDefault();
                        $( \'#your-profile\' ).before( \'<div class=\\\'error\\\'><p><strong>ERROR</strong>: Please enter a nickname.</p><button type=\\\'button\\\' class=\\\'notice-dismiss\\\'><span class=\\\'screen-reader-text\\\'>Dismiss this notice.</span></button></div>\' );
                        $(\'html,body\').animate({scrollTop:0},700);
                    }
                });
            })(jQuery);
        </script>";
}
add_action( \'admin_footer\', \'require_fields_script\' );
这将抛出一个错误并将页面滚动到顶部,以便用户可以注意到错误。我们可以删除div 之后,由于它将在保存时自动删除,因此实际上没有必要这样做。无论如何,要删除错误,可以使用$.remove():

if ($(\'.error\').length) {
    $(\'.error\').remove();
}
补丁更新我创建了一个补丁,通过执行AJAX和jQuery检查完全解决了这个问题。可在trac上找到修补程序here. 目前它有一个小错误,我很快就会介绍它。

结束

相关推荐

Server side validation

我正在尝试对post字段(自定义和/或非自定义字段)进行服务器端验证。验证工作正常,但如果验证失败,我似乎无法阻止帖子保存。我试过像这样的钩子save_post, publish_post, wp_insert_post_data, 等等。所有这些钩子都被调用了,但除非我使用wp_die(). 要明确的是,我不想改变职位状态;我只想返回到帖子页面(未保存),并在字段验证失败时显示一条消息。我认为这是非常基本的东西,但无论我做什么,这篇文章都会被保存下来。UPDATE:好的,那么pre_post_updat