解决小墙与wordpress-thread-comment的冲突
Update:我小看了这个插件,只是解决了一个小问题,但最终结果是未解决。。。。。
Willin大师的小墙广为传播,我一直有知,不过抱着能懒就懒的念头,一直都没有去使用,而是使用着Akismet。
不过,随着评论的增加,貌似误杀率在提高,所以决定换了。
方法倒是简单,直接将Willin提供的以下代码copy到functions.php文件中即可。
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 | /* <<小牆>> 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>#", "textarea$1name=$2w$3$4/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']; } return $comment; } } $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文件中的以下代码注释掉:
1 2 3 4 5 6 | 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
我没有用小墙,暂时不需要
@BoKeam, 你是用WP附带的那个Akismet吗?没用wordpress-thread-comment大概也就直接copy进去就可以了
@流年, 是的.我记得我有条评论被误判了
@BoKeam, 嗯,我知道,很抱歉的说
我也暂时没有用任何墙,全是手动来识别的。。这样不会伤感情,呵呵!
@人好哇!, 要是碰上疯狂的机器spam就悲剧了;删得手痛。而且小墙只是针对机器spam的
这个玩意儿和我的wp rc reply ajax插件也冲突,基于评论框伪造的判断来断绝spam,草率了点。。
@QiQiBoY, 只能防机器spam。关键是Akismet的误杀率挺高,没墙又不行;不知道你使用什么?
@QiQiBoY, 看来果然插件还是存在些问题啊,看到你回复内容被清为空,被扔进小墙里了
小强的代码我连看都没看过 直接抓过来就用- -
@snowxh, 一般来说也就直接用就可以了
@流年,
@snowxh, 我发现问题没那么简单,所以又暂时卸下了(话说,害得这个评论内容为空了。。。
@流年, 我今天长见识了。。。
@snowxh, 极度o(╯□╰)o!!!
话说,500页面如何定义!!!我在空间后台倒是看到个可以直接添加代码的,不过别的空间好像没提供这个便捷功能
@流年, 不知道额没定义过。。只看过willin大师的伍佰页面- -
@流年, 一大清早来就看见你的伍佰页面
@vastar, 最近ATB的服务器好像不怎么稳定!!话说,你看到500页面是如何的呢?有没有图片?(我自己都还没看见过)
@流年, 有图片
我的账号被suspend了。。。
@vastar, 为什么呢?我刚刚还去过那边
@流年, 这是第二次了。说好用太多资源…我有16个插件,有super cache。搞不懂。今天被停应该是昨天出现了高消耗。
@vastar, 我这好像没发现过
第一条评论被spam了
第二条说我发表类似
第三条把我评论内容改了
你家小强好可怕!!
@snowxh, 是与那个插件有冲突了,因为修改了那个name值
评论看看效果怎样
@Ygs, 呃!先不说我已经撤下了,就算没撤,你也看不到效果
@流年,
都不提前说一声
@Ygs, 有update的说
@流年, 测试效果
@Ray Chow, 来迟了,我反悔了的说
这个我还没遇到过!呵呵。
怪不得我前几天加上小墙就出现了这样的错误 好来只好撤下了
@Louis Han, 嗯,评论插件有冲突,没办法
虽然只能防机器,但是想法确实很简单巧妙啊。不愧是willin大师。
@vastar, 那时那是,都人称大师了
还是偶自己的原生态嵌套舒服啊
@Mucid, 因为这是别人的主题嘛,修改起来还是很麻烦滴,先将就着
@流年, 其实这款主题真的神奇,呃,不晓得怎么的为什么这么多人喜欢昵
@Mucid, 其实做得挺不错的,只是或许旧了点,嗯,最近有更新,不过我没升级
@mice, 后台看垃圾评论里
@流年,
很少有评论出现在垃圾评论里…倒是那种发广告经常进去..
@mice, 那是好事咧
看了此文后我也用了小墙
还是wp自带的嵌套评论好用
@Pavel, 嗯,自带就省事多了
什么是小墙?
@睿智小超人, 嗯,一个防止机器spam的函数而已;类似于WordPress内置的Akismet,不过工作原理和不一样就是了
吼吼,技术文,学习啦~~~
@奶牛,
很惭愧,连伪技术都不算,因为没解决问题
其实不必用wordpress-thread-comment了,直接用自带的嵌套功能即可啊
@yetone, 我这款主题不支持
老大,我用了,为什么前台的回复不能点击呢?点击没反应啊?极盼回答,谢谢
我用的是wordpress-thread-comment