早前我们就曾发布过一篇关于 WordPress中的Gravatar 头像无法访问的显示问题,也列出了几种具体解决方法。Gravatar 头像也是WordPress公司收购的产品。
其中方法一用的比较广泛:使用官方https的头像链接,目前这个https方式没被墙,速度也还不错,具体如下:
解决方法1:使用Gravatar的HTTPS(适用于任何主题):
在主题目录中,找到并打开 functions.php 文件,把以下代码复制放到该文件中:
// HackGravatatr
function liedun_get_ssl_avatar($avatar) {
$avatar = preg_replace('/.*\/avatar\/(.*)\?s=([\d]+)&.*/','<img src="https://secure.gravatar.com/avatar/$1?s=$2" class="avatar avatar-$2" height="$2" width="$2">',$avatar);
return $avatar;
}
add_filter('get_avatar', 'liedun_get_ssl_avatar');
但是,这个解决方法从WordPress 4.2 版开始,就出现了一个显示问题,就是头像图片比以前显示的大了一倍。经过相关技术研究发现,从WordPress4.2版开始,引入了scrset,srcset属性允许作者根据不同分辨率或不同的视窗尺寸提多个不同分辨图像。用户代理会根据之前获取的任何资源做选择,从而避免多个资源加载浪费带宽和相关性能问题。也就是可以根据屏幕密度显示对应尺寸的图片,比如正常的PC显示器默认设备像素比都是1,iphone6是2,iphone6 plus就是3。
WordPress4.2+的scrset定义的2x的,如果之前的代码获取的图片大小是50px,那么WordPress4.2版之后获取到scrset里面的图片大小就是100px了,这就是导致图片显示变大一倍的缘故。
该问题通过重写代码即可解决,新版代码(参考)如下:
// HackGravatatr
function liedun_get_ssl_avatar($avatar) {
if (preg_match_all(
'/(src|srcset)=["\']https?.*?\/avatar\/([^?]*)\?s=([\d]+)&([^"\']*)?["\']/i',
$avatar,
$matches
) > 0) {
$url = 'https://secure.gravatar.com';
$size = $matches[3][0];
$vargs = array_pad(array(), count($matches[0]), array());
for ($i = 1; $i < count($matches); $i++) {
for ($j = 0; $j < count($matches[$i]); $j++) {
$tmp = strtolower($matches[$i][$j]);
$vargs[$j][] = $tmp;
if ($tmp == 'src') {
$size = $matches[3][$j];
}
}
}
$buffers = array();
foreach ($vargs as $varg) {
$buffers[] = vsprintf(
'%s="%s/avatar/%s?s=%s&%s"',
array($varg[0], $url, $varg[1], $varg[2], $varg[3])
);
}
return sprintf(
'<img alt="avatar" %s class="avatar avatar-%s" height="%s" width="%s" />',
implode(' ', $buffers), $size, $size, $size
);
} else {
return false;
}
}
add_filter('get_avatar', 'liedun_get_ssl_avatar');