¿Cómo puedo agregar funciones de verificación de correo electrónico para WooCommerce?

8 minutos de lectura

avatar de usuario
Amit Kashyap

Me gustaría agregar un procedimiento de verificación de correo electrónico cuando el usuario se registra en WooCommerce. WordPress luego envía por correo electrónico un enlace de verificación al correo electrónico del usuario. Si se hace clic en el enlace, se activa la cuenta del usuario. ¿Como podría hacerlo?

  • Pero hay un problema en este complemento que no agrega usuarios en wordpress.

    – Amit Kashyap

    17 de julio de 2016 a las 7:04

  • Stack Overflow no está destinado a escribir código por usted. Tienes que dar detalles muy específicos sobre cuál es el problema. Código. Capturas de pantalla. Resultados esperados y reales. Una buena pregunta rara vez debe ser de 1 oración.

    – Charlie Fish

    17 de julio de 2016 a las 7:05

  • No, no puedo porque no has proporcionado suficientes detalles. Sin detalles, es MUY difícil responder a su pregunta porque no podemos encontrar la respuesta hasta que proporcione detalles.

    – Charlie Fish

    17 de julio de 2016 a las 7:09

  • Lo siento pero no me voy a registrar. Debe tomarse el tiempo para proporcionar más detalles. 🙂 una vez que lo haga, estaría más que feliz de ver su pregunta y ver si tengo una solución para usted.

    – Charlie Fish

    17 de julio de 2016 a las 7:14

  • no necesita descargar el complemento de Github, puede ser el problema con su descarga, solo vaya directamente a este enlace para descargar el complemento wordpress.org/plugins/woo-confirmation-email

    – RKBhardwaj

    17 de julio de 2016 a las 7:54

avatar de usuario
rafael winniger

Utilicé el código proporcionado por Amit Kayshap y lo perfeccioné para incluir controles y funciones adicionales, como el inicio de sesión automático de un usuario después de que se haya activado su cuenta, lo que resultó en una experiencia de usuario mucho más fluida.

Actualizar: A diferencia del código original, este tampoco requerirá que ningún usuario existente confirme su dirección de correo electrónico.

Al igual que el código en el que me basé, está diseñado para ejecutarse en una instalación de WordPress que ejecute WooCommerce. También funciona si ha desactivado la página de registro estándar de WordPress.

Necesitarás una página vacía con la URL yoursite.com/verify/ que se basa en una plantilla que contiene <?php wc_print_notices(); ?> dentro de su contenedor de contenido. Reemplazará el /sign-in/ destino del código original y manejará casi todos los mensajes creados por este código.

A continuación, agregue este código a functions.php de su tema:

function wc_registration_redirect( $redirect_to ) {     // prevents the user from logging in automatically after registering their account
    wp_logout();
    wp_redirect( '/verify/?n=');                        // redirects to a confirmation message
    exit;
}

function wp_authenticate_user( $userdata ) {            // when the user logs in, checks whether their email is verified
    $has_activation_status = get_user_meta($userdata->ID, 'is_activated', false);
    if ($has_activation_status) {                           // checks if this is an older account without activation status; skips the rest of the function if it is
        $isActivated = get_user_meta($userdata->ID, 'is_activated', true);
        if ( !$isActivated ) {
            my_user_register( $userdata->ID );              // resends the activation mail if the account is not activated
            $userdata = new WP_Error(
                'my_theme_confirmation_error',
                __( '<strong>Error:</strong> Your account has to be activated before you can login. Please click the link in the activation email that has been sent to you.<br /> If you do not receive the activation email within a few minutes, check your spam folder or <a href="https://stackoverflow.com/verify/?u=".$userdata->ID.'">click here to resend it</a>.' )
            );
        }
    }
    return $userdata;
}

function my_user_register($user_id) {               // when a user registers, sends them an email to verify their account
    $user_info = get_userdata($user_id);                                            // gets user data
    $code = md5(time());                                                            // creates md5 code to verify later
    $string = array('id'=>$user_id, 'code'=>$code);                                 // makes it into a code to send it to user via email
    update_user_meta($user_id, 'is_activated', 0);                                  // creates activation code and activation status in the database
    update_user_meta($user_id, 'activationcode', $code);
    $url = get_site_url(). '/verify/?p=' .base64_encode( serialize($string));       // creates the activation url
    $html = ( 'Please click <a href="'.$url.'">here</a> to verify your email address and complete the registration process.' ); // This is the html template for your email message body
    wc_mail($user_info->user_email, __( 'Activate your Account' ), $html);          // sends the email to the user
}

function my_init(){                                 // handles all this verification stuff
    if(isset($_GET['p'])){                                                  // If accessed via an authentification link
        $data = unserialize(base64_decode($_GET['p']));
        $code = get_user_meta($data['id'], 'activationcode', true);
        $isActivated = get_user_meta($data['id'], 'is_activated', true);    // checks if the account has already been activated. We're doing this to prevent someone from logging in with an outdated confirmation link
        if( $isActivated ) {                                                // generates an error message if the account was already active
            wc_add_notice( __( 'This account has already been activated. Please log in with your username and password.' ), 'error' );
        }
        else {
            if($code == $data['code']){                                     // checks whether the decoded code given is the same as the one in the data base
                update_user_meta($data['id'], 'is_activated', 1);           // updates the database upon successful activation
                $user_id = $data['id'];                                     // logs the user in
                $user = get_user_by( 'id', $user_id ); 
                if( $user ) {
                    wp_set_current_user( $user_id, $user->user_login );
                    wp_set_auth_cookie( $user_id );
                    do_action( 'wp_login', $user->user_login, $user );
                }
                wc_add_notice( __( '<strong>Success:</strong> Your account has been activated! You have been logged in and can now use the site to its full extent.' ), 'notice' );
            } else {
                wc_add_notice( __( '<strong>Error:</strong> Account activation failed. Please try again in a few minutes or <a href="https://stackoverflow.com/verify/?u=".$userdata->ID.'">resend the activation email</a>.<br />Please note that any activation links previously sent lose their validity as soon as a new activation email gets sent.<br />If the verification fails repeatedly, please contact our administrator.' ), 'error' );
            }
        }
    }
    if(isset($_GET['u'])){                                          // If resending confirmation mail
        my_user_register($_GET['u']);
        wc_add_notice( __( 'Your activation email has been resent. Please check your email and your spam folder.' ), 'notice' );
    }
    if(isset($_GET['n'])){                                          // If account has been freshly created
        wc_add_notice( __( 'Thank you for creating your account. You will need to confirm your email address in order to activate your account. An email containing the activation link has been sent to your email address. If the email does not arrive within a few minutes, check your spam folder.' ), 'notice' );
    }
}

// the hooks to make it all work
add_action( 'init', 'my_init' );
add_filter('woocommerce_registration_redirect', 'wc_registration_redirect');
add_filter('wp_authenticate_user', 'wp_authenticate_user',10,2);
add_action('user_register', 'my_user_register',10,2);

Si está ejecutando un sitio multilingüe, puede hacer que el código esté listo para la traducción muy fácilmente. Simplemente cambie las cadenas de texto de esta manera: __( 'Text you want to translate', 'your-theme' ) Esto permite que los complementos de traducción como WPML agreguen la cadena a una tabla de traducción en el your-theme dominio de texto.

Tenga en cuenta que cualquier cadena que contenga una variable como .$url. generará una nueva cadena cada vez que un usuario diferente active su función. Para eludir esto (y evitar el spam de cadenas en su base de datos), podemos traducirlas directamente en el código:

if(ICL_LANGUAGE_CODE=='de'){
    wc_add_notice( __( 'German error message' ), 'error' );
} else {
    wc_add_notice( __( 'English error message' ), 'error' );
}

En este ejemplo, se emitirá el mensaje en alemán si el código de idioma del usuario se detecta como de (También funciona si es una variación como de_DE_formal), de lo contrario, generará el mensaje en inglés.

Editar: Actualicé el código para no requerir que un usuario existente confirme retroactivamente su dirección de correo electrónico.

  • Esto funciona muy bien, pero me llevó un tiempo descubrir el asunto de “una página vacía que se basa en una plantilla”. Tiene mucho sentido después de encontrar lo siguiente: stackoverflow.com/a/2810723/1358863

    – Asususuario

    22 de enero de 2019 a las 9:05

  • Tengo 2 opciones de registro en mi tienda de WC: habitual y Facebook. ¿Afectará este código a los usuarios que se registren en Facebook?

    – Demuri Celidze

    20 de febrero de 2019 a las 14:52

  • @DemuriCelidze Este código se conecta al núcleo de WordPress con user_register, init y wp_authenticate_user y en WooCommerce con woocommerce_registration_redirectpor lo que, a menos que su registro de Facebook se conecte al proceso de WooCommerce en lugar de directamente al núcleo de WordPress, el código probablemente no funcionará con el registro de Facebook.

    –Rafael Winniger

    21 de febrero de 2019 a las 15:14

  • Hay un pequeño problema de seguridad en el código: cualquiera puede desactivar cualquier cuenta simplemente siguiendo un enlace como /?u=1. Por lo tanto, debo verificar si el usuario ya está activado, por ejemplo, en la línea 58. Envié una edición.

    – duradero

    26 sep 2020 a las 15:55


¿Ha sido útil esta solución?