Est-il possible de supprimer le champ du nom d'utilisateur de la page d'inscription? Si c'est le cas, comment?

16

Est-il possible de supprimer le champ du nom d'utilisateur de la page d'inscription?

Je souhaite que les utilisateurs n'entrent que leur e-mail et mot de passe.
Un nouvel utilisateur doit être créé sur la base de ces deux paramètres uniquement.

Est-ce possible et si oui, comment?

phpnwordpress
la source

Réponses:

11

Absolument OUI , vous pouvez y parvenir.

Règle 1: WordPress nécessite un nom d'utilisateur. Nous devons fournir un nom d'utilisateur.

Règle 2: ne modifiez pas le code principal de WordPress.

Nous pouvons y parvenir en masquant le champ du nom d'utilisateur, recevoir un e-mail et le stocker sous le nom d'utilisateur.

Étape 1: supprimer le champ de texte Nom d'utilisateur

add_action('login_head', function(){
?>
    <style>
        #registerform > p:first-child{
            display:none;
        }
    </style>

    <script type="text/javascript" src="<?php echo site_url('/wp-includes/js/jquery/jquery.js'); ?>"></script>
    <script type="text/javascript">
        jQuery(document).ready(function($){
            $('#registerform > p:first-child').css('display', 'none');
        });
    </script>
<?php
});

Étape 2: Supprimer l'erreur de nom d'utilisateur

//Remove error for username, only show error for email only.
add_filter('registration_errors', function($wp_error, $sanitized_user_login, $user_email){
    if(isset($wp_error->errors['empty_username'])){
        unset($wp_error->errors['empty_username']);
    }

    if(isset($wp_error->errors['username_exists'])){
        unset($wp_error->errors['username_exists']);
    }
    return $wp_error;
}, 10, 3);

Étape 3: Manipuler la fonctionnalité d'enregistrement d'arrière-plan.

add_action('login_form_register', function(){
    if(isset($_POST['user_login']) && isset($_POST['user_email']) && !empty($_POST['user_email'])){
        $_POST['user_login'] = $_POST['user_email'];
    }
});

Mettez le code ci-dessus dans le fichier functions.php de votre thème .

Vous pouvez également télécharger un plugin complet pour y parvenir.

Plugin: https://wordpress.org/plugins/smart-wp-login/

Nishant Kumar
la source
4

L'étape 3 du post de Nishant Kumars vérifie si isset($_POST['user_login'])cela n'a pas fonctionné pour moi, car la connexion est ce que nous voulons réellement supprimer.

Ma solution est la suivante (dans le fichier functions.php du thème), également en tant que fonction distincte, pour rester avec le style de code wordpress:

function copy_username_to_email (){
    if(isset($_POST['user_email']) && !empty($_POST['user_email'])){
        $_POST['user_login'] = $_POST['user_email'];
    }
}
add_action('login_form_register', 'copy_username_to_email');
mcnesium
la source
@.$_POST['user_login'] = str_replace(array('@', '.'), '_', $_POST['user_email']);
J'obtenais
4

@Nishant Kumar a donné la réponse parfaite et devrait être acceptée à cette question. Cependant, il y a un problème après la sortie de la version Wordpress 4.0. Du codex -

Remarque: Depuis 4.0, ces propriétés sont privées, voir [28511] .

registration_errors le filtre ici nécessite une petite modification.

//Remove error for username, only show error for email only.

add_filter('registration_errors', 'remove_username_empty_error', 10, 3);

function remove_username_empty_error($wp_error, $sanitized_user_login, $user_email){

    if(isset($wp_error->errors['empty_username'])){
        $wp_error->remove('empty_username');
    }    
    if(isset($wp_error->errors['username_exists'])){
        $wp_error->remove('username_exists');
    }
    return $wp_error;
}

Note: Comme @mcnesium mentionné, si nous complètement débarrassés du champ de nom d' utilisateur (dans mon cas je Thème mon plugin de connexion pour remplacer le formulaire d'inscription régulière et là je juste enlevé le champ nom d' utilisateur) , puis $_POST['user_login']sera nullet l' état ne correspond pas à du tout. Nous ferions mieux de supprimer cela de la condition comme l'a suggéré @mcnesium.

maksbd19
la source
2

En itérant sur la réponse de @ nishant-kumar, voici un JS vanille, aucun script js supplémentaire, 1 étape, aucune modification de back-end nécessaire, solution pour créer un formulaire d'inscription avec uniquement l'entrée e-mail:

/** Hook your code to the login / Sign up page **/
add_action('login_head', function(){

    /* Style to hide the user_name field group */
    ?>
    <style>
        #registerform > p:first-child{
            display:none;
        }
    </style>

    <script type="text/javascript">
        /* Execute this action when the DOM is ready AND after everything in the page is loaded */
        let user_email;
        window.addEventListener('load',function() {
            user_email = document.querySelector('[name="user_email"]');
            if(user_email) { // Execute only if there is a user_email field on page
                user_email.addEventListener('keyup',syncUserName);
                user_email.addEventListener('change',syncUserName);
            }
        });

        /* sync user_email's value with the hidden user_login field */
        function syncUserName() {
                document.querySelector('[name="user_login"]').value = user_email.value;
        }

    </script>
<?php
});

Il vous suffit d'ajouter ce code dans votre fichier functions.php (ou dans votre plugin personnalisé , si vous en avez un)

Gfra54
la source
1
J'ai essayé cela et j'ai eu une erreur user_email is not defined at HTMLInputElement.syncUserName. Déplacer la partie "function syncUserName" à l'intérieur de la fonction supérieure supprime l'erreur et l'extrait de code fonctionne considérablement. Il suffit de commenter pour que d'autres puissent rencontrer le même problème. Merci Gfra54.
Betty
Vous avez tout à fait raison @betty, j'ai corrigé ma réponse pour mettre la user_emailvar dans la même portée. Merci.
Gfra54
1

Je pense que toute solution à cette demande va être un «hack» car wordpress nécessite qu'il y ait un nom d'utilisateur pour tous les utilisateurs enregistrés. Même le plugin mentionné ci-dessus est très probablement en train de trouver le nom d'utilisateur via l'adresse e-mail, puis d'utiliser ce nom d'utilisateur pour se connecter au site.

Si vous êtes d'accord avec un hack, voici un concept qui pourrait fonctionner:

1) Préremplissez le champ du nom d'utilisateur dans votre formulaire d'inscription avec un numéro unique, en utilisant l'horodatage actuel est une bonne idée pour éviter d'obtenir des doublons. Vous cacheriez alors ce champ pour que l'utilisateur ne le voie pas à l'écran lors du remplissage de son formulaire.

Si vous utilisez jQuery, vous pouvez utiliser quelque chose comme:

$(document).ready(function() {
    var timestamp = (new Date).getTime();
    $('form input.username').val(timestamp);
    $('form input.username').css('display', 'none');
});

Dans cet exemple, 'form input.username' serait le sélecteur jQuery pour trouver le champ username, vous devrez vérifier la structure html sur votre page pour vous assurer que le sélecteur correspond à la structure.

2) Utilisez un plugin comme celui mentionné précédemment ( http://wordpress.org/extend/plugins/wp-email-login/ ) pour permettre aux utilisateurs de se connecter avec leur adresse e-mail.

Matt Keys
la source