Email come Username nella registrazione
Molti utenti vorrebbero permettere la registrazione in un sito WordPress senza un username, utilizzando solo un'email.
Questo è un problema di base, quindi la soluzione (un trucco) è sostituire l'username con l'email.
Se WordPress richiede un username e un'email per la registrazione, possiamo prendere il valore dell'email e inserirlo nel valore dell'username. Nel modulo di registrazione gli utenti vedranno due campi:
- la tua email
- ripeti la tua email
Questo è un trucco, perché per WordPress i campi reali saranno: 1. username (come la tua email) 2. la tua email (come ripeti la tua email)
Ma c'è un altro problema: il carattere @ (chiocciola) è permesso per l'username?
Come possiamo fare questo?
Dovremmo inserire un codice nel file functions.php?.. qualcosa come questo:
add_action( 'wp_core_validate_user_signup', 'custom_validate_user_signup' );
function custom_validate_user_signup($result)
{
// Rimuove gli errori relativi al nome utente
unset($result['errors']->errors['user_name']);
// Se l'email è valida e non ci sono errori
if(!empty($result['user_email']) && empty($result['errors']->errors['user_email']))
{
// Imposta l'username come hash MD5 dell'email
$result['user_name'] = md5($result['user_email']);
$_POST['signup_username'] = $result['user_name'];
}
return $result;
}
Grazie in anticipo!

Puoi utilizzare @
e .
nei nomi utente, quindi non ci sono problemi. Ora potresti creare il tuo modulo di registrazione e usare register_new_user()
. Potresti persino manipolare wp_registration_url()
con il filtro register_url
, così il link di registrazione punterà alla tua nuova pagina di registrazione.
Se vuoi usarlo con l'interfaccia standard fornita da wp-login.php, avrai bisogno di qualche soluzione alternativa. Diciamo che vuoi mostrare solo il campo email per la registrazione, potresti semplicemente (beh, è un po' artificioso) nascondere il campo username con qualcosa del genere:
add_action( 'register_form', function() {
?><style>#registerform > p:first-child{display:none;}</style><?php
} );
Nota a margine: C'è anche la possibilità di caricare fogli di stile in wp-login.php usando l'azione login_enqueue_scripts
.
Ma se lo fai invierai un nome utente vuoto, quindi devi intervenire su due filtri: sanitize_user
e 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
sostituiamo la stringa vuota con l'indirizzo email. Successivamente il nome utente sarà validato con validate_username
, ma di nuovo verrà usato un nome utente vuoto, quindi dobbiamo gestire anche questo caso.
Ma penso che creare un modulo personalizzato sarebbe preferibile e meno artificioso.

Sei sulla strada giusta, ma non puoi restituire $_POST['user_email'] come username, non è sanificato e potrebbe contenere caratteri non validi per l'username di WP; ciò causerà problemi in futuro.

Sì, non sono sicuro al 100% neanche io, ma non trovo un esempio in cui qualcosa in $_POST['user_email'] passi come email valida e causi comunque problemi come username.

Quindi, non esiste una funzione che prende il "valore email" e lo inserisce nel "valore username"??? :/

Potresti usare l'azione user_register
per modificare nuovamente il nome utente dopo la registrazione riuscita per essere sicuro. https://codex.wordpress.org/Plugin_API/Action_Reference/user_register Ma non ho visto altre operazioni di sanitizzazione su user_email
. Controllerò di nuovo.

Grazie @websupporter! Al momento uso il plugin WP User Manager, che permette di cambiare l'etichetta dei campi, quindi ho sostituito "Username" con "Inserisci La Tua Email" e "Email" con "Ripeti La Tua Email". Non è la soluzione migliore, non ho il controllo se i valori inseriti nei campi corrispondono, ma funziona...

Questo codice funziona bene per wp core, basta inserirlo nel file functions.php:
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'];
}
});

fantastico. Aggiungilo come risposta e segnalalo così altre persone possono trovarlo rapidamente :)

Ciao, grazie per la condivisione ho quasi la stessa domanda. Voglio forzare l'uso dell'Email come username aggiungendo un @ e il . obbligatorio nel campo username. C'è qualcosa di nuovo riguardo la tua soluzione?

Ecco quello che ho usato:
jQuery(document).ready(function($){
// nasconde il campo username
$('input#user_login').parent().parent().hide();
// forza lo username a rispecchiare l'input del campo email
$('input#email').on('change',function(){
$('#user_login').val($(this).val());
});
});
Semplice ed efficace.

Aggiungi questo nel file functions.php (o in un altro file 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'azione stamperà lo script nel "footer" di wp-login.php. Il javascript nasconde l'etichetta e l'input "user_login", e imposta il suo valore con quello dell'input email.
