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
我没有用小墙,暂时不需要
@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, 其实做得挺不错的,只是或许旧了点,嗯,最近有更新,不过我没升级
🙄 还真没注意我那边有多少误杀评论 =.= 有什么地方能看么0.0
@mice, 后台看垃圾评论里
@流年, 😯 很少有评论出现在垃圾评论里…倒是那种发广告经常进去..
@mice, 那是好事咧
看了此文后我也用了小墙
还是wp自带的嵌套评论好用
@Pavel, 嗯,自带就省事多了
什么是小墙?
@睿智小超人, 嗯,一个防止机器spam的函数而已;类似于WordPress内置的Akismet,不过工作原理和不一样就是了
吼吼,技术文,学习啦~~~ 😉
@奶牛, ➡ 很惭愧,连伪技术都不算,因为没解决问题
其实不必用wordpress-thread-comment了,直接用自带的嵌套功能即可啊
@yetone, 我这款主题不支持
老大,我用了,为什么前台的回复不能点击呢?点击没反应啊?极盼回答,谢谢
我用的是wordpress-thread-comment ❓