È possibile rimuovere il campo username dalla pagina di registrazione? Se sì, come?
È possibile rimuovere il campo username dalla pagina di registrazione?
Voglio che gli utenti inseriscano solo email e password.
Un nuovo utente dovrebbe essere creato basandosi solo su questi due parametri.
È possibile e se sì, come?
// Aggiungi questo codice nel file functions.php del tuo tema
add_action('register_form', function() {
echo '<style>#user_login{display:none;}#user_email{display:block !important;}</style>';
});
add_filter('random_user_name', function($username, $email) {
// Crea username dall'email rimuovendo il dominio
return strstr($email, '@', true);
}, 10, 2);
// Imposta l'email come username se non viene fornito
add_action('login_form_register', function() {
if (isset($_POST['user_email']) && !isset($_POST['user_login'])) {
$_POST['user_login'] = $_POST['user_email'];
}
});

Assolutamente SI, puoi ottenere questo risultato.
Regola 1: WordPress richiede un nome utente. Dobbiamo fornire un nome utente.
Regola 2: Non modificare il codice core di WordPress.
Possiamo ottenere questo risultato nascondendo il campo nome utente, ottenendo l'email e memorizzandola come nome utente.
Passo 1: Rimuovere il campo di testo per il nome utente
add_action('login_head', function(){
?>
<style>
#registerform > p:first-child{
display:none;
}
</style>
<script type="text/javascript" src="<?php echo site_url('/wp-includes/js/jquery/jquery.js'); ?>"></script>
<script type="text/javascript">
jQuery(document).ready(function($){
$('#registerform > p:first-child').css('display', 'none');
});
</script>
<?php
});
Passo 2: Rimuovere l'errore per il nome utente
//Rimuove l'errore per il nome utente, mostra solo l'errore per l'email
add_filter('registration_errors', function($wp_error, $sanitized_user_login, $user_email){
if(isset($wp_error->errors['empty_username'])){
unset($wp_error->errors['empty_username']);
}
if(isset($wp_error->errors['username_exists'])){
unset($wp_error->errors['username_exists']);
}
return $wp_error;
}, 10, 3);
Passo 3: Manipolare la Funzionalità di Registrazione in Background.
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'];
}
});
Inserisci il codice sopra nel file functions.php del tuo tema.
Puoi anche scaricare un plugin completo per ottenere questo risultato.

Il passaggio 3 nel post di Nishant Kumar verifica isset($_POST['user_login'])
che non ha funzionato per me, poiché il login è ciò che vogliamo effettivamente rimuovere.
La mia soluzione è la seguente (nel file functions.php del tema), anche come funzione separata, per rimanere nello stile del codice WordPress:
function copy_username_to_email (){
if(isset($_POST['user_email']) && !empty($_POST['user_email'])){
$_POST['user_login'] = $_POST['user_email'];
}
}
add_action('login_form_register', 'copy_username_to_email');

@Nishant Kumar ha fornito la risposta perfetta e che dovrebbe essere accettata per questa domanda. Tuttavia, c'è un problema dopo il rilascio della versione di WordPress 4.0. Dal codex-
Nota: Dalla versione 4.0, queste proprietà sono private, vedi [28511].
Il filtro registration_errors
qui richiede una piccola modifica.
//Rimuove l'errore per il nome utente, mostra solo l'errore per l'email.
add_filter('registration_errors', 'remove_username_empty_error', 10, 3);
function remove_username_empty_error($wp_error, $sanitized_user_login, $user_email){
if(isset($wp_error->errors['empty_username'])){
$wp_error->remove('empty_username');
}
if(isset($wp_error->errors['username_exists'])){
$wp_error->remove('username_exists');
}
return $wp_error;
}
Nota: Come menzionato da @mcnesium, se eliminiamo completamente il campo del nome utente (nel mio caso ho usato il plugin Theme my login per sovrascrivere il modulo di registrazione standard e lì ho semplicemente rimosso il campo del nome utente), allora $_POST['user_login']
sarà null
e la condizione non corrisponderà affatto. È meglio rimuoverlo dalla condizione come suggerito da @mcnesium.

Iterando sulla risposta di @nishant-kumar, ecco una soluzione vanilla JS, senza script JS aggiuntivi, in un solo passaggio e senza bisogno di modifiche backend, per creare un modulo di registrazione con solo il campo email:
/** Aggancia il tuo codice alla pagina di login/registrazione **/
add_action('login_head', function(){
/* Stile per nascondere il gruppo di campi user_name */
?>
<style>
#registerform > p:first-child{
display:none;
}
</style>
<script type="text/javascript">
/* Esegui questa azione quando il DOM è pronto E dopo che tutto nella pagina è caricato */
let user_email;
window.addEventListener('load',function() {
user_email = document.querySelector('[name="user_email"]');
if(user_email) { // Esegui solo se c'è un campo user_email nella pagina
user_email.addEventListener('keyup',syncUserName);
user_email.addEventListener('change',syncUserName);
}
});
/* Sincronizza il valore di user_email con il campo user_login nascosto */
function syncUserName() {
document.querySelector('[name="user_login"]').value = user_email.value;
}
</script>
<?php
});
Basta aggiungere questo codice nel tuo file functions.php (o nel tuo plugin personalizzato, se ne hai uno)

Ho provato questo e ho ricevuto un errore user_email is not defined at HTMLInputElement.syncUserName
. Spostando la parte "function syncUserName" all'interno della funzione superiore elimina l'errore e lo snippet di codice funziona perfettamente. Commento solo in modo che altri possano incontrare lo stesso problema. Grazie Gfra54.

Penso che qualsiasi soluzione a questa richiesta sarà un 'hack' poiché WordPress richiede che ci sia un nome utente per tutti gli utenti registrati. Anche il plugin menzionato sopra molto probabilmente sta solo trovando il nome utente tramite l'indirizzo email e poi utilizzando quel nome utente per accedere al sito.
Se sei d'accordo con un hack, ecco un concetto che potrebbe funzionare:
1) Pre-compila il campo del nome utente nel tuo modulo di registrazione con un numero univoco, utilizzare il timestamp corrente è una buona idea per evitare di ottenere mai duplicati. Dovresti poi nascondere questo campo in modo che l'utente non lo veda sullo schermo quando compila il modulo.
Se stai utilizzando jQuery potresti usare qualcosa come:
$(document).ready(function() {
var timestamp = (new Date).getTime();
$('form input.username').val(timestamp);
$('form input.username').css('display', 'none');
});
In questo esempio, 'form input.username' sarebbe il selettore jQuery per trovare il campo del nome utente, dovrai controllare la struttura HTML nella tua pagina per assicurarti che il selettore corrisponda alla struttura.
2) Utilizza un plugin come quello menzionato prima (http://wordpress.org/extend/plugins/wp-email-login/) per permettere agli utenti di accedere con il loro indirizzo email.
