Posso agganciarmi alla registrazione utente *prima* che un utente venga creato?
Voglio limitare la registrazione in base al dominio associato all'indirizzo email. Ho esaminato l'hook user_register
, ma viene attivato dopo che l'utente è già stato inserito nel database, il che, sebbene si possa forzare a funzionare, non è l'ideale. Preferirei prevenire piuttosto che rimuovere retroattivamente gli utenti non validi.
Ho esaminato il codice sorgente in wp-includes/user.php
, ma non ho trovato nulla di utile. Ho notato il filtro pre_user_email
, ma non sembra offrire opzioni per fare qualcosa di utile poiché non vedo un modo per utilizzarlo efficacemente.

Stai cercando nel posto sbagliato.
Quando un utente tenta di registrarsi per la prima volta, il suo username e email vengono elaborati e sanificati all'interno della funzione register_new_user()
nel file wp-login.php
. Questo è il punto dove vuoi applicare il tuo filtraggio.
Prima che l'utente venga creato, WordPress passerà il login utente sanificato, l'indirizzo email e un array di errori attraverso l'azione 'register_post'. Se ci sono errori dopo questo passaggio, allora l'utente non viene aggiunto e vedrà gli errori nell'interfaccia utente.
Quindi la seguente funzione non testata potrebbe aiutare:
function prevent_email_domain( $user_login, $user_email, $errors ) {
if ( strpos( $user_email, '@baddomain.com' ) != -1 ) {
$errors->add( 'bad_email_domain', '<strong>ERRORE</strong>: Questo dominio email non è consentito.' );
}
}
add_action( 'register_post', 'prevent_email_domain', 10, 3 );

Qual è la differenza tra il filtro "registration_errors" e l'azione "register_post"?

Questo dipende se stai costruendo un tuo modulo di registrazione personalizzato dove implementi effettivamente la registrazione dell'utente o se stai utilizzando il modulo di registrazione fornito da WordPress.
Se stai utilizzando il primo caso, non ci sono hook poiché avrai accesso ai dati POST
e sarai tu a dover chiamare wp_insert_user()
o wp_create_user()
assicurandoti che tutte le informazioni richieste siano corrette, come username, email, ecc.
Per il secondo caso, agganciati all'azione register_post
. Questa si trova in wp-login.php
all'interno della funzione register_new_user()
.
/**
* Frammento di codice...
*/
} elseif ( email_exists( $user_email ) ) {
$errors->add( 'email_exists', __( '<strong>ERRORE</strong>: Questa email è già registrata, per favore scegline un\'altra.' ) );
}
do_action( 'register_post', $sanitized_user_login, $user_email, $errors );
$errors = apply_filters( 'registration_errors', $errors, $sanitized_user_login, $user_email );
/** resto del codice dopo... **/
