解决小墙与wordpress-thread-comment的冲突

Update:我小看了这个插件,只是解决了一个小问题,但最终结果是未解决。。。。。

Willin大师的小墙广为传播,我一直有知,不过抱着能懒就懒的念头,一直都没有去使用,而是使用着Akismet。

不过,随着评论的增加,貌似误杀率在提高,所以决定换了。

方法倒是简单,直接将Willin提供的以下代码copy到functions.php文件中即可。

/* <<小牆>> Anti-Spam v1.81 by Willin Kan. */
//建立
class anti_spam {
  function anti_spam() {
    if ( !current_user_can('level_0') ) {
      add_action('template_redirect', array(this, 'w_tb'), 1);
      add_action('init', array(this, 'gate'), 1);
      add_action('preprocess_comment', array(this, 'sink'), 1);
    }
  }
  //設欄位
  function w_tb() {
    if ( is_singular() ) {
      ob_start(create_function('input','return preg_replace("#textarea(.*?)name=([\"\'])comment([\"\'])(.+)/textarea>#",
      "textarea1name=2w34/textarea><textarea name=\"comment\" cols=\"100%\" rows=\"4\" style=\"display:none\"></textarea>",input);') );
    }
  }
  //檢查
  function gate() {
    if ( !empty(_POST['w']) && empty(_POST['comment']) ) {_POST['comment'] = _POST['w'];
    } else {request = _SERVER['REQUEST_URI'];referer = isset(_SERVER['HTTP_REFERER']) ?_SERVER['HTTP_REFERER']         : '隱瞞';
      IP      = isset(_SERVER["HTTP_VIA"])     ? _SERVER["HTTP_X_FORWARDED_FOR"]. ' (透過代理)' :_SERVER["REMOTE_ADDR"];
      way     = isset(_POST['w'])              ? '手動操作'                       : '未經評論表格';
      spamcom = isset(_POST['comment'])        ? _POST['comment']                : null;_POST['spam_confirmed'] = "請求: ". request. "\n來路: ".referer. "\nIP: ". IP. "\n方式: ".way. "\n內容: ". spamcom. "\n -- 記錄成功 --";
    }
  }
  //處理
  function sink(comment ) {
    if ( !empty(_POST['spam_confirmed']) ) {
      if ( in_array(comment['comment_type'], array('pingback', 'trackback') ) ) return comment; //不管 Trackbacks/Pingbacks
      //方法一: 直接擋掉, 將 die(); 前面兩斜線刪除即可.
      //die();
      //方法二: 標記為 spam, 留在資料庫檢查是否誤判.
      add_filter('pre_comment_approved', create_function('', 'return "spam";'));comment['comment_content'] = "[ 小牆判斷這是Spam! ]\n". _POST['spam_confirmed'];
    }
    returncomment;
  }
}
$anti_spam = new anti_spam();
// -- END ----------------------------------------

一般来说,这样就可以了。

不过由于我使用的是iNove主题,没有提供评论嵌套功能,所以我使用了wordpress-thread-comment插件,于是在启用小墙的过程中发生了意外,提交评论时提示说评论为空。

因为小墙是将原评论框的name由comment改为w,然后启用一个隐藏的name为comment的textarea,实际上我们是在w中评论,然后再赋值到comment中;而机器spam是直接填到comment的textarea,故暴露了其为spam的真相。(故对人肉spam无效)

而wordpress-thread-comment会在提交时对name为comment的textarea的内容进行判断,若为空则警告。

所以,解决方案是将wordpress-thread-comment插件目录下的wordpress-thread-comment.js.php文件中的以下代码注释掉:

if(comment == null || comment == ""){
    alert("comment can not be empty");
    if(Commentarea && Commentarea.display != "none")
        Commentarea.focus();
    return false;
}

Update

嗯,修改评论框的name属性,由于使用了wordpress-thread-comment的原因,所以可能会造成很多问题,若有发现,还请各位提醒一下。
看来,还是尽快抛弃这个插件,使用原生的嵌套比较好。

沮丧地再次Update

我把问题想得太简单了,进行嵌套回复时好像wordpress-thread-comment得到的是原来的评论框,所以造成诸多问题,暂时又撤回去了。o(╯□╰)o

53条评论

    1. @BoKeam, 你是用WP附带的那个Akismet吗?没用wordpress-thread-comment大概也就直接copy进去就可以了

    1. @人好哇!, 要是碰上疯狂的机器spam就悲剧了;删得手痛。而且小墙只是针对机器spam的

  1. 这个玩意儿和我的wp rc reply ajax插件也冲突,基于评论框伪造的判断来断绝spam,草率了点。。

    1. @QiQiBoY, 只能防机器spam。关键是Akismet的误杀率挺高,没墙又不行;不知道你使用什么?

    2. @QiQiBoY, 看来果然插件还是存在些问题啊,看到你回复内容被清为空,被扔进小墙里了

    1. @snowxh, 一般来说也就直接用就可以了

    1. @snowxh, 我发现问题没那么简单,所以又暂时卸下了(话说,害得这个评论内容为空了。。。

        1. @snowxh, 极度o(╯□╰)o!!!
          话说,500页面如何定义!!!我在空间后台倒是看到个可以直接添加代码的,不过别的空间好像没提供这个便捷功能

          1. @流年, 不知道额没定义过。。只看过willin大师的伍佰页面- –

            1. @vastar, 最近ATB的服务器好像不怎么稳定!!话说,你看到500页面是如何的呢?有没有图片?(我自己都还没看见过)

                1. @vastar, 为什么呢?我刚刚还去过那边

                  1. @流年, 这是第二次了。说好用太多资源…我有16个插件,有super cache。搞不懂。今天被停应该是昨天出现了高消耗。

  2. 第一条评论被spam了
    第二条说我发表类似
    第三条把我评论内容改了
    你家小强好可怕!!

    1. @snowxh, 是与那个插件有冲突了,因为修改了那个name值

    1. @Ygs, 呃!先不说我已经撤下了,就算没撤,你也看不到效果 :mrgreen:

    1. @Louis Han, 嗯,评论插件有冲突,没办法

  3. 虽然只能防机器,但是想法确实很简单巧妙啊。不愧是willin大师。

    1. @Mucid, 因为这是别人的主题嘛,修改起来还是很麻烦滴,先将就着

      1. @流年, 其实这款主题真的神奇,呃,不晓得怎么的为什么这么多人喜欢昵 🙂

        1. @Mucid, 其实做得挺不错的,只是或许旧了点,嗯,最近有更新,不过我没升级

  4. 🙄 还真没注意我那边有多少误杀评论 =.= 有什么地方能看么0.0

      1. @流年, 😯 很少有评论出现在垃圾评论里…倒是那种发广告经常进去..

    1. @睿智小超人, 嗯,一个防止机器spam的函数而已;类似于WordPress内置的Akismet,不过工作原理和不一样就是了

    1. @奶牛, ➡ 很惭愧,连伪技术都不算,因为没解决问题

  5. 其实不必用wordpress-thread-comment了,直接用自带的嵌套功能即可啊

    1. 老大,我用了,为什么前台的回复不能点击呢?点击没反应啊?极盼回答,谢谢

评论已关闭。