web-dev-qa-db-fra.com

modifier la validation du profil actualise tous les champs s'il manque WordPress

Dans la section de modification du profil, chaque fois que je mets à jour un champ et si, par exemple, j'ai oublié un champ obligatoire (NickName) et changé l'adresse électronique en un nouveau, la validation WordPress actualise tous les champs et la nouvelle adresse électronique que j'ai sont entrés seraient perdus.

Je n'utilise aucun plug-in tiers pour éditer le profil uniquement le générique WP. Ceci est la page de modification de l'utilisateur https://github.com/WordPress/WordPress/blob/master/wp-admin/user-edit.php

 enter image description here 

 enter image description here 

4
Charles Xavier

Approche 1, désactiver le bouton Sauvegarder

Ce que vous pouvez faire est d'empêcher l'utilisateur de sauvegarder le formulaire si les champs requis ne sont pas renseignés. Cela peut être fait simplement via 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' );

Cela peut aussi être fait en sauvegardant les valeurs dans un transitoire/globals et en les récupérant après une sauvegarde en échec, mais ce n'est pas nécessaire.

Le fait est que, si le champ n’est pas défini, il n’ya aucune raison de laisser l’utilisateur le sauvegarder tout d’abord.

Approche 2, revenir aux valeurs par défaut

Il y a aussi une autre astuce. Lorsque vous chargez la page, il y aura une valeur par défaut/préenregistrée comme email et pseudonyme. Si l'utilisateur a essayé de sauvegarder le formulaire sans entrer ces informations, vous pouvez les rétablir avec les anciennes valeurs. Pour ce faire, voici votre chemin:

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' );

Approche 3, simuler une alerte d'administrateur à l'aide de jQuery

Nous pouvons créer une fausse erreur d'administration en utilisant $.before si les champs ne sont pas définis. C'est comme ça qu'on le fait:

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' );

Cela provoquera une erreur et fera défiler la page vers le haut, de sorte que l'utilisateur puisse être averti de l'erreur. Nous pouvons supprimer la div par la suite, mais comme elle sera automatiquement supprimée lors de la sauvegarde, ce n'est pas vraiment nécessaire. Quoi qu'il en soit, pour supprimer les erreurs, vous pouvez utiliser $.remove():

if ($('.error').length) {
    $('.error').remove();
}

PATCH UPDATE

J'ai créé un correctif qui résout complètement le problème en effectuant des vérifications AJAX et jQuery. Le patch peut être trouvé sur trac ici . Pour le moment, il y a un bug mineur, que je couvrirai bientôt.

6
Jack Johansson