it-swarm.com.de

Registrieren Sie die E-Mail als Benutzername

Ich verwende Wordpress 4.9.4 in einer Wordpress Multisite und muss Benutzern erlauben, sich mit ihrer E-Mail-Adresse als Benutzername zu registrieren. Beim Betrachten des Codes stellte ich fest, dass das, was mich daran hindert, ist, dass es in der ms-functions.php einen regulären Ausdruck gibt, der Benutzernamen filtert, die andere Zeichen als az haben. Wenn also eine E-Mail der Benutzername ist, würde ich nur "Benutzernamen können" erhalten enthalten Kleinbuchstaben (az) und Zahlen. " Ich habe diesen regulären Ausdruck in der ms-functions.php geändert und es funktioniert gut. Jetzt ist meine Frage, ich möchte nicht jedes Mal, wenn ich mein WordPress aktualisiere, die Funktion wpmu_validate_user_signup neu codieren müssen. Was wären gute Praktiken in Bezug auf dieses Problem? Soll ich ein weiteres Includes/ms-functions.php in einem theme_child erstellen? Wenn ja, kann ich nur diese Funktion erstellen oder muss ich die gesamte ms-functions.php kopieren?

Vielen Dank

2
Gonzalo

E-Mails können nicht als Benutzernamen verwendet werden, da WordPress standardmäßig Benutzernamen als Teil von URLs verwendet (z. B. die Autorenseite). Es reicht daher nicht aus, Benutzer mit E-Mail-Adressen registrieren zu lassen. Sie benötigen auch Code, um die URL-bezogenen Probleme zu behandeln.

Wie auch immer, das klingt nach einem XY-Problem . Da Benutzer sich mit ihrer E-Mail-Adresse anmelden können, warum sollte es irgendjemandem etwas ausmachen, welches Anmelde-Handle bei der Registrierung erstellt wird? Am einfachsten ist es, ein Registrierungsformular zu erstellen, in dem Sie einen "bereinigten" Benutzernamen für den Benutzer auf der Grundlage seiner E-Mail-Adresse erstellen, wenn Sie nicht möchten, dass er an einen Namen denkt.

2
Mark Kaplun

Hier ist eine sicherere Version des Gonzalo-Filters, mit der nur der Überprüfungsfehler behoben wird, der lautet "Benutzernamen dürfen nur Kleinbuchstaben (a-z) und Zahlen enthalten." Stattdessen wird eine ähnliche Überprüfung verwendet, die jedoch dieselben Zeichen zulässt, die in sanitize_email () angezeigt werden.

Die einzige Einschränkung ist, dass der Name der Fehlermeldung überprüft wird. Wenn WordPress diese Fehlermeldung in Zukunft ändert, funktioniert dies nicht mehr. Dies ist jedoch die einzige Möglichkeit, auf diese spezifische Validierungsnachricht abzuzielen.

/**
 * Allow users to sign up using an email address as their username. 
 * Removes the default restriction of [a-z0-9] and replaces it with [[email protected]].
 *
 * @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 = "/[^[email protected]]/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

Ich habe in einer Website eine andere Lösung gefunden. Indem Sie diesen Code an die Spitze der Klasse des Registrierungs-Plugins setzen (in diesem Fall Gravity Forms), wird die Validierung außer Kraft gesetzt und die E-Mail kann als Benutzername verwendet werden:

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