Contact Form 7 là một trong những plugin hỗ trợ tốt khi bạn sử dụng WordPress để tạo form liên hệ, đăng ký… Bài viết này giải quyết vấn đề bị spam và cách chống spam khá hiểu quả đó là:

1. Validate chống spam số điện thoại trong Contact Form 7

1.1Code khách hàng nhập đủ 10 số mới được

Ở trường tel code là: [tel* your-phone minlength:10 maxlength:10]

Trong đó:

  • minlength:10 Độ dài tối thiểu được phép cho trường đầu vào này.
  • maxlength:10 Độ dài tối đa được phép cho trường đầu vào này

2.2 Code KH nhập đầu số phải bằng 0 và đúng đầu số của các nhà mạng

Chúng ta đặt rule phải gõ đúng SĐT ở form số điện thoại phải đạt các điều kiện:

  • 10 số
  • Số đầu tiên phải là 0
  • Số thứ 2 phải là 3, 5, 7, 8, 9

Để validate số điện thoại trong Contact Form 7 thì chúng ta cần bổ sung code sau vào file functions.php của theme hoặc child theme của website.

Cập nhật mới nhất Validate tất cả đầu số của các nhà mạng hiện tại
				
					function custom_filter_wpcf7_is_tel( $result, $tel ) { 
  $result = preg_match( '/^(032|033|034|035|036|037|038|039|086|096|097|098|081|082|083|084|085|088|091|094|056|058|092|070|076|077|078|079|089|090|093|099|059)+([0-9]{7})$/;', $tel ); 
  return $result; 
} 
add_filter( 'wpcf7_is_tel', 'custom_filter_wpcf7_is_tel', 10, 2 ); 
				
			

2. Chống spam bằng cách kiểm tra người dùng scroll chuột hay chưa

Cơ chế hoạt động: Thường thì form được đặt ở giữa hoặc cuối trang web, buộc người dùng phải cuộn xuống mới có thể điền thông tin và gửi đi, đúng không? Vì thế, mình sẽ tính toán số lần người dùng cuộn trang và khi đạt đến một mức độ hợp lý, hệ thống sẽ cho phép người dùng gửi form.

Ưu điểm:

  • Không gây phiền toái cho người dùng, tương tự như cách 1.
  • Đơn giản và không ảnh hưởng đến giao diện của form.

Nhược điểm:

  • Chưa có.

Cách thực hiện: Chỉ cần thêm đoạn code sau vào tệp wp-content/themes/{your-theme}/functions.php.

				
					/*
 * Check spam cf7 bằng scroll
 * Author: levantoan.com
 * */
add_filter('wpcf7_form_elements', 'devvn_check_scroll_form_cf7');
function devvn_check_scroll_form_cf7($html){
    $html = '<div style="display: none"><p><span class="wpcf7-form-control-wrap" data-name="devvn-scroll"><input size="40" class="wpcf7-form-control wpcf7-text" aria-invalid="false" value="0" type="text" name="devvn-scroll"></span></p></div>' . $html;
    return $html;
}
add_action('wpcf7_posted_data', 'devvn_check_scroll_form_cf7_vaild');
function devvn_check_scroll_form_cf7_vaild($posted_data) {
    $submission = WPCF7_Submission::get_instance();
    $scroll = isset($posted_data['devvn-scroll']) ? intval($posted_data['devvn-scroll']) : 0;
    //nếu form ở ngay trên đầu page thì thay 5000 thành số nhỏ hơn. ví dụ 200
    if (!$scroll || $scroll <= 5000) {
        $submission->set_status( 'spam' );
        $submission->set_response( 'You are spamer' );
    }
    unset($posted_data['devvn-scroll']);
    return $posted_data;
}
add_action('wp_footer', function (){
    ?>
    <script>
        const scrollInputs = document.querySelectorAll('input[name="devvn-scroll"]');
        if(scrollInputs.length > 0) {
            let accumulatedScroll = 0;
            function devvnCheckScroll() {
                accumulatedScroll += window.scrollY;
                scrollInputs.forEach(input => {
                    input.value = accumulatedScroll;
                });
                //nếu form ở ngay trên đầu page thì thay 6000 thành số nhỏ hơn. ví dụ 300
                if (accumulatedScroll >= 6000) {
                    window.removeEventListener('scroll', devvnCheckScroll);
                }
            }
            window.addEventListener('scroll', devvnCheckScroll);
        }
    </script>
    <?php
});
				
			

Nguồn bài viết tham khảo: