web-dev-qa-db-ja.com

プロファイルの検証を編集すると、ワードプレスがない場合にすべてのフィールドが更新されます

プロファイルを編集するセクションで、フィールドを更新するときや、たとえば必須フィールド(NickName)を見逃して電子メールアドレスを新しいアドレスに変更した場合は、WordPress検証によってすべてのフィールドと新しい電子メールアドレスが更新されます。入力した内容は失われます。

一般的なWPのプロファイルのみを編集するために、サードパーティのプラグインを使用していません。これはユーザー編集ページです https://github.com/WordPress/WordPress/blob/master/wp-admin/user-edit.php

enter image description here 

enter image description here 

4
Charles Xavier

アプローチ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 にあります。現時点では、それはマイナーなバグを持っています、私はそれをすぐにそれをカバーします。

6
Jack Johansson