「自动头像」启用后,get_avatar 过滤器会把所有 Gravatar 家族的 URL 都换成本地生成的头像。问题在于:本站在 WordPress 用户表里已注册的用户,即使他们自己有头像(Gravatar 或者站内上传的),也被一并换掉了,看起来就像是全站所有人都成了同一套卡通脸。
get_avatar
用户诉求(原意):邮箱能在本站用户表里查到的,说明这个人是本站用户,就用他自己的头像;查不到的(匿名评论者)才用生成的。
inc/theme-avatar.php 的 yang_avatar_filter():
inc/theme-avatar.php
yang_avatar_filter()
if (!yang_avatar_is_gravatar_url($old_src)) { return $avatar; // 不是 Gravatar 家族 → 放行 } $email = yang_avatar_email_of($id_or_email); if ($email === '') { return $avatar; // 没邮箱 → 放行 } // ↓ 这里之后无条件替换,**完全不看这个邮箱是不是本站用户** $svg = yang_avatar_svg($email, '', $px);
也就是说:判断只到「是不是 Gravatar 家族」和「有没有邮箱」两层,缺了「这个邮箱属不属于本站注册用户」这一层。
在替换之前加一层判断:邮箱对应本站注册用户时,原样返回 $avatar,不做任何替换。
$avatar
要处理的边界:
$id_or_email
WP_User
data:
/theme-update/
已实现并发布到 3.2.39(代码提交 203721b)。
给头像过滤器加了一层「先查本站用户表」的判据,顺序如下:
get_user_by('email')
后台新增一个开关「注册用户保留原头像」,默认开启。关掉就退回 3.2.38 的行为(所有人都换)。
你选的是「注册用户自己也没真头像时,给他生成」。但这一条在服务端做不到,原因:
get_avatar()
而这个功能从立项起就定了零外网调用的硬约束(发布脚本会断言包里不含 curl / wp_remote_get / fsockopen / file_get_contents,防止有人偷偷联网)。
所以最终做法是:只要是注册用户就不动。代价是「注册了但没上传过头像」的人,头像仍然是那张灰人像,不会被换成卡通脸。这个取舍已经写进后台开关的说明文字里。
如果你宁可打破零外网约束也要给这类人生成,那需要单独开工单 —— 那会带来隐私(给第三方发送访客邮箱)和性能(每个头像一次外网请求)两个新问题,不是小改动。
update.json
No dependencies set.
The note is not visible to the blocked user.
现象
「自动头像」启用后,
get_avatar过滤器会把所有 Gravatar 家族的 URL 都换成本地生成的头像。问题在于:本站在 WordPress 用户表里已注册的用户,即使他们自己有头像(Gravatar 或者站内上传的),也被一并换掉了,看起来就像是全站所有人都成了同一套卡通脸。用户诉求(原意):邮箱能在本站用户表里查到的,说明这个人是本站用户,就用他自己的头像;查不到的(匿名评论者)才用生成的。
现状代码
inc/theme-avatar.php的yang_avatar_filter():也就是说:判断只到「是不是 Gravatar 家族」和「有没有邮箱」两层,缺了「这个邮箱属不属于本站注册用户」这一层。
需要做的事
在替换之前加一层判断:邮箱对应本站注册用户时,原样返回
$avatar,不做任何替换。要处理的边界:
$id_or_email本身已经是WP_User对象或用户 ID 时,直接判定为注册用户,不必再查表验收标准
$avatar字符串一字不改)data:URI → 行为不变(放行)备注
/theme-update/通道,不覆盖服务器主题目录。已实现并发布到 3.2.39(代码提交 203721b)。
做了什么
给头像过滤器加了一层「先查本站用户表」的判据,顺序如下:
get_user_by('email'))→ 原样返回,一个字都不改后台新增一个开关「注册用户保留原头像」,默认开启。关掉就退回 3.2.38 的行为(所有人都换)。
有一个服务端无法回避的限制,需要你知道
你选的是「注册用户自己也没真头像时,给他生成」。但这一条在服务端做不到,原因:
get_avatar()只负责拼 URL 交给浏览器,它从不检查图上到底有没有内容而这个功能从立项起就定了零外网调用的硬约束(发布脚本会断言包里不含 curl / wp_remote_get / fsockopen / file_get_contents,防止有人偷偷联网)。
所以最终做法是:只要是注册用户就不动。代价是「注册了但没上传过头像」的人,头像仍然是那张灰人像,不会被换成卡通脸。这个取舍已经写进后台开关的说明文字里。
如果你宁可打破零外网约束也要给这类人生成,那需要单独开工单 —— 那会带来隐私(给第三方发送访客邮箱)和性能(每个头像一次外网请求)两个新问题,不是小改动。
验证
发布
update.json已指向 3.2.39,zip 与 readme 均 200