缓存 avatar 头像

/

最近 Gravatar 被墙了,导致原本就不快的站点访问速度愈加慢了,无奈,只有将 avatar 头像缓存到本地了。

function my_avatar($email, $size='48', $default='', $alt='') {
    $home = home_url();
    if (empty($default)) $default = $home . '/avatar/default.jpg';
    if (!empty($email)) {
        $hash = md5(strtolower(trim($email)));
        $headers = @get_headers('http://www.gravatar.com/avatar/' . $hash . '?d=404');
        if (!preg_match("|200|", $headers[0])) {
            $a = $home . '/avatar/default.jpg';
        } else {
            $file = ABSPATH .'avatar/'. $hash .'.jpg';
            $expire = 604800; 
            if ( !is_file($file) || (time() - filemtime($file)) > $expire ) {
                $rating = get_option('avatar_rating');
                $url = sprintf( "http://www.gravatar.com", (hexdec($hash{0})%2)). '/avatar/'. $hash. '?s='. $size . '&r='. $rating;
                copy($url, $file);
            }
            $a = $home . '/avatar/' . $hash . '.jpg';
        }
    } else {
        $a = $home . '/avatar/default.jpg';
    }
    $avatar = "<img title='{$alt}' alt='{$alt}' src='{$a}' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />";
    return apply_filters('my_avatar', $avatar, $email, $size, $default, $alt);
}

原理:检校用户的 Email,如果在 Gravatar 注册过,则缓存其头像至本地,如果没有注册过,则使用提供的默认头像。头像存放路径为站点根目录下的 avatar 目录。

最后,修改主题中调用 get_avatar 的地方,其中 get_avatar($comment, 48) 需改成 my_avatar($comment->comment_author_email, 48),因为 my_avatar 函数检校的是 Email。通常情况下,不建议直接修改主题,因为一旦升级主题,所有的修改都会丢失,建议新建子主题进行修改,同名函数子主题的优先级高于父主题。

一般来说,在进行上述 Hack 后,前台的 avatar 头像能正常显示了,但是后台仍在从 Gravatar 调用,可以加入另一段代码。

function my_avatar_admin($avatar) {
    $pos = strpos($avatar, 'http');
    $url = substr($avatar, $pos, strpos($avatar, "'", $pos) - $pos);
    $pos = strpos($url, 'avatar/') + 7;
    $hash = substr($url, $pos, strpos($url, "?", $pos) - $pos);
    $home = home_url();
    $file = ABSPATH .'avatar/'. $hash .'.jpg';
    if ( is_file($file) ) {
        $avatar = strtr($avatar, array($url => $home.'/avatar/'.$hash.'.jpg'));
    } else {
        $avatar = strtr($avatar, array($url => $home.'/avatar/default.jpg'));
    }
    return $avatar;
}
if (is_admin()) add_filter('get_avatar', 'my_avatar_admin');

原理:检测本地是否有已缓存的 avatar 头像文件,有则使用,没有则使用默认头像。

Comments