プロファイルを編集するセクションで、フィールドを更新するときや、たとえば必須フィールド(NickName)を見逃して電子メールアドレスを新しいアドレスに変更した場合は、WordPress検証によってすべてのフィールドと新しい電子メールアドレスが更新されます。入力した内容は失われます。
一般的なWPのプロファイルのみを編集するために、サードパーティのプラグインを使用していません。これはユーザー編集ページです https://github.com/WordPress/WordPress/blob/master/wp-admin/user-edit.php
あなたができることは、必要なフィールドが入力されていない場合にユーザーがフォームを保存しないようにすることです。これは、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' );
これは、一時/グローバルに値を保存し、フェイルセーブ後にそれらを取得することによっても行うことができますが、それは必要ではありません。
重要なのは、フィールドが設定されていない場合、最初にユーザーにフィールドを保存させる理由はないということです。
別のトリックもあります。あなたがページをロードするとき、電子メールとニックネームとしていくつかのデフォルトの/保存された値があるでしょう。ユーザーがこれらを入力せずにフォームを保存しようとした場合は、それらを元の値に戻すことができます。そうするために、これはあなたの道です:
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' );
フィールドが設定されていない場合は$.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 にあります。現時点では、それはマイナーなバグを持っています、私はそれをすぐにそれをカバーします。