wordpress正确使用preg_replace正则更换gravatar源

wordpress使用 get_avatar() 可获取gravatar的通用头像,但国内经常性被封导致获取失败。

网上很多替换gravatar源的相关教程,比如:

add_filter('get_avatar', 'get_ssl_avatar');
function 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;
}

wordpress升级新版之后,函数 get_avatar() 生成的头像url更新如下:

<img alt="" src="http://cn.gravatar.com/avatar/e85a5e15b23b3026aeed28a20965463f?s=32&d=mm&r=g" srcset="http://cn.gravatar.com/avatar/e85a5e15b23b3026aeed28a20965463f?s=64&d=mm&r=g 2x" class="avatar avatar-32 photo" height="32" width="32">

如果仍然使用上述 get_ssl_avatar() 的正则表达式,获取的将是 srcset 的头像url,其中的头像大小值获取的就是srcset中的 64,而非自定义的 32,无论是后台用户头像显示,还是评论列表中的用户头像,都将固定显示64px,所以正则代码要修改!

add_filter('get_avatar', 'get_ssl_avatar');
function get_ssl_avatar($avatar) {
	preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $avatar, $matches);
	if( isset($matches[1])&&!empty($matches[1]) ){
		$avatar = preg_replace('/.*\/avatar\/(.*)\?s=([\d]+)&.*/', '<img src="https://secure.gravatar.com/avatar/$1?s=$2&d=mm&r=g" class="avatar avatar-$2" height="$2" width="$2">', $matches[1][0]);
	}
	return $avatar;
}