现在的位置: 首页 > WordPress教程 > 正文

WordPress防垃圾评论最佳方法【高效】【非插件】

2013年07月04日 WordPress教程 ⁄ 共 3227字 评论数 8 ⁄ 阅读 7,258 次

WordPress垃圾评论是另很多博主头痛的问题,如何防止这些每天上百条的垃圾评论?大多数人或许会选择使用如WordPress反垃圾评论插件Akismet等,然而很多插件会造成WordPress程序变慢,还会在数据库中留下大量信息增加服务器负担。

有些人直接关闭评论功能或让含有url的评论出现页面错误无法提交,然而这两项举措无疑有损用户体验;有些人修改WordPress源程序代码,这样似乎也无法隔离大多数垃圾评论,而且,一般情况下最好不要动WordPress的源代码;还有一些如验证码、滑动解锁等,但这些也并不能阻止程序机的垃圾评论;即使是使用看似很高效的插件如Akismet,我们依然会发现每天仍有漏判的为数不少的垃圾评论。

如何防止WordPress垃圾评论?

笨鸟使用的方法是通过修改主题functions模板文件,自动拒绝全英文评论及含有href=、rel=或者http://字符的评论。经测试,本方法暂时为最高效的WordPress反垃圾手段。

针对知更鸟博客,修改主题functions文件,在文件结尾处?>之前添加如下代码:

// 禁止无中文留言及禁止包含特定字符
function lianyue_comment_post( $incoming_comment ) {
$pattern = '/[一-龥]/u';
$http = '/\<a|href=|rel=|http\:\/\//u';
if(!preg_match($pattern, $incoming_comment['comment_content'])) {
err( "您的评论中必须包含汉字!" );
}elseif(preg_match($http, $incoming_comment['comment_content'])) {
err( "您的留言因有广告嫌疑被禁止!" );
}
return( $incoming_comment );
}
add_filter('preprocess_comment', 'lianyue_comment_post');

对于非知更鸟博客,可尝试如下代码:

// 禁止包含特定字符
function lianyue_comment_post( $incoming_comment ) {
$http = '/\<a|href=|rel=|http\:\/\//';
if(preg_match($http, $incoming_comment['comment_content'])) {
wp_die( "您的留言因有广告嫌疑被禁止!" );
}
return( $incoming_comment );
}
add_filter('preprocess_comment', 'lianyue_comment_post');
// 评论必须包含汉字
function lianyue_comment_post( $incoming_comment ) {
$pattern = '/[一-龥]/u';
if(!preg_match($pattern, $incoming_comment['comment_content'])) {
wp_die( "您的评论中必须包含汉字!" );
}
return( $incoming_comment );
}
add_filter('preprocess_comment', 'lianyue_comment_post');

如果主题使用了ajax评论,提示错误时可能会出现页面布局错误,解决方法如下:

打开comments-ajax.php文件找到最后一个err( __(

在下一行增加:
// 评论必须包含汉字
$pattern = '/[一-龥]/u';
if (!preg_match($pattern,$comment_content) )
err( __('您的评论中必须包含汉字!') );
// 禁止包含特定字符
$http = '/\<a|href=|rel=|http\:\/\//';
if (preg_match($http,$comment_content) )
err( __('您的留言因有广告嫌疑被禁止!') );

以上代码基本能防止大多数垃圾广告留言,然而有些人工手发的垃圾留言无法禁止,但这些留言基本是有律可循的,如包含“回访”字样等,同样可在functions.php模板中添加一段代码防止,任何包含在$ bad_comment_content数组内的字符,将会被自动拒绝留言。

// 禁止包含指定字样字符
function in_comment_post_like($string, $array) {
foreach($array as $ref) { if(strstr($string, $ref)) { return true; } }
return false;
}
function drop_bad_comments() {
if (!empty($_POST['comment'])) {
$post_comment_content = $_POST['comment'];
$lower_case_comment = strtolower($_POST['comment']);
$bad_comment_content = array(
'sex pics',
'online dating',
'回访'
);
if (in_comment_post_like($lower_case_comment, $bad_comment_content)) {
$comment_box_text = wordwrap(trim($post_comment_content), 80, "\n ", true);
$txtdrop = fopen('/var/log/httpd/wp_post-logger/nullamatix.com-text-area_dropped.txt', 'a');
fwrite($txtdrop, " --------------\n [COMMENT] = " . $post_comment_content . "\n --------------\n");
fwrite($txtdrop, " [SOURCE_IP] = " . $_SERVER['REMOTE_ADDR'] . " @ " . date("F j, Y, g:i a") . "\n");
fwrite($txtdrop, " [USERAGENT] = " . $_SERVER['HTTP_USER_AGENT'] . "\n");
fwrite($txtdrop, " [REFERER ] = " . $_SERVER['HTTP_REFERER'] . "\n");
fwrite($txtdrop, " [FILE_NAME] = " . $_SERVER['SCRIPT_NAME'] . " - [REQ_URI] = " . $_SERVER['REQUEST_URI'] . "\n");
fwrite($txtdrop, '--------------**********------------------'."\n");
header("HTTP/1.1 406 Not Acceptable");
header("Status: 406 Not Acceptable");
header("Connection: Close");
wp_die( __('bang bang.') );
}
}
}
add_action('init', 'drop_bad_comments');

有时,这些方法还是不能阻止部分垃圾评论,那么,我们可以到我们的IDC管理面板,查找是否有屏蔽IP功能,可能对这些漏网的IP进行直接屏蔽!

【注】经测试,以前代码在反垃圾上并不能做到针对国内手工垃圾评论的禁止作用,故本站已放弃该代码,采用新代码见“WordPress禁止垃圾评论写入数据库多功能高效代码”!


本文修改自知更鸟博客:http://zmingcx.com/wordpress-comment-spam.html

原文代码有误,无法使用,感谢我在河大论坛的好基友“cracker”红帆给予耐心的技术指导!

» 声明:本站文章源于个人经验总结或书籍、互联网转载,内容仅用于个人学习,请勿转载,否则后果自负!

目前有 8 条留言 其中:访客:3 条, 博主:4 条 引用: 1


  1. 管理员
    大河笨鸟 : 2013年07月04日19:21:22  -49楼 @回复 回复

    注:第二种针对确定关键词防垃圾的代码提交后会造成页面布局错乱,暂无解决办法。


  2. 管理员
    大河笨鸟 : 2013年09月14日22:18:25  -48楼 @回复 回复

    对于第一段代码,也可以屏蔽特定数字或英文字符串,有些垃圾留言插件、代码都屏蔽不了,然后可以选取这些垃圾留言里的字段,做屏蔽就OK了。

  3. 王英学博客 : 2014年03月22日09:32:34  -47楼 @回复 回复

    好集全的方法哈 赞一个

  4. 王英学博客 : 2014年03月22日09:37:56  -46楼 @回复 回复

    我借鉴你的方法写一篇文章哦 会留下你的链接地址的。


    • 管理员
      大河笨鸟 : 2014年04月04日23:27:44  地下1层 @回复 回复

      好的,这段代码其他人也有写过,不过里面正则部分都是错的,后来经修改现可用,防垃圾很给力。

  5. ltns : 2014年06月01日13:10:21  -45楼 @回复 回复

    不错,可惜对inove主题无效


    • 管理员
      大河笨鸟 : 2014年10月18日15:23:31  地下1层 @回复 回复

      若主题使用的不是AJAX方式可能无效,不过稍一修改就好了。

给我留言

留言无头像?