web-dev-qa-db-fra.com

Enregistrer l'email en tant que nom d'utilisateur

J'utilise Wordpress 4.9.4 dans un multisite Wordpress et je dois permettre aux utilisateurs de s'enregistrer en utilisant leur adresse électronique comme nom d'utilisateur. En regardant le code, j'ai trouvé que ce qui m'empêche d'accomplir cela, c'est que dans le fichier ms-functions.php, il existe une expression régulière filtrant les noms d'utilisateurs qui ont des caractères autres que z. contient des lettres minuscules (az) et des chiffres. " J'ai changé cette expression régulière dans le fichier ms-functions.php et cela fonctionne bien. Ma question est la suivante: je ne veux pas avoir à recoder la fonction wpmu_validate_user_signup chaque fois que je mets à jour mon wordpress. Quelles seraient les bonnes pratiques concernant ce problème? Devrais-je créer un autre includes/ms-functions.php dans un theme_child? Si tel est le cas, puis-je créer uniquement cette fonction ou je dois copier le fichier ms-functions.php au complet?

Merci

2
Gonzalo

Les courriels ne peuvent pas être utilisés comme noms d’utilisateur, Wordpress les utilisant par défaut comme noms d’URL (par exemple, la page de l’auteur). Par conséquent, il ne suffit pas de laisser les utilisateurs s'enregistrer avec des adresses électroniques, vous devez également disposer d'un code pour gérer les problèmes liés aux URL.

Quoi qu'il en soit, cela ressemble à un problème XY . Étant donné que les utilisateurs peuvent se connecter avec leur adresse électronique, pourquoi s’intéresserait-il réellement à ce que leur identifiant de connexion est créé au moment de l’inscription? La chose la plus simple à faire est de créer un formulaire d'inscription dans lequel vous créez un nom d'utilisateur "assaini" pour l'utilisateur en fonction de son email si vous ne voulez pas qu'il en pense un.

2
Mark Kaplun

Voici une version plus sûre du filtre de Gonzalo, qui supprime uniquement l'erreur de validation qui se lit "Les noms d'utilisateur ne peuvent contenir que des lettres minuscules (a-z) et des nombres". À la place, il utilise une validation similaire mais autorise les mêmes caractères que ceux trouvés dans sanitize_email ().

Le seul inconvénient est que cela vérifie le nom du message d'erreur. Si WordPress change ce message d'erreur à l'avenir, cela ne fonctionnera plus. Mais c’est le seul moyen de cibler ce message de validation spécifique.

/**
 * Allow users to sign up using an email address as their username. 
 * Removes the default restriction of [a-z0-9] and replaces it with [a-z0-9+_.@-].
 *
 * @param $result
 *
 * @return array $result
 */
function wpse_295037_disable_username_character_type_restriction( $result ) {
    $errors = $result['errors'];
    $user_name = $result['user_name'];

    // The error message to look for. This should exactly match the error message from ms-functions.php -> wpmu_validate_user_signup().
    $error_message = __( 'Usernames can only contain lowercase letters (a-z) and numbers.' );

    // Look through the errors for the above message.
    if ( !empty($errors->errors['user_name']) ) foreach( $errors->errors['user_name'] as $i => $message ) {

        // Check if it's the right error message.
        if ( $message === $error_message ) {

            // Remove the error message.
            unset($errors->errors['user_name'][$i]);

            // Validate using different allowed characters based on sanitize_email().
            $pattern = "/[^a-z0-9+_.@-]/i";
            if ( preg_match( $pattern, $user_name ) ) {
                $errors->add( 'user_name', __( 'Username is invalid. Usernames can only contain: lowercase letters, numbers, and these symbols: <code>+ _ . @ -</code>.' ) );
            }

            // If there are no errors remaining, remove the error code
            if ( empty($errors->errors['user_name']) ) {
                unset($errors->errors['user_name']);
            }
        }
    }

    return $result;
}
add_filter( 'wpmu_validate_user_signup', 'wpse_295037_disable_username_character_type_restriction', 20 );
1
Radley Sustaire

J'ai trouvé une autre solution sur un site web. En ajoutant ce code en haut de la classe du plug-in d'enregistrement (dans ce cas, Gravity Forms) annule la validation et permet à l'e-mail d'être utilisé comme nom d'utilisateur:

function custom_register_with_email($result) {

   if ( $result['user_name'] != '' && is_email( $result['user_name'] ) ) {

      $result['errors']->remove('user_name');

   }

   return $result;
}
add_filter('wpmu_validate_user_signup','custom_register_with_email');
1
Gonzalo