TypeCodes

wordpress中限制没有Gravatar头像的访客提交评论

1 为何限制没有Gravatar头像的访客

前几天博主就一直在想着是否要限制没有gravatar头像的用户在博客留言,主要原因有三点:

1、博客使用的是wordpress程序,而Gravatar早在07年就被Automattic公司收购并在wp程序上发扬光大。所以,wp博客和gravatar头像天生就是一对,当然要让他们在一起了。

2、屏蔽广告。很多spamer都是没有gravatar头像的,限制没有gravatar头像的访客就等于过滤掉了相当一部分的垃圾广告。扯远一点,多说插件为众多广告商做出了巨大贡献。

3、屏蔽毫无意义的评论。一般没有gravatar头像的访客不会活跃在博客圈。大多是有问题就找你,一解决就拍屁股走人。博主深有体会,之前写了一篇《动易官方论坛的邀请码》,很多人拿到邀请码后连句谢谢都没有。博客本来就是一个交流的平台,失去了和用户的交互,那就没有任何意义了。所以,为了提升博客整体质量,需要屏蔽这部分访客。

那么接下来就说说实现“wordpress中限制没有Gravatar头像的访客提交评论”的具体方法:

2 判断是否具有Gravatar头像的函数

在functions.php中添加下面的函数,其作用是根据提交的email字段判断该留言者是否具有gravatar头像。还有种方法是通过http://www.gravatar.com/avatar/获取到头像文件的大小值是否为2637k来判断,具体方法大家可以参考《再议Gravatar头像缓存至本地服务器》中的代码。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
/*
 * @author:vfhky  2013年09月11日20:23
 * @param string $email       用户提交的表单中的email字段
 * @return int  0:无gravatar头像;  1:有gravatar头像
 **/
function vfhky_checkgravatar($email){
   $email_hash = md5(strtolower(trim($email)));
   $check_uri = 'http://www.gravatar.com/avatar/' . $email_hash . '?d=404';
   $headers = @get_headers($check_uri);
   if (!preg_match("|200|", $headers[0])) 
      return 0;
   else
      return 1;
}
3 在comments-ajax.php中调用判断函数

gravatar头像判断函数完成后,就可以在Willin Kan大神的comments-ajax.php文件中调用了。大概在该文件的90行处,在原代码中加入判断函数进行调用即可。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
/*
 * @author:vfhky  2013年09月11日20:30
 * @param string $comment_author_email  用户提交的表单中的email字段
 **/
if ( !$user->ID ) {
  if ( 6 > strlen($comment_author_email) || '' == $comment_author )
      err( __('提示:必须填写昵称及邮件。') );
  elseif ( !is_email($comment_author_email))
      err( __('提示:请输入一个有效的电子邮件地址。') );
  elseif (vfhky_checkgravatar($comment_author_email) == 0)
      err( __('请使用Gravatar头像留言。') );
}
4 后记

wordpress中限制没有Gravatar头像的访客提交评论

简单两步就实现了限制没有Gravatar头像的访客提交评论,最终效果如上图所示。当然,这个功能也可以用jquery实现。不过,一旦用户浏览器屏蔽了js,那么也就没效果了。所以,综合考虑还是用服务器端判断更为安全可靠,虽然增加了额外资源的消耗。

更新: UPDATE ON 2014-03-15 22:59

由于 羽中 童鞋对 get_headers 函数的效率提出质疑,于是另起文章来讨论下:《再议wordpress中限制没有Gravatar头像的访客提交评论》

打赏支持

Comments »