Verificación por correo electrónico para nuevos usuarios

27 oct 2011, 07:55:13
Vistas: 15.4K
Votos: 5

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.

1
Comentarios

¿WordPress no hace esto por defecto?

Flimm Flimm
29 may 2019 20:04:32
Todas las respuestas a la pregunta 1
6
13

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.

27 oct 2011 16:18:54
Comentarios

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

ProfK ProfK
27 oct 2011 19:31:13

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.

User User
14 feb 2012 21:33:23

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.

User User
10 ago 2012 09:54:05

@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.

Stephen Harris Stephen Harris
10 ago 2012 12:54:34

@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!

Dan Rosenstark Dan Rosenstark
29 ene 2013 00:56:03

O tal vez olvídalo. Acabo de verificar y mi sitio de WP solo permite contraseñas enviadas realmente a los usuarios por correo electrónico, así que por ahora está todo bien.

Dan Rosenstark Dan Rosenstark
29 ene 2013 01:00:56
Mostrar los 1 comentarios restantes