Después del registro, ¿cómo crear la verificación del correo electrónico del usuario?

En esta ocasión vamos a ver cómo validar el email de un usuario antes de darle acceso a una intranet, o membresía basada en WordPress.
El registro se podría realizar fácilmente a través de un formulario realizado con ACF (Advanced Custom Fields)
Se puede realizar un proceso más complejo, pero vamos a ver cómo hacerlo de una forma sencilla.
Crear código de activación y envío por email.
Para este paso vamos a utilizar el Hook de WordPress «user_register» que se ejecuta una vez el usuario hace la acción de registrarse.
add_action( 'user_register', 'bk_send_activation', 10, 2 );
function bk_send_activation( $user_id ) {
// traemos los datos del usuario
$user_info = get_userdata($user_id);
// Creamos el código de verificación
$code = md5(time());
// Creamos el código que enviaremos por email
$code_url = array('id'=>$user_id, 'code'=>$code);
// creamos y guardamos en el usurio el código y el estado de la activación
update_user_meta($user_id, 'account_activated', 0);
update_user_meta($user_id, 'activation_code', $code);
// Creamos al url que enviaremos
$url = get_site_url(). '/validation/?code=' .base64_encode( serialize($code_url));
// El contenido que enviaremos por email
$email_content = 'Para activar tu cuenta pulsa <a href="'. esc_url($url) .'">aquí</a>';
// Indicamos que será en HTML
$headers = array('Content-Type: text/html; charset=UTF-8');
// Enviamos el emaill con el contneido al usuario.
wp_mail( $user_info->user_email, esc_html__('Email Subject','text-domain') , $email_content, $headers);
}
En el código que enviamos al usuario «$code_url» añadimos el ID para que cuando lo decodifiquemos podamos identificarlo. El campo «account_activated» del usuario lo dejamos a «0», debido a que ese valor hemos decidido que sea para los usuarios que no han activado los registros, y así identificarlos fácilmente para más adelante ver qué hacemos con ellos pasado un tiempo.
Plantilla de email
Como hemos visto en el punto anterior, el contenido del email lo enviamos en la variable «email_content». Si es un simple texto no pasa nada por dejarlo en ese lugar, pero si vas a querer darle un diseño más complejo, o simplemente para tenerlo localizado, lo mejor es tener una carpeta llamada «emails-template» e ir creándolos allí.
Por ejemplo, esto sería el html del mismo email
<?php
/**
* Email de activación (activation.php)
*
* Se envía al usuario cuando se registra
*/
defined( 'ABSPATH') || die( 'No script Kiddies, please!' );
?>
<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title><?php echo get_bloginfo( 'name', 'display' ); ?></title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
</head>
<body>
<p>Para activar tu cuenta pulsa <a href="<?php echo esc_url($url); ?>'">aquí</a>.</p>
</body>
</html>
Y sustituiríamos la variable «email_content» por el siguiente código.
ob_start();
include(get_stylesheet_directory() . '/emails-template/activation.php');
$email_content = ob_get_contents();
ob_end_clean();
También lo podríamos hacer con la función de WordPress «get_template_part» a la que por fin ya se le pueden pasar parámetros.
Verificar código de activación
El siguiente paso es verificar el código que enviamos al usuario por email cuando este llegue a la página que definimos.
Tenemos dos formas:
1. Validar la cuenta en cada página.
Esta forma es la menos óptima y, personalmente, la que menos me gusta debido a que cada vez que entres a una página de la web verificará el código, lo traiga o no.
En esta ocasión utilizaremos el Hook «init» de WordPress de la siguiente manera.
add_action( 'init', 'bk_verify_activation_code' );
function bk_verify_activation_code(){
$data = unserialize(base64_decode($_GET['code']));
if (is_array($data)) {
$user_id = $data['id'];
$url_code = $data['code'];
$user_code = get_user_meta( $user_id, 'account_activated', true);
// Verificamos que el código que viene es el mismo que el que tenemos en la base de datos del usuario
if( $user_code == $url_code ) {
// Actualizamos el valor de la variable del usuario para indicar que ha activado.
update_user_meta($data['id'], '_bk_user_account_validated', 1);
esc_html_e( '<strong>Enhorabuena:</strong><br> ¡Tu cuenta ha sido activada!', 'text-domain' );
}
}
}
2. Validación en la página definida.
En este caso, como en el mensaje que hemos enviado al usuario, hemos indicado la página de aterrizaje del usuario, podemos crear un template específico y añadirle la función, o utilizar la función «is_page_template» para ejecutarla solo si te encuentras en ese template.
Prácticamente sería igual que el anterior, siendo:
$data = unserialize(base64_decode($_GET['code']));
if (is_array($data)) {
$user_id = $data['id'];
$url_code = $data['code'];
$user_code = get_user_meta( $user_id, 'account_activated', true);
// Verificamos que el código que viene es el mismo que el que tenemos en la base de datos del usuario
if( $user_code == $url_code ) {
// Actualizamos el valor de la variable del usuario para indicar que ha activado.
update_user_meta($data['id'], '_bk_user_account_validated', 1);
esc_html_e( '<strong>Enhorabuena:</strong><br> ¡Tu cuenta ha sido activada!', 'text-domain' );
}
}
En este ejemplo mostramos un mensaje dando la enhorabuena al usuario. También podríamos enviar a atención al cliente un email con los datos del usuario, link de «válido» o «no válido» para darle definitivamente acceso, y tener un mayor control sobre este.
Conclusión
Hemos visto que con muy poco código se puede desarrollar un sencillo proceso de validación de email, y activación de una cuenta después de que un usuario se registre.
Así evitaremos que puedan acceder usuarios con cuentas falsas, o que no son suyas, y poder tener una base de datos de usuarios más limpia para futuras comunicaciones.