Verifica email per nuovi utenti
Vorrei implementare un plugin che richieda ai nuovi utenti di rispondere a un'email per verificare il loro indirizzo email durante la registrazione. Sto già facendo ricerche approfondite sul codex, ma sono molto nuovo e apprezzerei alcuni suggerimenti, specialmente riguardo al mantenere l'utente inattivo fino alla verifica dell'email. Il resto penso che riuscirò a gestirlo da solo.

Ho avuto un problema molto simile che ho risolto l'altro giorno. Nel mio caso volevo permettere agli utenti di scegliere la propria password e poi attivare il proprio account via email. C'è molto da dire su questo, quindi mi limiterò a delineare come ho ottenuto la verifica via e-mail.
Innanzitutto, ho usato user_register
(si attiva quando un utente viene registrato) e ho creato una chiave (ad esempio, ho fatto l'hash del tempo, dell'indirizzo email dell'utente e di una stringa casuale, ecc.) e ho memorizzato questa chiave nella tabella usermeta. Questa verrà eliminata quando l'utente attiva il proprio account.
Per impedire a un utente non attivato di accedere, ho aggiunto controlli aggiuntivi al login, usando l'hook authenticate
. Per esempio:
Modifica
Come indicato nei commenti, il filtro authenticate
dovrebbe restituire un oggetto WP_Error
in caso di fallimento, altrimenti restituisce null. wp_authenticate_username_password
viene eseguito dopo questa funzione, e se viene passato un oggetto WP_User
non esegue alcun controllo di autenticazione e assume che siano già stati fatti.
Il codice modificato restituisce ciò che gli è stato passato, oppure un oggetto WP_Error
se la chiave di attivazione esiste (cioè l'utente deve ancora attivare il proprio account).
add_filter( 'authenticate', 'wpse32218_check_for_key', 10, 3 );
function wpse32218_check_for_key( $user, $username, $password ){
$user_obj = get_user_by('login', $username );
if ($username!=''){
$value = get_user_meta($user->ID, 'confirmed', true);
if($value!=null){
$user = new WP_Error( 'denied', __("<strong>ERRORE</strong>: Devi attivare il tuo account.".$value."") );//crea un errore
remove_action('authenticate', 'wp_authenticate_username_password', 20); //chiave trovata - non procedere!
}
}
return $user;
}
(puoi usare shake_error_codes
per far tremare la casella di login se la chiave viene trovata, se ti piace :D).
Poi, nel tuo plugin, dovrai sovrascrivere wp_new_user_notification
(che è una funzione pluggable presente in /wp_includes/pluggable.php
). Questa funzione invia l'email al nuovo utente e all'amministratore.
Copia la funzione nel tuo plugin, all'interno di
if ( !function_exists('wp_new_user_notification') ) :
//Definisci qui la tua funzione wp_new_user_notification
endif;
e poi adattala in modo che recuperi e includa la chiave di attivazione nel messaggio all'utente.
Per il progetto su cui stavo lavorando, ho creato un link dalla chiave di attivazione che l'utente poteva cliccare per attivare il proprio account. Ad esempio, se la loro chiave era 01234ABCDE: http://www.example.com?confirm=01234ABCDE.
Usando il filtro query_vars ho registrato la variabile 'confirm' con WordPress. Poi con il filtro template_include
, ogni volta che quella variabile è impostata (come sopra) reindirizzo l'utente a confirm.php
(un file template presente nella directory del mio tema).
Questo template cerca di recuperare l'utente con la chiave corrispondente. Se lo trova, elimina la chiave. Ora sono attivati e possono accedere. Se non lo trova, mostra un messaggio di errore (chiave inesistente o account già attivato). Se ci sono più utenti con la stessa chiave di attivazione (non dovrebbero esserci!) mostra anche un errore.

Wow, grazie! Sono sicuro che riuscirò a implementarlo stasera stessa con tutto il tuo aiuto.

Giusto un avvertimento. Un avvertimento molto serio! Ho usato questo codice in un piccolo plugin che ho sviluppato per visualizzare due campi password (il secondo per la conferma che corrispondessero), nel modulo di registrazione in modo che gli utenti potessero scegliere la propria. Dopo aver attivato il plugin e testato, ho scoperto che gli utenti potevano inserire qualsiasi combinazione di testo come password. Non quella che avevano scelto originariamente. Molto pericoloso. Dopo aver indagato un po', era esattamente questo blocco di codice a causare il problema. Ora sto facendo a meno di questo codice.

L'avvertimento di Phil è corretto, questo codice è gravemente difettoso. Ma è facile da correggere. Basta rimuovere il return $user e avrai risolto la falla di sicurezza.

@Phil @Scott Grazie per averlo segnalato. Ho corretto il codice. Se a wp_authenticate_username_password
viene passato un oggetto utente, salta l'autenticazione. La nuova funzione restituisce qualsiasi cosa le venga passata, e solo un oggetto di errore se l'account non è attivato. Ciò consente ai plug-in di implementare la propria funzione di autenticazione che viene eseguita prima di questa.

@StephenHarris hai considerato di condividerlo come plugin? Per quanto ne so, non c'è niente di simile disponibile al momento. Personalmente, non posso interrompere il mio altro codice per iniziare a lavorare in PHP. Un plugin come questo sarebbe di grande aiuto. Grazie!
