WordPress 默认使用 get_avatar() 函数获取的 Gravatar 头像,该函数的定义位于 wp-includes 文件夹下的 pluggable.php 中。然而默认的服务器对于国内环境可能不太稳定,不过 https 方式获取速度还可以,所以国内很多人采用 SSL 方式获取、当然也有本地化的或者从多说服务器获取的,目前我所使用的主题是使用 DUX 主题可自由切换“原有方式”、“从Gravatar官方ssl获取”、“从多说服务器获取”三种方式,却唯独缺了本地化获取的方式,心血来潮想要配置一下,同时也整理下相关的知识点。

从 Gravatar 官方ssl获取

//官方Gravatar头像调用ssl头像链接
function ssl_get_avatar($avatar) {
    $avatar = preg_replace('/.*\/avatar\/(.*)\?s=([\d]+)&.*/','<img src="https://secure.gravatar.com/avatar/$1?s=$2&d=mm" class="avatar avatar-$2" height="50" width="50">',$avatar);
    return $avatar;
}
add_filter('get_avatar', 'ssl_get_avatar');

从多说服务器获取

//多说官方Gravatar头像调用
function duoshuo_get_avatar($avatar) {
    $avatar = str_replace(array("www.gravatar.com", "0.gravatar.com", "1.gravatar.com", "2.gravatar.com"), "gravatar.duoshuo.com", $avatar);
    return $avatar;
}
add_filter('get_avatar', 'duoshuo_get_avatar', 10, 3);

本地化 Gravatar 头像

前面两段代码直接丢到主题的 functions.php 文件中即可。下面这段代码丢到 functions.php 文件中后,我们还需要在主题文件夹下新建一个名为 avatar 的文件夹并设置其权限为 755 即可。

// 本地化Gravatar 头像
function my_avatar($avatar) {
    $tmp = strpos($avatar, 'http');
    $g = substr($avatar, $tmp, strpos($avatar, "'", $tmp) - $tmp);        //获取头像原地址
    $tmp = strpos($g, 'avatar/') + 7;
    $f = substr($g, $tmp, strpos($g, "?", $tmp) - $tmp);        //获取头像文件名

    $srcset_tmp = strripos($avatar, 'http');
    $srcset_url = substr($avatar, $srcset_tmp, strpos($avatar, "2x", $srcset_tmp) - $srcset_tmp);
    $srcset_g = substr($avatar, $srcset_tmp, strpos($avatar, "'", $srcset_tmp) - $srcset_tmp);        //获取2x头像原地址
    $srcset_tmp = strpos($srcset_g, 'avatar/') + 7;
    $srcset_n = substr($srcset_g, $srcset_tmp, strpos($srcset_g, "?", $srcset_tmp) - $srcset_tmp);        //获取2x头像文件名
    $srcset_f = substr($srcset_g, $srcset_tmp, strpos($srcset_g, "2x", $srcset_tmp) - $srcset_tmp);

    $w = get_bloginfo('template_url');
    $e = get_template_directory() .'/avatar/'. $f .'.png';
    $srcset_e = get_template_directory() .'/avatar/'. $srcset_n .'_2x.png';
	
    $t = 30*24*60*60;        // 设置缓存有效期30天,单位:s

    if ( (!is_file($e) && !is_file($srcset_e)) || (time() - filemtime($e)) > $t ){
        copy(htmlspecialchars_decode($g), $e);
        copy($srcset_url, $srcset_e);
    }else{
        $avatar = strtr($avatar, array($g => $w.'/avatar/'.$f.'.png'));
        $avatar = strtr($avatar, array($srcset_g => $w.'/avatar/'.$srcset_n.'_2x.png 2x'));
    }

    if ( filesize($e) < 500 ) copy($w.'/img/avatar.png', $e);
    if ( filesize($srcset_e) < 1000) copy($w.'/img/avatar.png', $srcset_e);
    return $avatar;
}

add_filter('get_avatar','my_avatar')

以上代码来源于 DUX 主题及 wordpresshi

最后放上 get_avatar()  函数的相关官方文档,方便大家学习:

get_avatar:https://codex.wordpress.org/Function_Reference/get_avatar