Blog

Chặn bình luận rác trên WordPress không cần plugin

Tháng 5 25, 2026 · wn_admin

Chặn bình luận rác trên WordPress không cần plugin

Mỗi sáng mở trang quản trị WordPress mà thấy hàng chục, thậm chí hàng trăm bình luận chờ duyệt toàn quảng cáo thuốc, cờ bạc, link lạ — đó là cơn ác mộng quen thuộc của hầu hết chủ website. Tin tốt là bạn hoàn toàn có thể dẹp gọn bình luận rác mà không cần cài thêm bất kỳ plugin nào, chỉ với cài đặt sẵn có của WordPress, vài đoạn code dán vào functions.php và một ít quy tắc trong .htaccess. Bài viết này sẽ hướng dẫn bạn từng bước, từ dễ đến nâng cao, để website nhẹ hơn, an toàn hơn và sạch hơn.

Vì sao bình luận rác lại nguy hiểm?

Nhiều người nghĩ bình luận rác chỉ là phiền phức nho nhỏ, xóa đi là xong. Thực tế tác hại của nó lớn hơn nhiều, ảnh hưởng đến cả ba khía cạnh quan trọng nhất của một website: SEO, bảo mật và hiệu năng máy chủ.

Ảnh hưởng đến SEO

Bình luận rác thường chứa link tới các trang web kém chất lượng (cờ bạc, thuốc giả, nội dung người lớn). Nếu những bình luận này được hiển thị công khai, Google sẽ coi website của bạn là nơi phát tán liên kết xấu. Điều này làm loãng nội dung, tạo ra “link farm” ngoài ý muốn và có thể khiến trang bị tụt hạng hoặc dính án phạt thủ công từ Google.

Rủi ro bảo mật

Nhiều bot spam không chỉ để lại link, mà còn cố tình chèn mã JavaScript độc hại, thử khai thác lỗ hổng XSS qua trường bình luận, hoặc dò tìm endpoint để tấn công. Một số chiến dịch spam là bước trinh sát trước khi tấn công thật sự vào website.

Tải nặng máy chủ

Mỗi lần bot gửi bình luận, WordPress phải xử lý một truy vấn ghi vào cơ sở dữ liệu. Khi có hàng nghìn lượt spam mỗi ngày, bảng wp_comments phình to nhanh chóng, làm chậm truy vấn, tốn dung lượng hosting và đôi khi gây quá tải CPU — nhất là trên gói hosting chia sẻ giá rẻ.

Phần lớn spam đến từ bot tự động chứ không phải người thật. Bot thường gửi thẳng dữ liệu vào file wp-comments-post.php mà bỏ qua giao diện. Đây chính là điểm yếu giúp chúng ta dễ dàng “bắt bài” bằng vài kỹ thuật đơn giản.

Cấu hình Thảo luận (Discussion) có sẵn

Trước khi đụng tới code, hãy tận dụng tối đa những gì WordPress đã có sẵn. Vào Cài đặt → Thảo luận (Settings → Discussion), bạn sẽ thấy một loạt tùy chọn rất mạnh nhưng ít người để ý.

1

Bắt buộc duyệt thủ công

Tích vào ô “Bình luận phải được duyệt thủ công” (Comment must be manually approved). Như vậy không bình luận nào hiển thị trước khi bạn đồng ý — spam sẽ không bao giờ lọt ra công khai.

2

Giới hạn số liên kết

Tại mục “Giữ bình luận trong hàng chờ nếu chứa từ X liên kết trở lên”, hãy đặt giá trị là 1 hoặc 2. Đa số spam nhồi rất nhiều link, nên đây là bộ lọc cực kỳ hiệu quả.

3

Yêu cầu đăng ký mới được bình luận

Tích “Người dùng phải đăng ký và đăng nhập để bình luận”. Bot ngại tạo tài khoản, nên cách này loại bỏ gần như toàn bộ spam tự động — đổi lại là giảm tương tác từ khách vãng lai.

4

Tự động đóng bình luận bài cũ

Bật “Tự động đóng bình luận với bài viết cũ hơn N ngày” và đặt khoảng 30–90 ngày. Spam thường nhắm vào bài cũ đã có thứ hạng, nên đóng bình luận bài cũ giúp giảm đáng kể lượng rác.

Ngoài ra, trong cùng trang này có hai ô văn bản quan trọng là Comment Moderation (Kiểm duyệt bình luận) và Disallowed Comment Keys (Khóa bình luận bị cấm). Chúng ta sẽ nói kỹ về chúng ở mục 6.

Mẹo: Nếu website của bạn là blog cá nhân hoặc trang giới thiệu dịch vụ ít cần tương tác, cứ mạnh dạn bật cả “bắt buộc duyệt thủ công” lẫn “yêu cầu đăng nhập”. Đây là tổ hợp đơn giản nhưng mạnh nhất, chặn được tới hơn 90% spam mà không cần một dòng code nào.

Tắt hẳn bình luận khi không cần

Nếu website của bạn không thực sự cần tính năng bình luận (ví dụ trang bán hàng, landing page, portfolio), giải pháp triệt để nhất là tắt nó đi. Không có form bình luận thì không có chỗ cho spam.

Tắt theo từng bài/từng trang

Khi soạn bài, bấm vào tab Tùy chọn → Thảo luận ở thanh bên phải (hoặc bật “Discussion” trong Screen Options của trình soạn thảo cổ điển) rồi bỏ tick “Cho phép bình luận”.

Tắt mặc định cho bài mới

Trong Cài đặt → Thảo luận, bỏ tick ô “Cho phép mọi người gửi bình luận trên bài viết mới”. Từ đó về sau mọi bài mới sẽ không mở bình luận.

Tắt toàn bộ site bằng code

Để tắt bình luận trên tất cả loại nội dung (bài viết, trang, và đặc biệt là media/đính kèm — nơi spam rất hay tấn công), thêm đoạn sau vào functions.php:

// Tat hoan toan binh luan tren toan site
add_action('admin_init', function () {
    // Tat ho tro binh luan o moi post type
    foreach (get_post_types() as $post_type) {
        if (post_type_supports($post_type, 'comments')) {
            remove_post_type_support($post_type, 'comments');
            remove_post_type_support($post_type, 'trackbacks');
        }
    }
});

// Dong binh luan tu front-end
add_filter('comments_open', '__return_false', 20, 2);
add_filter('pings_open', '__return_false', 20, 2);

// An binh luan da co trong giao dien
add_filter('comments_array', '__return_empty_array', 10, 2);

// Go menu Binh luan khoi admin
add_action('admin_menu', function () {
    remove_menu_page('edit-comments.php');
});

// An icon binh luan tren thanh admin bar
add_action('init', function () {
    if (is_admin_bar_showing()) {
        remove_action('admin_bar_menu', 'wp_admin_bar_comments_menu', 60);
    }
});

Cảnh báo: Luôn sao lưu file functions.php trước khi chỉnh sửa. Một dấu chấm phẩy thiếu cũng có thể làm trắng cả website (lỗi “white screen of death”). Tốt nhất hãy đặt code vào file của child theme để không bị mất khi cập nhật theme.

Các đoạn code cho functions.php

Đây là phần “đáng tiền” nhất của bài viết. Nếu bạn muốn giữ tính năng bình luận nhưng vẫn chặn spam thông minh, hãy chọn lọc các đoạn code dưới đây và dán vào functions.php (lý tưởng nhất là child theme).

1. Chặn bình luận có chứa URL trong nội dung

Phần lớn spam là để cài link. Đoạn này từ chối thẳng mọi bình luận chứa http:// hoặc https:// trong phần nội dung (không tính trường website):

// Chan binh luan chua link trong noi dung
add_filter('preprocess_comment', function ($commentdata) {
    $content = $commentdata['comment_content'];
    if (preg_match('#(https?://|www\.)#i', $content)) {
        wp_die(
            'Binh luan cua ban chua lien ket nen khong duoc chap nhan.',
            'Loi binh luan',
            array('response' => 403, 'back_link' => true)
        );
    }
    return $commentdata;
});

2. Thêm trường honeypot (bẫy bot)

Honeypot là một trường ẩn mà người dùng thật không nhìn thấy nên để trống, còn bot tự động sẽ điền vào tất cả các trường. Nếu trường này có dữ liệu, ta biết ngay đó là bot:

// Them truong honeypot vao form binh luan
add_action('comment_form_after_fields', function () {
    echo '<p style="position:absolute;left:-9999px;" aria-hidden="true">
        <label>Khong dien vao day
            <input type="text" name="wn_hp_email" value="" tabindex="-1" autocomplete="off">
        </label>
    </p>';
});

// Kiem tra honeypot khi gui binh luan
add_filter('preprocess_comment', function ($commentdata) {
    if (!empty($_POST['wn_hp_email'])) {
        wp_die(
            'Phat hien hoat dong tu dong. Binh luan bi tu choi.',
            'Loi binh luan',
            array('response' => 403)
        );
    }
    return $commentdata;
});

3. Chặn bình luận quá dài hoặc quá ngắn

Spam hay copy nguyên một đoạn quảng cáo dài lê thê, hoặc ngược lại chỉ vài ký tự kèm link. Giới hạn độ dài hợp lý sẽ lọc bớt:

// Chan binh luan qua dai hoac qua ngan
add_filter('preprocess_comment', function ($commentdata) {
    $len = mb_strlen(trim($commentdata['comment_content']));
    if ($len < 8) {
        wp_die('Binh luan qua ngan.', 'Loi', array('response' => 403, 'back_link' => true));
    }
    if ($len > 3000) {
        wp_die('Binh luan qua dai.', 'Loi', array('response' => 403, 'back_link' => true));
    }
    return $commentdata;
});

4. Chặn bình luận trên bài viết cũ bằng code

Nếu không muốn dùng cài đặt giao diện ở mục 2, bạn có thể kiểm soát chính xác bằng code. Đoạn này đóng bình luận với bài cũ hơn 60 ngày:

// Tu dong dong binh luan voi bai cu hon 60 ngay
add_filter('comments_open', function ($open, $post_id) {
    $post = get_post($post_id);
    if (!$post) {
        return $open;
    }
    $days = (time() - strtotime($post->post_date_gmt)) / DAY_IN_SECONDS;
    if ($days > 60) {
        return false;
    }
    return $open;
}, 10, 2);

5. Giới hạn tốc độ (rate limit) theo IP

Một người thật không thể gửi 5 bình luận trong vài giây. Đoạn code dưới đây dùng transient để chặn các IP gửi quá nhanh:

// Gioi han toc do gui binh luan theo IP
add_filter('preprocess_comment', function ($commentdata) {
    $ip  = preg_replace('/[^0-9a-fA-F:.]/', '', $_SERVER['REMOTE_ADDR']);
    $key = 'wn_cmt_' . md5($ip);
    if (get_transient($key)) {
        wp_die(
            'Ban gui binh luan qua nhanh. Vui long thu lai sau it phut.',
            'Cham lai',
            array('response' => 429, 'back_link' => true)
        );
    }
    // Cho phep 1 binh luan moi 30 giay tu cung 1 IP
    set_transient($key, 1, 30);
    return $commentdata;
});

6. Chặn theo từ khóa và đưa thẳng vào hàng chờ

Thay vì từ chối thô bạo, đôi khi bạn chỉ muốn “giam” bình luận khả nghi vào hàng chờ duyệt. Dùng filter pre_comment_approved để làm điều đó dựa trên danh sách từ khóa:

// Dua binh luan chua tu khoa nghi van vao hang cho
add_filter('pre_comment_approved', function ($approved, $commentdata) {
    $blacklist = array('viagra', 'casino', 'crypto', 'loan', 'seo service', 'backlink');
    $content   = strtolower($commentdata['comment_content'] . ' ' . $commentdata['comment_author']);
    foreach ($blacklist as $word) {
        if (strpos($content, $word) !== false) {
            return '0'; // 0 = giu trong hang cho duyet
        }
    }
    return $approved;
}, 10, 2);

Giá trị trả về của pre_comment_approved có thể là: 1 (duyệt ngay), 0 (chờ duyệt) hoặc 'spam' (chuyển vào thùng spam). Nếu muốn chặn cứng spam rõ ràng, trả về 'spam' thay vì '0'.

Chặn bot ngay từ .htaccess

Cách hiệu quả nhất là chặn bot trước khi chúng kịp chạm vào WordPress, ngay tại tầng máy chủ. Nếu hosting của bạn dùng Apache, hãy thêm các quy tắc sau vào file .htaccess ở thư mục gốc website.

Chặn POST thẳng vào wp-comments-post.php

Bot spam gửi dữ liệu trực tiếp tới wp-comments-post.php mà không có HTTP referer (vì chúng không thực sự ghé trang bạn). Quy tắc này chặn các yêu cầu POST không có referer hợp lệ:

# Chan spam gui thang vao wp-comments-post.php
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REQUEST_URI} ^.*/wp-comments-post\.php.*
RewriteCond %{HTTP_REFERER} !^https?://(.*\.)?webngon\.net [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^$
RewriteRule .* - [F,L]
</IfModule>

Nhớ đổi webngon\.net thành tên miền của bạn (dấu \ trước dấu chấm là bắt buộc trong cú pháp regex).

Chặn các user-agent của bot phổ biến

# Chan mot so bot spam theo user-agent
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (libwww|wget|curl|python-requests|scrapy|masscan) [NC]
RewriteRule .* - [F,L]
</IfModule>

Cảnh báo: Chỉnh sai .htaccess có thể khiến cả website trả lỗi 500. Hãy sao lưu file gốc trước, và nếu dùng dịch vụ hợp pháp như Uptime monitor hay cron job qua curl, đừng chặn user-agent đó kẻo tự khóa chính mình.

Danh sách từ khóa cấm (Disallowed Comment Keys)

WordPress có sẵn một công cụ lọc rất mạnh mà nhiều người bỏ qua: ô Disallowed Comment Keys (trước phiên bản 5.5 gọi là “Comment Blacklist”). Bất kỳ bình luận nào chứa từ/cụm từ trong danh sách này sẽ tự động bị chuyển thẳng vào thùng rác.

Vào Cài đặt → Thảo luận, kéo xuống ô “Disallowed Comment Keys” và dán vào, mỗi từ/cụm một dòng. Ví dụ một danh sách khởi đầu:

viagra
cialis
casino
poker
payday loan
porn
xxx
crypto airdrop
free download
buy backlinks
[url=
<a href

Hai dòng cuối rất lợi hại: chúng bắt mọi bình luận cố chèn thẻ liên kết BBCode hoặc HTML — kỹ thuật cực phổ biến của spam.

Ô cài đặt Hành vi với bình luận khớp Dùng khi nào
Comment Moderation Giữ trong hàng chờ duyệt Từ khóa nghi ngờ, cần xem lại
Disallowed Comment Keys Chuyển thẳng vào thùng rác Từ khóa chắc chắn là spam
Giới hạn số link Giữ trong hàng chờ duyệt Lọc spam nhồi nhiều link

Mẹo: Mỗi khi xóa một bình luận spam, hãy ghi nhớ vài từ khóa đặc trưng của nó và bổ sung vào Disallowed Comment Keys. Sau vài tuần “nuôi” danh sách, bạn sẽ có một bộ lọc cá nhân hóa cực kỳ hiệu quả cho đúng kiểu spam mà website mình hay gặp.

Akismet vs không plugin: chọn gì?

Akismet là plugin chống spam nổi tiếng nhất, đi kèm sẵn trong mọi bản cài WordPress. Nó hoạt động bằng cách gửi mỗi bình luận lên máy chủ Akismet để đối chiếu với cơ sở dữ liệu spam khổng lồ. Vậy giải pháp không plugin của chúng ta so sánh thế nào?

Tiêu chí Akismet Không plugin (code + cài đặt)
Độ chính xác Rất cao, cập nhật liên tục Tốt nếu cấu hình kỹ
Hiệu năng Mỗi bình luận gọi API bên ngoài Xử lý nội bộ, nhanh hơn
Quyền riêng tư Gửi IP, email người dùng ra ngoài Dữ liệu không rời server
Chi phí Miễn phí cho cá nhân, có phí cho site thương mại Hoàn toàn miễn phí
Bảo trì Tự động, ít cần đụng tay Cần tự cập nhật danh sách

Tóm lại: nếu bạn ngại đụng code và website có nhiều bình luận thật, Akismet vẫn là lựa chọn tiện lợi. Nhưng nếu bạn muốn website nhẹ, không phụ thuộc dịch vụ ngoài, và bảo vệ quyền riêng tư của khách truy cập, bộ kỹ thuật không plugin trong bài này hoàn toàn đáp ứng được — thậm chí kết hợp cả hai cũng rất tốt.

Khi nào nên dùng plugin?

Triết lý “ít plugin càng tốt” là đúng, nhưng không phải lúc nào tự code cũng là lựa chọn khôn ngoan. Dưới đây là checklist giúp bạn quyết định.

Nên ở lại với giải pháp không plugin nếu:

  • Website nhỏ, lượng bình luận vừa phải, bạn có thời gian kiểm duyệt
  • Bạn ưu tiên tốc độ và muốn giảm tối đa số plugin
  • Bạn thoải mái với việc chỉnh sửa functions.php

Nên cân nhắc plugin chuyên dụng nếu:

  • Website lớn, nhận hàng nghìn lượt spam mỗi ngày
  • Bạn không muốn (hoặc không thể) đụng vào code
  • Cần báo cáo, thống kê, hoặc tích hợp CAPTCHA nâng cao

Một số plugin nhẹ đáng cân nhắc gồm Antispam Bee (miễn phí, không gửi dữ liệu ra ngoài), hoặc tích hợp Cloudflare Turnstile thay cho reCAPTCHA. Nhưng với phần lớn website cá nhân và doanh nghiệp nhỏ ở Việt Nam, các kỹ thuật trong bài này là quá đủ.

Câu hỏi thường gặp

Tắt bình luận có ảnh hưởng đến SEO không?

Không trực tiếp. Bình luận có thể tạo nội dung tươi mới và từ khóa dài giúp ích cho SEO, nhưng nếu toàn spam thì lợi bất cập hại. Với trang ít tương tác, tắt bình luận để website sạch và nhanh hơn là hoàn toàn hợp lý.

Honeypot có chặn được hết bot không?

Không tuyệt đối, nhưng nó chặn được phần lớn bot đơn giản — vốn chiếm đa số spam. Kết hợp honeypot với rate limit và Disallowed Comment Keys sẽ cho hiệu quả rất cao mà không làm phiền người dùng thật như CAPTCHA.

Tôi đặt code ở functions.php của theme có bị mất khi cập nhật không?

Có. Mỗi lần cập nhật theme cha, file functions.php sẽ bị ghi đè. Vì vậy hãy tạo một child theme và đặt code vào đó, hoặc dùng plugin loại “Code Snippets” để giữ code an toàn.

Làm sao xóa hàng loạt spam đang có trong hàng chờ?

Vào Bình luận trong trang quản trị, lọc theo “Đang chờ” hoặc “Spam”, tích chọn tất cả rồi chọn hành động hàng loạt “Chuyển vào thùng rác”. Bạn cũng có thể tối ưu bảng wp_comments bằng cách dọn thùng rác định kỳ.

Chặn theo quốc gia có khả thi không?

Có, nhưng cần module GeoIP trên server hoặc dùng Cloudflare để chặn theo quốc gia ở tầng CDN — đây là cách sạch và nhẹ nhất. Chặn theo IP đơn lẻ trong .htaccess chỉ hiệu quả với vài IP cố định, vì bot thường đổi IP liên tục.

Website sạch spam, giao diện cũng phải đẹp

Chặn được bình luận rác mới chỉ là một nửa câu chuyện. Một giao diện chuyên nghiệp, tối ưu tốc độ và chuẩn SEO mới giúp website của bạn thực sự nổi bật. Khám phá kho giao diện WordPress chất lượng tại Webngon.net.

Xem kho giao diện

Để lại bình luận

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

Trợ lý AI sẵn sàng! 👋

Bạn cần tư vấn gì không?