Cách chống spam dành cho Plugin Contact Form 7

Cách thứ 1: Mình muốn chia sẻ phương pháp mình đã sử dụng để tránh spam như sau:

  1. Đầu tiên, tạo một trường nhập liệu với tên “yourname” mà không yêu cầu phải điền thông tin. Đặt trường này ở đầu của biểu mẫu.
  2. Bọc trường nhập liệu vào một thẻ div và áp dụng CSS cho div này với thuộc tính “opacity: 0”.
  3. Tiếp theo, tạo các trường khác để thu thập thông tin như họ tên đầy đủ, tương tự trong một biểu mẫu thông thường.
  4. Thiết lập một điều kiện để kiểm tra khi người dùng nhấn nút gửi thông tin. Nếu trường “yourname” đã được điền, điều đó cho thấy có khả năng cao là một bot, nên ta có thể từ chối nhanh chóng. Ngược lại, nếu trường “yourname” còn trống, tiếp tục xử lý việc gửi thông tin như bình thường.
<script>
  document.addEventListener('DOMContentLoaded', function() {
    var guiform = document.querySelector('.wpcf7-form');
    guiform.addEventListener('submit', function(event) {
      var check_yourname = guiform.querySelector('input[name="yourname"]');

      if (check_yourname && check_yourname.value !== '') {
        event.preventDefault();
      }
    });
  });
</script>

Chúc các bạn thành công.
Nguồn: Nguyễn Lân tại Group WPVN Tám

Quá hay luôn

Cách thứ 2 tối ưu hơn lọc spam từ các field mặc định của plugin Cf7 bằng shortcode.

Chèn đoạn mã sau vào functions.php

add_filter( 'wpcf7_spam', function( $spam ) {
	if ( $spam ) {
		return $spam;
	}
	if ( strlen( $_POST['your-name'] ) > 0 || strlen( $_POST['your-email'] ) > 0 || strlen( $_POST['your-tel'] ) > 0 || strlen( $_POST['your-message'] ) > 0 ) {
		$spam = true;
  	}
  return $spam;
}, 10, 1 );

wpcf7_add_shortcode('wpcf7_wpvn', function( $tag ) { 
	return '<input type="hidden" name="your-name" value="" class="hidden wpcf7-hidden" /><input type="hidden" name="your-email" value="" class="hidden wpcf7-hidden" /><input type="hidden" name="your-tel" value="" class="hidden wpcf7-hidden" /><input type="hidden" name="your-message" value="" class="hidden wpcf7-hidden" />'; }
);

Chèn shortcode [wpcf7_wpvn] vào nội dung form

Mục đích nếu bot dùng các trường mặc định sẽ bị từ chối phản hồi

LƯU Ý: KHÔNG SỬ DỤNG CÁC FIELD: your-name, your-tel, your-email, your-message

Ngoài ra, đoạn code bên dưới ràng buộc số điện thoại Việt Nam

function tmdev_validate_phone_vietnam( $result, $tag ) {

$name = $tag->name;

$value = isset( $_POST[$name] ) ? trim( wp_unslash( strtr( (string) $_POST[$name], "\n", " " ) ) ) : '';

$errorMessage = 'Số điện thoại không hợp lệ!';

if ( 'tel' == $tag->basetype ) {

if( !preg_match('/^(03|05|07|08|09)+[0-9]{8}$/', $value ) ){

$result->invalidate( $tag, $errorMessage );

}

}

return $result;

}

add_filter('wpcf7_validate_tel*', 'tmdev_validate_phone_vietnam', 10, 2);

**Hoặc bạn cũng có thể ràng buộc một số thông tin khác theo cách này vd:**

add_filter('wpcf7_validate_text*', 'tmdev_validate_text_your_name', 10, 2);

function tmdev_validate_text_your_name( $result, $tag ){

$name = $tag->name;

$value = isset( $_POST[$name] ) ? trim( wp_unslash( strtr( (string) $_POST[$name], "\n", " " ) ) ) : '';

// rang buoc ho ten va ten doanh nghiep khong co ca ky tu dac biet

if( $tag->name === 'your-name' || $tag->name === 'your-company' ){

$errorMessage = "Vui lòng không thêm các ký tự đặc biệt";

if ( preg_match('/[()*~@!#$%^&_\-\+=\?\{\}\[\]\`\<\>\d]/', $value ) ){

$result->invalidate( $tag, $errorMessage );

}

}

// rang buoc ma so thue

if( $tag->name === 'your-tax-number' ){

$errorMessage = "Mã số thuế không hợp lệ";

if( !preg_match('/^[0-9]{10}$/', $value ) ){

$result->invalidate( $tag, $errorMessage );

}

}

return $result;

}

Nguồn: Ràng buộc số điện thoại Việt Nam trong contact form 7