web-dev-qa-db-fra.com

Email en tant que nom d'utilisateur lors de l'enregistrement

de nombreux utilisateurs autoriseraient l’enregistrement sur un site wp sans nom d’utilisateur, mais seulement avec un courrier électronique.

Il s’agit d’un problème fondamental. La solution (une astuce) consiste donc à remplacer le nom d’utilisateur par un courrier électronique.

Si wp requiert un nom d'utilisateur et un courrier électronique pour l'enregistrement, nous pouvons obtenir une valeur de courrier électronique et la mettre dans la valeur du nom d'utilisateur. Dans le formulaire d'inscription, les utilisateurs verront deux champs:

  1. votre email
  2. répétez votre email

C'est une astuce, car pour wp les champs réels seront: 1. nom d'utilisateur (comme votre email) 2. votre email (comme répéter votre email)

Mais il y a un autre problème: le @ (at) est-il un caractère autorisé pour le nom d'utilisateur?

Comment peut-on le faire?

Devrions-nous insérer un code dans functions.php file? .. quelque chose comme ceci:

add_action( 'wp_core_validate_user_signup', 'custom_validate_user_signup' );

function custom_validate_user_signup($result)
{
  unset($result['errors']->errors['user_name']);

  if(!empty($result['user_email']) && empty($result['errors']->errors['user_email']))
  {
    $result['user_name'] = md5($result['user_email']);
    $_POST['signup_username'] = $result['user_name'];
  }

  return $result;
}

Merci d'avance!

3
ste_yeu

Vous pouvez utiliser @ et . dans les noms d'utilisateurs, il n'y a donc aucun problème. Vous pouvez maintenant créer votre propre formulaire de registre et utiliser register_new_user() . Vous pouvez même manipuler wp_registration_url() avec le filtre register_url , de sorte que le lien de registre pointe vers votre nouvelle page de registre.

Si vous souhaitez l’utiliser avec l’interface standard fournie par wp-login.php , vous avez besoin de quelques solutions de contournement. Disons que vous voulez seulement afficher le champ de saisie du courrier électronique pour l'enregistrement, vous pouvez simplement (enfin, c'est un peu compliqué) masquer le champ du nom d'utilisateur avec quelque chose comme:

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

Note: Il est également possible de mettre en file d'attente les feuilles de style dans l'action wp-login.php à l'aide de l'action login_enqueue_scripts.

Mais si vous le faites, vous allez envoyer un nom d'utilisateur vide, vous devez donc vous connecter à deux filtres: sanitize_user et validate_username.

add_filter( 'sanitize_user', function( $sanitized_user, $raw_user, $strict ) {
    if ( $raw_user != '' ) {
        return $sanitized_user;
    }

    if ( ! empty ( $_REQUEST['action'] ) && $_REQUEST['action'] === 'register' && is_email( $_POST['user_email'] ) ) {
        return $_POST['user_email'];
    }

    return $sanitized_user;
}, 10, 3 );

add_filter( 'validate_username', function( $valid, $username ) {
    if ( $valid ) {
        return $valid;
    }

    if ( ! empty ( $_REQUEST['action'] ) && $_REQUEST['action'] === 'register' && is_email( $_POST['user_email'] ) ) {
        return true;
    }

    return is_email( $username );
}, 10, 2 );

Dans sanitize_user, nous remplaçons la chaîne vide par l'adresse électronique. Plus tard, le nom d'utilisateur sera validé avec validate_username, mais encore une fois, le nom d'utilisateur vide sera utilisé, nous devons donc le détecter également.

Mais je pense que créer une propre forme serait préférable et moins hacky.

3
websupporter

Voici ce que j'ai utilisé:

jQuery(document).ready(function($){
    // hide the username field.
    $('input#user_login').parent().parent().hide();
    // force username to mirror the input of the email field
    $('input#email').on('change',function(){
        $('#user_login').val($(this).val());
    });
});

Sympa et simple.

2
squarecandy

Ajoutez ceci dans functions.php (ou un autre fichier php):

add_action('login_footer', function() {
?><script type="text/javascript">
    document.querySelector('input#user_login').parentElement.hidden = true ;
    document.querySelector('input#user_email').onchange = function(){
        document.querySelector('input#user_login').value = this.value ;
    } ;
</script><?php
} );

L'action imprimera le script dans le "pied de page" wp-login.php. Le javascript masque le libellé et l'entrée "user_login" et définit sa valeur avec la valeur d'entrée du courrier électronique.

1
Fred Autier