Trong quá trình phát triển website, việc quản lý bình luận từ người dùng là một phần quan trọng để duy trì tính tương tác và xây dựng cộng đồng. Tuy nhiên, một vấn đề lớn mà các quản trị viên WordPress thường gặp phải là spam bình luận, đặc biệt là những bình luận tự động từ bot. Để giải quyết vấn đề này, một trong những phương pháp phổ biến và hiệu quả chính là sử dụng CAPTCHA. Trong bài viết này, chúng tôi sẽ chia sẻ một đoạn mã hoàn chỉnh giúp bạn bảo vệ trang web khỏi spam bình luận với CAPTCHA toán học, đồng thời đảm bảo các trường thông tin như số điện thoại và tên của người bình luận được xác thực chính xác.
Bạn có thể xem thêm các thủ thuật khác tại đây: https://muathemewpgiare.com/thu-thuat-wordpress/
1. Xóa Các Trường Không Cần Thiết Như Email và URL Trong Form Bình Luận
Để giảm thiểu spam, chúng ta có thể loại bỏ các trường email và URL trong form bình luận. Những trường này thường được các bot sử dụng để tạo các liên kết tự động hoặc gửi bình luận không mong muốn. Mã dưới đây sẽ giúp bạn loại bỏ các trường này:
1 2 3 4 5 6 | add_filter('comment_form_default_fields', 'muathemewpgiare_remove_fields'); function muathemewpgiare_remove_fields($fields) { unset($fields['email']); unset($fields['url']); return $fields; } |
2. Thêm Trường Số Điện Thoại Vào Form Bình Luận
Một phương pháp phổ biến để ngăn chặn spam là yêu cầu người dùng cung cấp số điện thoại khi gửi bình luận. Đoạn mã dưới đây sẽ thêm trường số điện thoại vào form bình luận và xác thực số điện thoại theo định dạng Việt Nam (bắt đầu bằng 0 và có 10-11 chữ số):
1 2 3 4 5 6 7 8 | add_filter('comment_form_default_fields', 'muathemewpgiare_add_phone_field'); function muathemewpgiare_add_phone_field($fields) { $fields_phone = '<p class="comment-form-phone">' . '<label for="phone">' . __('Số điện thoại') . '<span class="required">*</span></label>' . '<input id="phone" name="phone" type="text" size="30" tabindex="4" required="required" pattern="^0[0-9]{9,10}$" title="Số điện thoại Việt Nam (10-11 chữ số, bắt đầu bằng 0)" /></p>'; $fields['phone'] = $fields_phone; return $fields; } |
3. Lưu Số Điện Thoại và Kiểm Tra Trong Backend
Khi người dùng gửi bình luận, số điện thoại sẽ được lưu vào metadata của bình luận. Bạn có thể sử dụng mã dưới đây để lưu trữ số điện thoại và kiểm tra tính hợp lệ của nó trước khi bình luận được gửi lên website:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | add_action('comment_post', 'muathemewpgiare_save_comment_phone'); function muathemewpgiare_save_comment_phone($comment_id) { if (isset($_POST['phone']) && !empty($_POST['phone'])) { $phone = sanitize_text_field($_POST['phone']); add_comment_meta($comment_id, 'phone', $phone); } } add_filter('preprocess_comment', 'muathemewpgiare_verify_comment_phone'); function muathemewpgiare_verify_comment_phone($commentdata) { if (!isset($_POST['phone']) || empty($_POST['phone'])) { wp_die(__('Lỗi: Số điện thoại là bắt buộc.')); } $phone = $_POST['phone']; if (!preg_match('/^0[0-9]{9,10}$/', $phone)) { wp_die(__('Lỗi: Số điện thoại không đúng định dạng.')); } return $commentdata; } |
5. Kiểm Tra Đáp Án CAPTCHA
Sau khi người dùng nhập kết quả vào trường CAPTCHA, chúng ta sẽ kiểm tra câu trả lời trong backend để đảm bảo rằng người dùng đã giải đúng phép toán. Nếu câu trả lời sai, hệ thống sẽ không cho phép bình luận được gửi:
1 2 3 4 5 6 7 8 | add_filter('preprocess_comment', 'muathemewpgiare_verify_math_captcha'); function muathemewpgiare_verify_math_captcha($commentdata) { if (!isset($_POST['math_captcha']) || $_POST['math_captcha'] != $_SESSION['math_captcha_answer']) { wp_die(__('Lỗi: Bạn phải giải đúng phép toán để gửi bình luận.')); } unset($_SESSION['math_captcha_answer']); return $commentdata; } |
6. Ngăn Chặn Spam Bằng Các Từ Khóa Xấu
Để bảo vệ website khỏi các bình luận không mong muốn có chứa từ khóa spam, bạn có thể kiểm tra nội dung bình luận và từ chối những bình luận có chứa các từ khóa không phù hợp như “viagra”, “casino”, “bet”, v.v. Mã dưới đây sẽ giúp bạn làm điều này:
1 2 3 4 5 6 7 8 9 10 11 12 | add_filter('preprocess_comment', 'muathemewpgiare_check_spam_keywords'); function muathemewpgiare_check_spam_keywords($commentdata) { $spam_keywords = array('viagra', 'casino', 'bet', 'adult', 'free', 'click here'); $comment_content = strtolower($commentdata['comment_content']); foreach ($spam_keywords as $keyword) { if (strpos($comment_content, $keyword) !== false) { wp_die(__('Lỗi: Bình luận của bạn chứa từ khóa spam.')); } } return $commentdata; } |
Dưới đây là đoạn code hoàn chỉnh. Bạn chỉ cần thêm code sau vào functions.php của theme là được
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 | // Bắt đầu session để lưu CAPTCHA add_action('init', 'muathemewpgiare_start_session'); function muathemewpgiare_start_session() { if (!session_id()) { session_start(); } } // Xóa các trường email và URL khỏi form bình luận add_filter('comment_form_default_fields', 'muathemewpgiare_remove_fields'); function muathemewpgiare_remove_fields($fields) { // Xóa trường email và URL để giảm spam unset($fields['email']); unset($fields['url']); return $fields; } // Thêm trường số điện thoại vào form bình luận add_filter('comment_form_default_fields', 'muathemewpgiare_add_phone_field'); function muathemewpgiare_add_phone_field($fields) { $commenter = wp_get_current_commenter(); $fields_phone = '<p class="comment-form-phone">' . '<label for="phone">' . __('Số điện thoại') . '<span class="required">*</span></label>' . '<input id="phone" name="phone" type="text" size="30" tabindex="4" required="required" pattern="^0[0-9]{9,10}$" title="Số điện thoại Việt Nam (10-11 chữ số, bắt đầu bằng 0)" /></p>'; // Thêm trường phone vào trước trường cookie trong form $fields_new = muathemewpgiare_array_insert_before('cookies', $fields, 'phone', $fields_phone); if ($fields_new) $fields = $fields_new; return $fields; } // Lưu số điện thoại vào metadata của bình luận add_action('comment_post', 'muathemewpgiare_save_comment_phone'); function muathemewpgiare_save_comment_phone($comment_id) { if (isset($_POST['phone']) && !empty($_POST['phone'])) { $phone = sanitize_text_field($_POST['phone']); add_comment_meta($comment_id, 'phone', $phone); } } // Kiểm tra số điện thoại khi gửi bình luận add_filter('preprocess_comment', 'muathemewpgiare_verify_comment_phone'); function muathemewpgiare_verify_comment_phone($commentdata) { // Kiểm tra nếu không phải admin và chưa đăng nhập if (!is_admin() && !is_user_logged_in() && 'post' === get_post_type(absint($_POST['comment_post_ID']))) { // Kiểm tra trường phone có tồn tại không if (!isset($_POST['phone']) || empty($_POST['phone'])) { wp_die(__('Lỗi: Số điện thoại là bắt buộc.')); } // Kiểm tra số điện thoại đúng định dạng $phone = $_POST['phone']; if (!preg_match('/^0[0-9]{9,10}$/', $phone)) { wp_die(__('Lỗi: Số điện thoại không đúng định dạng.')); } // Kiểm tra tên người bình luận (bắt buộc) if (empty($commentdata['comment_author'])) { wp_die(__('Lỗi: Xin hãy nhập tên của bạn.')); } } return $commentdata; } // Hiển thị số điện thoại trong bảng quản trị (admin) add_filter('comment_text', 'muathemewpgiare_display_phone_in_admin'); function muathemewpgiare_display_phone_in_admin($text) { $commentphone = get_comment_meta(get_comment_ID(), 'phone', true); if ($commentphone && is_admin()) { $commentphone = '<br/>SĐT: <strong>' . esc_attr($commentphone) . '</strong>'; $text = $text . $commentphone; } return $text; } // Tắt yêu cầu email và tên trong WordPress (nếu không cần thiết) add_filter('option_require_name_email', '__return_false'); // Hàm thêm số điện thoại vào trước một khóa trong mảng if (!function_exists('muathemewpgiare_array_insert_before')) { function muathemewpgiare_array_insert_before($key, array &$array, $new_key, $new_value) { if (array_key_exists($key, $array)) { $new = array(); foreach ($array as $k => $value) { if ($k === $key) { $new[$new_key] = $new_value; } $new[$k] = $value; } return $new; } return false; } } // Kiểm tra và ngăn chặn các bình luận có từ khóa spam add_filter('preprocess_comment', 'muathemewpgiare_check_spam_keywords'); function muathemewpgiare_check_spam_keywords($commentdata) { // Danh sách từ khóa cần kiểm tra (có thể mở rộng tùy ý) $spam_keywords = array('viagra', 'casino', 'bet', 'adult', 'free', 'click here'); $comment_content = strtolower($commentdata['comment_content']); foreach ($spam_keywords as $keyword) { if (strpos($comment_content, $keyword) !== false) { wp_die(__('Lỗi: Bình luận của bạn chứa từ khóa spam.')); } } return $commentdata; } // Thêm CAPTCHA toán học vào form bình luận add_action('comment_form', 'muathemewpgiare_add_math_captcha'); function muathemewpgiare_add_math_captcha() { // Sinh ngẫu nhiên hai số từ 1 đến 10 cho phép toán $num1 = rand(1, 10); $num2 = rand(1, 10); // Lưu phép toán vào session để so sánh kết quả $_SESSION['math_captcha_answer'] = $num1 + $num2; // Hiển thị phép toán vào form bình luận echo '<p class="comment-form-captcha">' . '<label for="math_captcha">' . sprintf(__('Giải phép toán: %d + %d = ?'), $num1, $num2) . ' <span class="required">*</span></label>' . '<input id="math_captcha" name="math_captcha" type="text" size="30" required="required" /></p>'; } // Kiểm tra câu trả lời CAPTCHA khi bình luận được gửi add_filter('preprocess_comment', 'muathemewpgiare_verify_math_captcha'); function muathemewpgiare_verify_math_captcha($commentdata) { // Kiểm tra câu trả lời CAPTCHA (có tồn tại trong session không) if (!isset($_POST['math_captcha']) || $_POST['math_captcha'] != $_SESSION['math_captcha_answer']) { wp_die(__('Lỗi: Bạn phải giải đúng phép toán để gửi bình luận.')); } // Xóa dữ liệu CAPTCHA khỏi session sau khi kiểm tra unset($_SESSION['math_captcha_answer']); return $commentdata; } |
Kết Luận
Với việc kết hợp các biện pháp như CAPTCHA toán học, xác thực số điện thoại và loại bỏ các trường không cần thiết, bạn đã có thể tạo ra một hệ thống bình luận trên WordPress hiệu quả và bảo mật hơn. Đoạn mã trên sẽ giúp website của bạn giảm thiểu spam và bảo vệ khỏi các bình luận tự động từ bot, đồng thời vẫn giữ lại tính tương tác và người dùng thực sự.
Hãy thử áp dụng các mã trên vào trang web của bạn và bảo vệ nó khỏi các mối nguy hiểm từ spam bình luận.
- Hướng Dẫn Tự Động Cập Nhật SKU cho Sản Phẩm WooCommerce với Mã Tùy Chỉnh
- Mua Theme Giá Rẻ và Chọn Theme WordPress Bán Hàng Chuẩn SEO
- Cách Phát Triển Chiến Lược Từ Khóa Hiệu Quả
- Sharecode chức năng khi truy cập vào trang bất kỳ phải xác thực OTP gmail
- Cách Đo Lường Hiệu Quả Chiến Dịch Marketing Nội Dung