WordPress显示QQ头像,以前觉得好玩,在Gravatar缓存多的基础上又增加了QQ的头像缓存,Gravatar 頭像和QQ头像緩存Gravatar -QQ头像緩存(更新)两篇文章。以前是用“网站地址” 检测QQ号,觉得影响隐私,加上很难获取到QQ的自定义头像(腾讯没有接口),所以就放弃了。

最近又有博友问起,我找了几种实现方法,觉得Hacklog的方法不错,拿过来修改了一下:

使用方法,只需要在邮箱那里填写QQ号+QQ.com.现在实现的功能:

访客填写的邮箱地址,如果是以QQ.com/VIP.QQ.com/FOXMAIL.com结尾的邮箱,并且前面是数字的(即QQ号码),加载QQ头像,并缓存。

访客网址部分填写的url如果是以纯数字开头,判断为QZONE(当然会有误判,但很少),获取号码,也显示QQ头像,并缓存。

其它情况,获取Gravatar头像缓存。

这样做避免了输入QQ号码泄漏的问题,你看源代码也没关系。因为我是直接调用的缓存头像,参数是邮箱地址,经过MD5加密。

代码还是一样,加在function.php里面:

<?php
function my_avatar( $avatar, $id_or_email ) {
 $email = '';
    $url='';
    if ( is_numeric($id_or_email) ) {
        $id = (int) $id_or_email;
        $user = get_userdata($id);
        if ( $user )
            $email = $user->user_email;
    } elseif ( is_object($id_or_email) ) {
        if ( isset($id_or_email->comment_type) && '' != $id_or_email->comment_type && 'comment' != $id_or_email->comment_type )
            return false; // No avatar for pingbacks or trackbacks

        if ( !empty($id_or_email->user_id) ) {
            $id = (int) $id_or_email->user_id;
            $user = get_userdata($id);
            if ( $user)
                $email = $user->user_email;
        } elseif ( !empty($id_or_email->comment_author_email) )
        {
            $email = $id_or_email->comment_author_email;
            $url=$id_or_email->comment_author_url;
        }
    } else {
        $email = $id_or_email;
    }
$f = md5(strtolower($email));
$w = get_bloginfo('wpurl');
$e = ABSPATH.'/wp-content/avatar/'. $f .'.jpg';//缓存路径777权限
$t = 1209600; //設定14天, 單位:秒
//如果博客是Qzone或者邮箱以QQ邮箱结尾的 ,就用QQ头像。   
if ( !empty($url) && preg_match('/^(http:\/\/)?[1-9][0-9]*[\.a-zA-Z\/]+$/i', $url) ||  preg_match('/^[1-9][0-9]*@qq\.com$/i', $email) ||  preg_match('/^[1-9][0-9]*@foxmail\.com$/i', $email) ||  preg_match('/^[1-9][0-9]*@vip\.qq\.com$/i', $email))
 {
     $qq_face_url = 'http://face7.qun.qq.com/cgi/svr/face/getface?&uin=%s';
//QQ头像地址, %s表示QQ号
        $qq = preg_replace('|\D*|', '', $url);
        if(!$qq)
            $qq = preg_replace('|\D*|', '', $email);
$g = str_replace('%s', $qq, $qq_face_url);

  }
 else
 {
//否则就用gravatar头像(缓存)
$tmp = strpos($avatar, 'http');
$g = substr($avatar, $tmp, strpos($avatar, "'", $tmp) - $tmp);
}
if ( !is_file($e) || (time() - filemtime($e)) > $t ){
copy($g, $e); //當頭像不存在或文件超過14天才更新
@chmod($e,0777);
}
if ( filesize($e) < 500 ) {
@copy($w.'/wp-content/avatar/default.jpg', $e);
@chmod($e,0777);
}
$out = $w.'/wp-content/avatar/'.$f.'.jpg';
$avatar = preg_replace('/src=\'[^\']*\'/', 'src=\''.$out. '\'',  $avatar);

return $avatar;
}
add_filter('get_avatar', 'my_avatar' ,10 ,2); 

其实我觉得意义不大,放出来给需要的TX参考,没啥技术。

注意:请勿在本站测试,我没用使用这段代码,只在本地测试有用。不保证没有bug,已知问题是很大程度上不能显示QQ自定义头像,请看看前面两篇文章

如果你使用了这段代码,并觉得有用,欢迎留言提供地址,做个示例。

  1. 阿邙 (2010.06.14 at 19:20) ☆沙发

    动态QQ头像 缓存后会变静态么?

    • winy() (2010.06.14 at 19:21)

      @阿邙 除非是会员,没有找到动态QQ头像的接口。

    • 阿邙 (2010.06.14 at 19:37)

      @winy 刚提交评论的时候出现了错误。。
      你在折腾么?

    • winy() (2010.06.14 at 19:40)

      @阿邙 嗯,刚弄完ajax评论翻页

    • 阿邙 (2010.06.14 at 19:42)

      @winy 哇 我找地方翻一翻去 :grin:

  2. 万戈 (2010.06.15 at 08:17) 板凳

    这个很好,先收藏,以前你写的两个方法我就已经参考过了,不错不错

  3. willin (2010.06.16 at 22:10) 地板

    我還是不贊成用 qq 頭像, 申請 gravatar 已經很方便.

    • winy() (2010.06.16 at 22:17)

      @willin 是的,我也没用,只是国内QQ用户太多啦

  4. Ben (2010.10.25 at 16:35) 4楼

    如果新增一个选项填入QQ,这样会不会很麻烦?

    • winy() (2010.10.25 at 21:40)

      @Ben
      是比较麻烦,因为你得用个数据库表来保存QQ号,另外需要修改wp原文件

    • Ben (2010.10.25 at 21:56)

      @winy , 将QQ号的数据存储在表单,然后用cookies来作为记录?
      如果能直接通过对QQ号的判断来显示头像应该会有很大的便利。

    • winy() (2010.10.25 at 22:00)

      @Ben
      问题关键是QQ没有头像api,偶尔用群空间头像能弄出来,自定义头像基本不可能。。还不稳定

  5. 奚少 (2010.12.17 at 18:00) 5楼

    我想请教一下,关于你的评论框上边的一排比如表情、格式等,如何让隐藏,然后在点击评论狂的时候才出现?

    • winy() (2010.12.17 at 23:24)

      @奚少
      简单,直接css隐藏,点击评论框用js渐显而已,伪装ajax载入

  6. Toe Shoes (2011.05.16 at 16:09) 6楼

    很漂亮的空间

发布评论

邮箱(必填)

换个背景