viele Benutzer würden die Registrierung auf einer wp-Site ohne einen Benutzernamen zulassen, nur mit einer E-Mail.
Dies ist ein Kernproblem, daher besteht die Lösung (ein Trick) darin, den Benutzernamen durch eine E-Mail zu ersetzen.
Wenn wp einen Benutzernamen und eine E-Mail-Adresse für die Registrierung benötigt, können wir den E-Mail-Wert abrufen und in den Benutzernamen eingeben. Im Registrierungsformular sehen Benutzer zwei Felder:
Dies ist ein Trick, denn für wp sind die echten Felder: 1. Benutzername (als Ihre E-Mail-Adresse) 2. Ihre E-Mail-Adresse (als Wiederholung Ihrer E-Mail-Adresse)
Es gibt aber noch ein anderes Problem: Ist das @ (at) ein zulässiges Zeichen für den Benutzernamen?
Wie können wir das machen?
Sollen wir einen Code in die Datei functions.php einfügen?
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;
}
Danke im Voraus!
Sie können @
und .
in Benutzernamen verwenden, sodass es kein Problem gibt. Nun können Sie Ihr eigenes Registrierungsformular erstellen und register_new_user()
verwenden. Sie können sogar wp_registration_url()
mit dem Filter register_url
manipulieren, sodass der Link zum Registrieren auf Ihre neue Registrierungsseite verweist.
Wenn Sie es mit der Standardschnittstelle verwenden möchten, die von wp-login.php bereitgestellt wird, benötigen Sie einige Problemumgehungen. Nehmen wir an, Sie möchten nur das E-Mail-Eingabefeld für die Registrierung anzeigen. Sie können das Feld für den Benutzernamen einfach (naja, es ist ein bisschen verrückt) folgendermaßen ausblenden:
add_action( 'register_form', function() {
?><style>#registerform > p:first-child{display:none;}</style><?php
} );
Anmerkung: Es besteht auch die Möglichkeit, Stylesheets mit der Aktion login_enqueue_scripts
in die Datei wp-login.php einzureihen.
Wenn Sie dies jedoch tun, senden Sie einen leeren Benutzernamen, sodass Sie zwei Filter verwenden müssen: sanitize_user
und 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 );
In sanitize_user
ersetzen wir die leere Zeichenfolge durch die E-Mail-Adresse. Später wird der Benutzername mit validate_username
validiert, aber auch hier wird der leere Benutzername verwendet, so dass wir auch diesen abfangen müssen.
Aber ich denke, eine eigene Form zu kreieren wäre vorzuziehen und weniger hackig.
Folgendes habe ich verwendet:
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());
});
});
Schön und einfach.
Fügen Sie dies in functions.php (oder einer anderen PHP-Datei) hinzu:
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
} );
Die Aktion druckt das Skript in der wp-login.php "Fußzeile". Das Javascript verbirgt das Label "user_login" und die Eingabe und setzt seinen Wert mit dem E-Mail-Eingabewert.