我这个 Blog 一直在使用 SK2 作为垃圾评论阻止插件,效果很好,很少有误报和漏报的情况;但由于插件实现原理的原因,所有的垃圾评论都会被写入数据库,这点让人很不爽,我更希望实现的是在点击“提交评论”按钮后,如果是 SPAM 就直接阻止了事;更不爽的是 SK2 安装后会自建三个数据库表:sk2_blacklist、wp_sk2_logs、wp_sk2_spams,而且这三个表数据量也很惊人。

考虑用数学公式和验证码的插件,但损害用户体验,因此放弃;想来想去,还是自己动手实现一下,以前做过用隐藏字段实现反 SPAM,效果不错,这次举一反三,自己 DIY 一下 WordPress 反 SPAM。

原理:将默认的评论输入接口专供 SPAM 使用,为正常评论提供新输入接口,这样的话,通过正常渠道进入的评论肯定就是 SPAM 了。

方法:将默认的评论内容文本框(textarea)用 display: none 隐藏,然后再新建一个相同的评论内容文本框(name 要不同),用户输入的评论会进入新文本框,而 SPAM 一定会去填充默认的那个评论内容文本框,如果此框内容不为空,那肯定就是 SPAM 了。

实现:很简单,改两个文件,约四行代码:

文件1:主题文件 comments.php,添加新的评论内容 textarea,示例如下(不同的主题可能会稍有所不同):

<textarea name="comment" id="comment" style="display: none;"></textarea><br>
<textarea name="comment2" id="comment2"></textarea><br>

文件2:WordPress 源文件 wp-comment-post.php,这是评论处理文件,在该文件的评论内容相关变量初始化代码的下面,约第 39 行左右添加如下代码即可:

if ($comment_content <> '') wp_die('You are spammer?');
$comment_content      = trim($_POST['comment2']);

效果:自使用这种方法后,一条 SPAM 也没有收到 🙂

这种方法简单,不像 SK2 那样涉及到数据库,而是直接把 SPAM 挡在了门外;缺点就是需要修改 WordPress 的源文件,在每次 WordPress 升级的时候,都需要改一下 wp-comment-post.php,通用性不强;当然这种方法也不是万能的,如果 SPAM 不填充默认评论内容(可能性不高,有违 SPAM 本性,但智能性的除外),那这种方式就失效了。

不过我也很期待,第一条 SPAM 会何时收到?这种反 SPAM 方式能坚持多久!