wordpress无需插件实现垃圾评论的拦截

今天我打开Wordpress博客的后台,我直接崩溃了,272条垃圾评论,之前换主题之前还没有如此多的垃圾评论,我左思右想,终于明白了,原来这个主题我没有添加评论验证,现在看来真的很有必要了。

幸亏 Willin Kan 的Anti-Spam v1.83全都给我拦截了,好样的,我甚是喜欢这个Anti-Spam了,

下面是Anti_spam的代码,直接丢到主题的Fuctions.php中,注意,我把代码中的“无头像评论标记为待审”功能去掉了,这样可以防止少部博友被列入待审列表中。

 

PHP语言
//垃圾评论检测
           /* <<小牆>> Anti-Spam v1.83 by Willin Kan. */
       class anti_spam {
       function anti_spam() {
       if ( !current_user_can(‘read’) ) {
             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() ) {
       // 非中文語系
       if ( stripos($_SERVER[‘HTTP_ACCEPT_LANGUAGE’], ‘zh’) === false ) {
               add_filter( ‘comments_open’, create_function(”, “return false;”) ); // 關閉評論
       } else {
       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() {
       $w = ‘w’;
       if ( !empty($_POST[$w]) && empty($_POST[‘comment’]) ) {
       $_POST[‘comment’] = $_POST[$w];
       } else {
       $request = $_SERVER[‘REQUEST_URI’];
       $IP = $_SERVER[‘REMOTE_ADDR’]; // 可用於屏蔽 IP
       $way = isset($_POST[$w]) ? ‘手動操作’ : ‘未經評論表格’;
       $spamcom = isset($_POST[‘comment’]) ? $_POST[‘comment’] : ”;
       $_POST[‘spam_confirmed’] = “請求: “. $request. “\nIP: “. $IP. “\n方式: “.
       $way. “\n內容: “. $spamcom. “\n — 記錄成功 –“;
       }
       }
       // 處理
       function sink( $comment ) {
       // 不管 Trackbacks/Pingbacks
       if ( in_array( $comment[‘comment_type’], array(‘pingback’, ‘trackback’) ) ) return $comment;
       // 已確定為 spam
       if ( !empty($_POST[‘spam_confirmed’]) ) {
       // 方法一: 直接擋掉, 將 die(); 前面兩斜線刪除即可.
       //die();
       // 方法二: 標記為 spam, 留在資料庫檢查是否誤判.
             add_filter(‘pre_comment_approved’, create_function(”, ‘return “spam”;’));
       $comment[‘comment_content’] = “[ 小牆判斷這是Spam! ]\n”. $_POST[‘spam_confirmed’];
       $this->add_black( $comment );
       } else {
       // 檢查頭像
       $f = md5( strtolower($comment[‘comment_author_email’]) );
       $g = sprintf( “http://%d.gravatar.com”, (hexdec($f{0}) % 2) ) .’/avatar/’. $f .’?d=404′;
       $headers = @get_headers( $g );
       if ( !preg_match(“|200|”, $headers[0]) ) {
       // 沒頭像的列入待審
       
//、、注意!我暂时取消无头像列入待审                add_filter(‘pre_comment_approved’, create_function(”, ‘return “0”;’));

       //$this->add_black( $comment );
       }
       }
       return $comment;
       }
       // 列入黑名單
       function add_black( $comment ) {
       $blacklist = get_option(‘blacklist_keys’);
           update_option(‘blacklist_keys’, $comment[‘comment_author’] . “\n” . $blacklist);
       }
       }
       $anti_spam = new anti_spam();
       // — END —————————————-

可是这也不是长久之计,大部分垃圾评论是纯外文的,要不再添加一个过滤纯外文的代码,这个代码不知道是谁写的,也很不错~~
以下是代码,和上一个一样的,直接添加到主题的Fuctions.php中

PHP语言
// 禁止全英文评论
   /*
   add_theme_support(‘automatic-feed-links’); // Add default posts and comments RSS feed links to head
   function scp_comment_post( $incoming_comment ) {
       $pattern = ‘/[一-龥]/u’;
   
       if(!preg_match($pattern, $incoming_comment[‘comment_content’])) {
           wp_die( “You should type some Chinese word (like \”你好\”) in your comment to pass the spam-check, thanks for your patience! 您的评论中必须包含汉字!” );
       }
   return( $incoming_comment );
   }
   add_filter(‘preprocess_comment’, ‘scp_comment_post’);

据分析垃圾评论的来源时,大部分垃圾评论直接通过博客的页面提交评论的,那么在页面上我们要不要加个验证问题,比如简单的数学运算?
好的接下来我给大家推荐我珍藏了很久的的代码,不用任何插件,只需简单修改主题即可~

首先将以下代码添加到主题的Fuctions.php中。

PHP语言
//简单的评论运算    
   class zxdRoboCheck{
           function roboCheck($comment){
                       $user_id=get_current_user_id( );
                       if($user_id !=0) return($comment);
               if (empty($_POST[‘robo’]) || trim($_POST[‘robo’]) == ” ) {
                   wp_die( __(‘喂!你是不是那个算数题是不是没有回答?赶紧点击这里<a href=”javascript:history.back(-1)”>返回上一页</a>,继续你的吐槽~’));
               }
               $robo_num1 = (int)$_POST[‘robo’];
               $robo_num2 = (int)$_POST[‘rnum’];
               if ( $robo_num2 == $robo_num1) {
                   return($comment);
               }
               else {
                   wp_die( __(‘嘿嘿~~ 这么简单的运算,居然算对了!你好厉害呀!赶紧点击这里<a href=”javascript:history.back(-1)”>返回上一页</a>,继续你的吐槽~’));
               }
           }
           }
   if (class_exists(“zxdRoboCheck”)) {
       $aRoboCheck = new zxdRoboCheck();
       add_filter(‘preprocess_comment’, array($aRoboCheck, ‘roboCheck’), 1);
       }

接下来把把以下代码放到你主题的适当位置,一般在主题的comments.php中修改,放到“站点”文本框的后面,你也可以按照具体情况放置位置了。

PHP语言
<?php
if (!$user_ID){ //这里判断是不是管理员,如果是管理员则不显示验证
//评论验证说明 rand(1,9)指的是产生一个从1之9之间的随机数。
$rnum1 =rand(1,7);
$rnum2 = rand(2,8);
$rnum = $rnum1 * $rnum2; //运算方式是进行乘积
?>        
<span style=”padding-right:20px;width:140px;height:32px”>
<span style=”padding-left:10px;”><?php  echo $rnum1;?><?php echo $rnum2; ?>=</span>
<input id=”robo” name=”robo” type=”text” value=”” size=”10%” aria-required=”true” style=”width:20px;” />
<input id=”rnum” name=”rnum” type=”hidden” value=”<?php echo $rnum; ?>” size=”0″ aria-required=”true” class=”hide” />
</span>    
<?php }?>

我以上代码美化了,现在看起来很舒服,测试我通过了~~
经过这么一段时间的折腾,垃圾评论是算是遏制了

以上代码已经添加到本博客了,欢迎测试~~~
从此我的所有访客都要进行复杂的脑力运算后才能通过我的审核~~(*^__^*) 嘻嘻……

0 thoughts on “wordpress无需插件实现垃圾评论的拦截
添加一条新回复 回到顶部

亲爱的,主人已经关闭了这篇文章的评论 。