¿Puedo engancharme al registro de usuario *antes* de que se cree un usuario?
Quiero limitar el registro basado en el dominio asociado a su dirección de correo electrónico. Estaba mirando el gancho de acción user_register
, pero se dispara después de que el usuario ya está insertado, lo cual, aunque podría ser hackeado para que funcione, no es lo ideal. Prefiero prevenir en lugar de eliminar retroactivamente usuarios inválidos.
He revisado el código fuente en wp-includes/user.php
, pero nada ahí parece ser útil. Noté el filtro pre_user_email
, pero no parece ofrecer opciones para hacer algo útil ya que no veo manera de trabajar con eso.

Estás buscando en el lugar equivocado.
Cuando un usuario intenta registrarse por primera vez, su nombre de usuario y correo electrónico son procesados y saneados dentro de la función register_new_user()
en wp-login.php
. Aquí es donde deseas aplicar tu filtrado.
Antes de que se cree el usuario, WordPress pasará el nombre de usuario saneado, la dirección de correo electrónico y un array de errores a través de la acción 'register_post'. Si hay algún error después de esto, el usuario no será añadido y verá los errores en la interfaz.
Así que la siguiente función no probada podría ayudar:
function prevent_email_domain( $user_login, $user_email, $errors ) {
if ( strpos( $user_email, '@baddomain.com' ) != -1 ) {
$errors->add( 'bad_email_domain', '<strong>ERROR</strong>: Este dominio de correo electrónico no está permitido.' );
}
}
add_action( 'register_post', 'prevent_email_domain', 10, 3 );

¿Cuál es la diferencia entre el filtro "registration_errors" y la acción "register_post"?

Esto depende si estás construyendo tu propio formulario de registro personalizado donde implementas el registro de usuario real o si estás utilizando el formulario de registro proporcionado por WordPress.
Si estás usando el primer caso, no hay acciones predefinidas ya que tendrás acceso a los datos POST
y serás responsable de llamar a wp_insert_user()
o wp_create_user()
y asegurarte de que toda la información requerida sea correcta, como nombre de usuario, correo electrónico, etc.
Para el segundo caso, debes engancharte a la acción register_post
. Esto se encuentra en wp-login.php
dentro de la función register_new_user()
.
/**
* Fragmento de código...
*/
} elseif ( email_exists( $user_email ) ) {
$errors->add( 'email_exists', __( '<strong>ERROR</strong>: Este correo electrónico ya está registrado, por favor elige otro.' ) );
}
do_action( 'register_post', $sanitized_user_login, $user_email, $errors );
$errors = apply_filters( 'registration_errors', $errors, $sanitized_user_login, $user_email );
/** resto del código después... **/
