Code xác nhận mail trước khi đăng ký tài khoản trên web woocommerce tránh spam

banner home FINAL 1050x121 1
huong dan su dung wordpress 2

Đến hẹn lại lên, như đã hứa, hôm nay mình chia sẽ code xác nhận mail trước khi đăng ký tài khoản trên website woocommerce để tránh spam tài khoản, mặc dù thời gian khá bận rộn nhưng cũng bỏ ra chút thời gian viết bài để mọi người có thể tham khảo, sau đây mình sẽ nêu tình trạng chung của các tài khoản woocommerce hiện tại và cách xác nhận mail người dùng trước khi đăng ký tài khoản trên website woocommerce tránh spam tài khoản

Tình trạng đăng ký tài khoản ở trên website dùng form mặc định của woocommerce

  • Khi đăng ký tài khoản cho dù khách nhập mail không đúng, mail chưa được lập thì vẫn vào được trang tài khoản luôn, không cần phải xác nhận mail
  • Cho dù bạn có cài đặt bắt buộc gửi link về mail đi chăng nữa thì khi người ta nhập thông tin đăng ký xong vẫn vào được trang tài khoản mà không cần xác nhận gì
Đăng ký bằng mail chưa được lập mà vẫn vào được trang tài khoản
Đăng ký bằng mail chưa được lập mà vẫn vào được trang tài khoản

Ảnh hưởng của việc không cần xác nhận tài khoản mail

  • Spam tài khoản hàng loạt
  • Mail chưa được lập nhập đại mail nào đó vẫn spam được

Phương án xử lý xác nhận mail

Có 2 phương án xử lý

  • Gửi mã otp về mail để nhập mã otp mới đăng nhập được vào trang tài khoản
  • Gửi đường link về mail để xác nhận tài khoản

=> Như vậy thì các mail đã được lập mới có thể đăng ký tài khoản

Code xử lý gửi đường link về mail để xác nhận tài khoản

  • Bưới 1: Đầu tiên các bạn cần cài gửi mail smtp nhé, nếu bạn chưa cài đặt gửi mail smtp thì có thể tham khảo bài viết ” code gửi mail smtp không cần cài plugin ” này của mình trước. Còn nếu bạn đã cài plugin smtp mail hoặc có code trước rồi thì bỏ qua bước này
  • Bước 2: Vào trang / thêm trang mới đặt tên là ” verify ” sau đó chuyển sang tab ” văn bản ” và nhập code dưới đây vào xong nhấn đăng

<?php wc_print_notices(); ?>

  • Xem hình minh họa bên dưới
Tạo trang để xác nhận mail
Tạo trang để xác nhận mail

Bưới 3: Thêm code dưới đây vào funtion.php của theme ( nhớ thêm vào file funtion.php của child theme nếu theme bạn có child theme ) hoặc thêm plugin mình viết ở dưới, đảm bảo nhẹ tênh

Cách 1: thêm code vào file funtion.php

// them xac nhan email vào funtion.php az9s.com
add_filter( "um_get_option_filter__checkmail_email_on", "um_get_option_filter__checkmail_email_on_custom", 10, 1 );
function um_get_option_filter__checkmail_email_on_custom( $value ) {
if( in_array( UM()->form()->form_id, array( '1234', '5678' ) )) return false;
return $value;
}
function wc_registration_redirect( $redirect_to ) { // prevents the user from logging in automatically after registering their account
wp_logout();
wp_redirect( '/verify/?n=1'); // 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> Tài khoản của bạn phải được kích hoạt trước khi bạn có thể đăng nhập. Vui lòng nhấp vào liên kết trong email kích hoạt đã được gửi cho bạn.<br /> Nếu bạn không nhận được email kích hoạt trong vòng vài phút, hãy kiểm tra thư mục thư rác hoặc <a href="/verify/?u='.$userdata->ID.'">bấm vào đây để gửi lại</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 = ( 'Vui lòng nhấn vào <a href="'.$url.'">đây</a> để xác minh địa chỉ email của bạn và hoàn tất quá trình đăng ký.' ); // This is the html template for your email message body
wc_mail($user_info->user_email, __( 'Xác nhận tài khoản' ), $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 ) { // tạo thông báo lỗi nếu tài khoản đã hoạt động
wc_add_notice( __( 'Tài khoản này đã được kích hoạt. Vui lòng đăng nhập bằng tên người dùng và mật khẩu của bạn.' ), '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> Tài khoản của bạn đã được kích hoạt thành công! Bạn đã đăng nhập và bây giờ có thể sử dụng tài khoản của bạn tại trang web của chúng tôi.' ), 'notice' );
} else {
wc_add_notice( __( '<strong>Error:</strong> Kích hoạt tài khoản không thành công. Vui lòng thử lại sau vài phút hoặc <a href="/verify/?u='.$userdata->ID.'">gửi lại email kích hoạt</a>.<br />Xin lưu ý rằng mọi liên kết kích hoạt đã gửi trước đó sẽ mất hiệu lực ngay khi email kích hoạt mới được gửi.<br />Nếu việc xác minh không thành công nhiều lần, vui lòng liên hệ với quản trị viên của chúng tôi.' ), 'error' );
}
}
}
if(isset($_GET['u'])){ // If resending confirmation mail
my_user_register($_GET['u']);
wc_add_notice( __( 'Email kích hoạt của bạn đã được gửi lại. Vui lòng kiểm tra email và thư mục thư rác của bạn.' ), 'notice' );
}
if(isset($_GET['n'])){ // If account has been freshly created
wc_add_notice( __( 'Cảm ơn bạn đã tạo tài khoản . Bạn sẽ cần phải xác nhận địa chỉ mail của mình để kích hoạt tài khoản. Một mail chứa liên kết kích hoạt đã được gửi đến địa chỉ mail của bạn. Nếu email không đến trong vòng vài phút, hãy kiểm tra thư mục thư rác của bạn.' ), '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);
// them xac nhan email vào funtion.php az9s.com end

Chúc các bạn thành công
5/5 (2 Reviews)

Theo dõi và cập nhật tin tức AZ9s thông qua các kênh truyền thông:

- Zalo Channel

- Facebook Channel

- Youtube Channel

banner home FINAL 1050x121 1
5 1 vote
Article Rating
Nhận thông báo qua Email
Nhận thông báo cho
guest

0 Comments
Inline Feedbacks
View all comments
0
Hãy để lại bình luận của bạn!x
()
x