WordPress 自动阻止 URL 超过一定长度的垃圾评论

是的,自昨天开始遭遇了有史以来“技术含量”最高的垃圾评论,其中一部分绕过了 Akismet,它们@回复了往常的正常评论,相信有朋友已收到回复通知邮件了。他们是怎样做到的,难道手工提交?

接连不断的垃圾评论从昨天中午一直持续到今天上午,删不断、理还乱。事实证明不能完全指望 Akismet 了,总结了这些垃圾评论的共性:

  1. 清一色的英文评论;
  2. 评论中偶尔带有超链接 a href 标记;
  3. URL 栏填写的网址长度非常长,一般超过30个字符。

今天勇士队打的实在太狗屎了,不愿继续浪费精力关注了,转过来研究对付垃圾评论的方法:

针对第一条,可以通过屏蔽非中文的评论来实现,对于我在用的主题,有的评论通过@回复昵称中包含汉字的评论即可绕过这个限制,所以,这并不总是有效的。

针对第二条,可以过滤评论内容字符来实现,但有些垃圾评论,其内容中并没有超链接。

以上这两条很容易在网上找到现成的方法,很多时候是很管用的。

针对第三条,垃圾评论的 URL 通常长度很长(不低于30个字符长度),可以通过阻止 URL 长度超过一定限制的评论提交,从而达到屏蔽的目的,很遗憾没有找到这样的现成方法,好在找到这么一条信息:Spam Comments with Very Long URL’s

这个方法可将带有长 URL 的评论自动标记为垃圾评论,它有个天然的缺陷,只有待评论生成后才会处理,如此,不得不强迫自己再去审视一遍垃圾评论,不是我想要的,我想在它们被提交之前拒其门外。

禁止 URL 超过一定长度的垃圾评论

改造一下终于实现我想要的结果:禁止 URL 超过一定长度的垃圾评论提交,这里对 URL 长度做的限定为小于30个字符长度,否则不允许提交,这个方法仍旧会存在误伤,我想拿长度超过30个字符的域名写博客的人应该不多吧:

function mgy_spam_comments( $commentdata ) {
    $comment_author_url = 30;
    if ( strlen( trim( $commentdata['comment_author_url'] ) ) > $comment_author_url ){
        wp_die( "You are bullshit!" );
    }
    return( $commentdata );
}
add_filter('preprocess_comment', 'mgy_spam_comments');

为防止有鱼漏网,将屏蔽非中文和带有超链接的两个功能合到上面的代码中,得到:

function mgy_spam_comments($commentdata){
    $comment_author_url = 30;
    $pattern = '/[一-龥]/u';
    $http = '/[href="|rel="nofollow"|http:\/\/|< \/a>]/u';
    if ( strlen( trim( $commentdata['comment_author_url'] ) ) > $comment_author_url ){
        wp_die( "You are bullshit!" );
    } elseif ( !preg_match( $pattern, $commentdata['comment_content'])) {
        wp_die( "至少包含一个汉字" );
    } elseif ( preg_match( $http, $commentdata['comment_content'])) {
        wp_die( "You are bullshit!" );
    }
    return( $commentdata );
}
add_filter('preprocess_comment', 'mgy_spam_comments');

===========================================
更新:没想到刚上线就让http://synyan.net博主中招了,特意发邮件过来提醒,在此诚心对他表示道歉和感谢,请多多包涵。
现在做了调整,仅对 URL 长度做限制。

回复 Shrek 取消回复

评论(4)

  1. 灰狼

    我是直接封IP的,见一个封一段。尤其是国外IP,不手软

    1. Shrek

      @灰狼 这个方法也有弊端,比如有时候不得不强迫去看一遍那些烦人的垃圾评论

  2. stan

    屏蔽非中文这个非常有用

    1. Shrek

      @stan 有一部分全英文的垃圾评论会@昵称带有中文字符的,只屏蔽非中文会有少部分漏网之鱼。