Code chống SPAM cho Contact Form 7

Cập nhật lần cuối 28/02/2026 bởi Hà Văn Thuật trong Thủ thuật Code vào 17/12/2024

Chống spam cho Contact Form 7 là nhu cầu thiết yếu để bảo vệ form liên hệ của bạn khỏi các bot và thư rác. Bài viết này sẽ hướng dẫn chi tiết các phương pháp phổ biến và hiệu quả nhất.

Cách 1: Chống spam bằng field ẩn

Cơ chế hoạt động:

  • Thêm một trường ẩn vào form có tên là devvn. Bot thường sẽ tự động điền vào tất cả các trường có trong form.
  • Nếu trường ẩn này có giá trị, tức là form đã bị spam.

Cách thực hiện: Thêm đoạn code sau vào file Functions.php:

// Chống spam cho contact form 7
/*Thêm 1 field ẩn vào form cf7*/
add_filter('wpcf7_form_elements', 'devvn_check_spam_form_cf7');
function devvn_check_spam_form_cf7($html){
$html = '<div style="display: none"><p><span class="wpcf7-form-control-wrap" data-name="devvn"><input size="40" class="wpcf7-form-control wpcf7-text" aria-invalid="false" value="" type="text" name="devvn"></span></p></div>' . $html;
return $html;
}
/*Kiểm tra form đó mà được nhập giá trị thì là spam*/
add_action('wpcf7_posted_data', 'devvn_check_spam_form_cf7_vaild');
function devvn_check_spam_form_cf7_vaild($posted_data) {
$submission = WPCF7_Submission::get_instance();
if (!empty($posted_data['devvn'])) {
$submission->set_status( 'spam' );
$submission->set_response( 'You are Spamer' );
}
unset($posted_data['devvn']);
return $posted_data;
}

Cách 2: Format số điện thoại theo định dạng Việt Nam

Cơ chế hoạt động: Chỉ cho phép số điện thoại có:

  • Bắt đầu bằng số 0.
  • Độ dài từ 10 đến 11 ký tự.

Cách thực hiện: Thêm đoạn code sau vào file Functions.php:

Ví dụ form của bạn ô số điện thoại như sau:

// Chống spam cho contact form 7 bằng định dạng số điện thoại
add_filter('wpcf7_validate_tel', 'devvn_custom_validate_sdt', 10, 2);
add_filter('wpcf7_validate_tel*', 'devvn_custom_validate_sdt', 10, 2);
function devvn_custom_validate_sdt($result, $tag) {
$name = $tag->name;
if ($name === 'your-tel') {
$sdt = isset($_POST[$name]) ? wp_unslash($_POST[$name]) : '';
if (!preg_match('/^0([0-9]{9,10})+$/D', $sdt)) {
$result->invalidate($tag, 'Số điện thoại không hợp lệ.');
}
}
return $result;
}

Trong đoạn code trên bạn chú ý 3 chỗ cần chú ý là :

  • wpcf7_validate_tel: chữ tel ở đây là loại field bạn dùng. Ở ví dụ dùng tel nhé. còn bạn dùng text thì nhập là text
  • wpcf7_validate_tel*: chữ tel* ở đây là loại field bạn dùng và có bắt buộc.
  • your-tel là tên field nhé. Đổi thành tên field của bạn cho đúng

Cách 3: Thêm dạng câu hỏi – trả lời vào form

Cơ chế hoạt động: Thêm một câu hỏi đơn giản vào form yêu cầu người dùng trả lời đúng mới cho phép gửi đi.

Cách thực hiện: Chỉnh sửa form và thêm field Câu hỏi của Contact Form 7 như sau:

Ưu điểm: Chắc chắn chống spam triệt để luôn

Hạn chế: Gây khó cho người dùng khó tính và Form phải thêm 1 field

Cách 4: Chống spam bằng cách kiểm tra người dùng đã cuộn chuột (scroll) hay chưa

Cơ chế hoạt động:

  • Kiểm tra xem người dùng đã cuộn trang đến vị trí form hay chưa.
  • Nếu chưa cuộn đủ, không cho phép submit form.

Cách thực hiện: Thêm đoạn code sau vào file Functions.php:

// Check spam cf7 bằng scroll
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
});

Trong code có 2 số là 5000 và 6000 như mình cũng đã note trực tiếp ở code. Con số này tuỳ thuộc vào form ở vị trí nào trên web nhưng theo mình để số đó là okie rồi nhé. Bạn có thể đổi theo ý nha

Ưu điểm:

  • Không gây khó chịu cho người dùng. Giống cách 1
  • Đơn giản ko ảnh hưởng tới giao diện form

Nhược điểm:

  • Hiện tại chưa nghĩ ra nhược điểm nào

4 phương pháp trên giúp bạn chống spam cho Contact Form 7 hiệu quả. Tùy vào nhu cầu và loại form, bạn có thể áp dụng một hoặc kết hợp nhiều cách để đạt hiệu quả cao nhất.

  • Field ẩn: Phù hợp cho các form đơn giản.
  • Format số điện thoại: Hiệu quả cho form có trường số điện thoại.
  • Quiz: Hữu ích cho các form cần xác thực thông tin.
  • Kiểm tra scroll: Đơn giản và hiệu quả cho mọi form.

Chúc bạn thành công trong việc bảo vệ website khỏi spam!

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *