Verificación por correo electrónico para nuevos usuarios
Me gustaría implementar un plugin que requiera que los nuevos usuarios respondan a un correo electrónico para verificar su dirección de email durante el registro. Ya estoy investigando extensamente en el codex, pero soy muy nuevo y agradecería algunas pistas, especialmente sobre cómo mantener al usuario inactivo hasta que haya verificado su correo. El resto creo que podré manejarlo por mi cuenta.
Tuve un problema muy similar que resolví el otro día. En mi caso, quería permitir a los usuarios elegir su propia contraseña y luego activar su cuenta por correo electrónico. Hay mucho en esto, así que solo describiré cómo logré la verificación por correo electrónico.
Primero, usé user_register
(se ejecuta cuando se registra un usuario) y creé una clave (por ejemplo, cifré la hora, la dirección de correo electrónico del usuario y una cadena aleatoria, etc.) y almacené esta clave en la tabla usermeta. Esta clave se eliminará cuando el usuario active su cuenta.
Para evitar que un usuario no activado inicie sesión, agregué verificaciones adicionales al inicio de sesión, usando el hook authenticate
. Por ejemplo:
Editar
Según los comentarios, el filtro authenticate
debe devolver un objeto WP_Error
en caso de fallo; de lo contrario, devolver null. wp_authenticate_username_password
se ejecuta después de esta función, y si se le pasa un objeto WP_User
, no realiza ninguna verificación de autenticación y asume que ya se han realizado.
El código editado devuelve lo que se le pasó o un objeto WP_Error
si existe la clave de activación (es decir, el usuario aún no ha activado su cuenta).
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>ERROR</strong>: Necesitas activar tu cuenta.".$value."") );//crea un error
remove_action('authenticate', 'wp_authenticate_username_password', 20); //¡clave encontrada - no proceder!
}
}
return $user;
}
(puedes usar shake_error_codes
para hacer que el cuadro de inicio de sesión se sacuda si se encuentra la clave, si lo deseas :D).
Luego, en tu plugin, necesitarás sobrescribir wp_new_user_notification
(que es una función "pluggable" presente en /wp_includes/pluggable.php
). Esta función envía el correo electrónico al nuevo usuario y al administrador.
Copia la función en tu plugin, dentro de
if ( !function_exists('wp_new_user_notification') ) :
//Define aquí tu función wp_new_user_notification
endif;
y luego adáptala para que recupere e incluya la clave de activación en el mensaje al usuario.
Para el proyecto en el que estaba trabajando, creé un enlace con la clave de activación que el usuario podía hacer clic para activar su cuenta. Por ejemplo, si su clave era 01234ABCDE: http://www.example.com?confirm=01234ABCDE.
Usando el filtro query_vars, registré la variable 'confirm' con WordPress. Luego, con el filtro template_include
, siempre que esa variable esté establecida (por ejemplo, como arriba), redirijo al usuario a confirm.php
(un archivo de plantilla en el directorio de mi tema).
Esta plantilla intenta recuperar al usuario con la clave correspondiente. Si lo encuentra, elimina la clave. Ahora están activados y pueden iniciar sesión. Si no lo encuentra, muestra un mensaje de error (la clave no existe o la cuenta ya ha sido activada). Si hay varios usuarios con la misma clave de activación (¡no debería haberlos!), también muestra un error.

¡Guau, gracias! Estoy seguro de que podré implementar esto esta misma noche con toda tu ayuda.

Solo un aviso. ¡Un aviso muy serio! Usé este código en un pequeño plugin que desarrollé para mostrar dos campos de contraseña (el segundo para confirmar que coincidían) en el formulario de registro, para que los usuarios pudieran elegir la suya propia. Después de activar el plugin y probarlo, descubrí que los usuarios podían introducir cualquier combinación de texto como contraseña. No la que habían elegido originalmente. Muy peligroso. Después de investigar un poco, era exactamente este bloque de código el que lo causaba. Ahora lo estoy haciendo sin este código.

El aviso de Phil es correcto, este código tiene un fallo grave. Pero es fácil de solucionar. Solo elimina el return $user y parchearás el agujero de seguridad.

@Phil @Scott Gracias por señalarlo. He corregido el código. Si a wp_authenticate_username_password
se le pasa un objeto de usuario, omite la autenticación. La nueva función devuelve lo que se le da, y solo un objeto de error si la cuenta no está activada. Esto permite que los plugins implementen su propia función de autenticación que se ejecute antes que esta.

@StephenHarris ¿has considerado compartir esto como un plugin? Hasta donde sé, no hay nada similar disponible en este momento. Personalmente, no puedo dejar mi otro código para empezar a trabajar en PHP. Un plugin como este sería de gran ayuda. ¡Gracias!
