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?
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
ywp_authenticate_user
y en WooCommerce conwoocommerce_registration_redirect
por 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
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