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; }