概要

Gravatar头像服务应用广泛,但是由于其服务器在国外,导致加载很慢,以至于拖垮了网站的速度。当然可以选择使用cn.gravatar.comsecure.gravatar.com,国内也有不少公共Gravatar的加速镜像,如下,可以选择使用,本文使用七牛云搭建自己的Gravatar镜像站。

  • gravatar.loli.net
  • sdn.geekzu.org
  • cdn.v2ex.com

七牛镜像加速Gravatar

打开七牛云控制台,新建空间,设置镜像回源,URL参数建议选择保留,这样的话,给头像连接加上?d=404 时,当用户没有配置过Gravatar头像的用户就不是Gravatar的默认头像,而是可以返回404错误,方便下一步给用户使用自己配置的随机头像。(不需要随机头像的可以不打开,这样用户没配置现实的就是Gravatar默认的头像)

配置好镜像加速,可以再给七牛云存储配置上cdn加速域名。

为没有配置Gravatar使用自定义的随机头像

参考的 https://www.inlojv.com/5459.html 的代码,根据自己的情况做了点小修改。

因为我的网站使用起来有点问题,主页管理员头像获取的时候,没有从用户ID获取到邮箱,所以增加了判断。

普通主题只需要将下列代码添加到function.php即可,我用的主题reVival采用的是插件的形式,新建文件夹作为插件目录,新建index.php文件,将代码添加到文件中,然后将插件文件夹添加到主题插件文件夹pandastudio_plugins 中。


add_filter( 'get_avatar' , 'xgblack_custom_avatar' , 10 , 5 );
function xgblack_custom_avatar( $avatar, $id_or_email, $size, $default, $alt) {

    global $comment,$current_user;

    // $id_or_email的值:后台右上角登录用户头像为id,其他为邮箱,下面做一个判断
    $current_email =  is_int($id_or_email) ? get_user_by( 'ID', $id_or_email )->user_email : $id_or_email;

    $email = !empty($comment->comment_author_email) ? $comment->comment_author_email : $current_email ;

    $random_avatar_arr = array(
        '//file.blog.xgblack.cn/wp-content/uploads/2020/02/bae7d9a8e875ccfbcc7d1bffd4a0eaa0.jpg?x-oss-process=image/auto-orient,1/resize,m_lfit,w_150',
        '//file.blog.xgblack.cn/wp-content/uploads/2020/01/939e9bfd28fb9f427530ba239daf1d1e.jpg?x-oss-process=image/auto-orient,1/resize,m_lfit,w_150',
        '//file.blog.xgblack.cn/wp-content/uploads/2020/01/9557260f3d24ecc8ca38186477e9afd7.jpg?x-oss-process=image/auto-orient,1/resize,m_lfit,w_150',
        '//qn.img.xgblack.cn/blog/avatar/1615013142603.jpg?imageView2/5/w/150/h/150/q/75|imageslim',
        '//qn.img.xgblack.cn/blog/avatar/1615013178602.jpg?imageView2/5/w/150/h/150/q/75|imageslim',
        '//qn.img.xgblack.cn/blog/avatar/1615013265486.jpg?imageView2/5/w/150/h/150/q/75|imageslim',
        '//qn.img.xgblack.cn/blog/avatar/1615013265497.jpg?imageView2/5/w/150/h/150/q/75|imageslim',
        '//qn.img.xgblack.cn/blog/avatar/1615013265506.jpg?imageView2/5/w/150/h/150/q/75|imageslim',
        '//qn.img.xgblack.cn/blog/avatar/1615013265514.jpg?imageView2/5/w/150/h/150/q/75|imageslim',
        '//qn.img.xgblack.cn/blog/avatar/1615013265523.jpg?imageView2/5/w/150/h/150/q/75|imageslim',
        '//qn.img.xgblack.cn/blog/avatar/1615013265536.jpg?imageView2/5/w/150/h/150/q/75|imageslim',
        '//qn.img.xgblack.cn/blog/avatar/1615013383480.jpg?imageView2/5/w/150/h/150/q/75|imageslim',
        '//qn.img.xgblack.cn/blog/avatar/1615013383493.jpg?imageView2/5/w/150/h/150/q/75|imageslim',
        '//qn.img.xgblack.cn/blog/avatar/1615013383505.jpg?imageView2/5/w/150/h/150/q/75|imageslim',
        '//qn.img.xgblack.cn/blog/avatar/1615013383519.jpg?imageView2/5/w/150/h/150/q/75|imageslim',
        '//qn.img.xgblack.cn/blog/avatar/1615013383534.jpg?imageView2/5/w/150/h/150/q/75|imageslim'
    );

    //管理员默认头像
    $admin_avatar = '//file.blog.xgblack.cn/wp-content/uploads/2020/02/cropped-XG002.png?x-oss-process=image/auto-orient,1/resize,m_lfit,w_150';

    //判断是否为空(当邮箱被后台清空时,猜测邮箱默认为整型的1)
    //防止在页面上产生warning
    if (empty($email) || $email == 1) {
        $email = 'xxx@xxx.com';
    }

    $email_hash = md5(strtolower(trim($email)));

    $random_avatar = array_rand($random_avatar_arr,1);

    $src = $random_avatar_arr[$random_avatar] ;

    //gravatar加速镜像

    //gravatar.loli.net
    //secure.gravatar.com
    //sdn.geekzu.org
    //cn.gravatar.com
    //cdn.v2ex.com
   //可以使用上边的公共镜像,也可以在下面配置自己的加速镜像
    $gravatar_image_url = 'secure.gravatar.com';


    // 提示:d参数404 onerror 方法 - 速度最快
    $avatar = "<img alt='{$alt}' src='//{$gravatar_image_url}/avatar/{$email_hash}?d=404' onerror='javascript:this.src=\"{$src}\";this.onerror=null;' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />";

    // 提示:d参数default_img 方法 - 速度稍逊
    //$src = urlencode( $src );
    //$avatar = "<img alt='{$alt}' src='//{$gravatar_image_url}/avatar/{$email_hash}?d={$src}' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />";



    //可以根据自己的情况将这个if判断注释掉
    if (strcasecmp($email, '我的管理员邮箱1') == 0 || strcasecmp($email, 'xxxxxx@xgblack.cn') == 0 || strcasecmp($email, '我的管理员用户ID') == 0 || strcasecmp($email_hash, '我的管理员用户ID生成的md5值') == 0) {
        //管理员
        $avatar = "<img alt='{$alt}' src='{$admin_avatar}'  class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />";
    }


    return $avatar;
}