前引
在本博客使用的过程中突然注意到了头像不加载的问题,然后博客搭建时并没有出现这个问题,此时也以为是重新搭建的过程中遗忘了配置切换国内镜像cavatar,就在网上找了些教程,结果不尽人意,都没有解决这个办法。
那么就手动进行排查
过程
首先登录cravatar发现没有问题。

测试下md5查看,加载也没有问题。


既然不是cravatar的问题,就只剩下博客本身的问题。
查看网络流量分析是否成功切换cravatar镜像。

很好,成功切换到镜像,但是md5格式不对,如图:

这里是64位,而md5的长度是32位,所以头像加载失败,显而易见是有关邮箱名的加密算法出现了错误。而根据cmd5加密结果中可以判断出使用的算法是sha256算法。

经过了诸多(可能插件及主题)针对头像及邮箱名处理函数的排查,均无收获,最后在搜索引擎中查看到了以下内容:

在24年的年初,gravatar更换了加密算法为sha256,而wordpress也在6.8进行了更新。
故:问题找到,而在前面cravatar检测成功的是使用md5算法,所以可以猜测cravatar并没有做出对应的兼容。
那么对于头像处理部分的代码也相对应更改为强制使用md5算法即可。
如下,成功解决:

解决代码
在主题文件编译器 ->functions.php添加以下代码:
// 正确的 Cravatar 标准实现(只认 MD5,不认 SHA256)
function get_cravatar_url( $url ) {
// 1. 先提取邮箱,重新生成 MD5(这是核心修复!)
if ( preg_match('/avatar\/([a-f0-9]{32,64})/', $url, $matches) ) {
$hash = $matches[1];
$hash_length = strlen($hash);
// 关键修复:如果检测到 SHA256(64位),必须转回 MD5
if ( $hash_length === 64 ) {
// 这里需要一个能从 hash/email 反查邮箱的机制
// 最简单的方案:交给另一个钩子去处理(见下方)
// 或者直接使用过滤器的第二个参数 $id_or_email
}
}
// 2. 域名替换(切换国内镜像)
$sources = array(
'www.gravatar.com', '0.gravatar.com', '1.gravatar.com',
'2.gravatar.com', 'secure.gravatar.com', 'cn.gravatar.com',
'gravatar.com'
);
return str_replace( $sources, 'cravatar.cn', $url );
}
add_filter( 'get_avatar_url', 'get_cravatar_url', 1, 2 ); // 注意增加参数数量
// 核心修复:强制将 SHA256 转为 MD5(Cravatar 官方标准)
add_filter( 'get_avatar_url', function( $url, $id_or_email ) {
// 只处理我们替换为 cravatar.cn 的 URL
if ( strpos( $url, 'cravatar.cn' ) === false ) {
return $url;
}
// 获取邮箱
$email = null;
if ( is_numeric( $id_or_email ) ) {
$user = get_userdata( $id_or_email );
$email = $user->user_email ?? '';
} elseif ( is_object( $id_or_email ) && isset( $id_or_email->comment_author_email ) ) {
$email = $id_or_email->comment_author_email;
} elseif ( is_string( $id_or_email ) && is_email( $id_or_email ) ) {
$email = $id_or_email;
}
// 如果能获取到邮箱,强制使用 MD5
if ( ! empty( $email ) ) {
$md5 = md5( strtolower( trim( $email ) ) );
// 用正则替换掉 URL 中的 hash 部分
$url = preg_replace( '/avatar\/[a-f0-9]{32,64}/', 'avatar/' . $md5, $url );
}
return $url;
}, 999, 2 );
/* 下面为原代码部分,于此供参考上述代码存放位置 */
if ( ! function_exists( 'set_defaults_for_cravatar' ) ) {
/**
* 替换 WordPress 讨论设置中的默认头像
*/ function set_defaults_for_cravatar( $avatar_defaults ) {
$avatar_defaults['gravatar_default'] = 'Cravatar 标志';
return $avatar_defaults;
}
add_filter( 'avatar_defaults', 'set_defaults_for_cravatar', 1 );
}
if ( ! function_exists( 'set_user_profile_picture_for_cravatar' ) ) {
/**
* 替换个人资料卡中的头像上传地址
*/ function set_user_profile_picture_for_cravatar() {
return '您可以在 Cravatar 修改您的资料图片';
}
add_filter( 'user_profile_picture_description', 'set_user_profile_picture_for_cravatar', 1 );
}
测试评论1