解决cravatar头像不加载

前引

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

那么就手动进行排查

过程

首先登录cravatar发现没有问题。

image-20260211232725969

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

image-20260212000052561
image-20260212000035276

既然不是cravatar的问题,就只剩下博客本身的问题。

查看网络流量分析是否成功切换cravatar镜像。

image-20260211233115534

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

image-20260211233240708

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

image-20260212000212021

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

image-20260211233900761

在24年的年初,gravatar更换了加密算法为sha256,而wordpress也在6.8进行了更新。

故:问题找到,而在前面cravatar检测成功的是使用md5算法,所以可以猜测cravatar并没有做出对应的兼容。

那么对于头像处理部分的代码也相对应更改为强制使用md5算法即可。

如下,成功解决:

image-20260211234920639

解决代码

在主题文件编译器 ->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 );
}
觉得有帮助可以投喂下博主,感谢!

作者:JingY

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0协议

转载请注明文章地址及作者

评论

  1. 博主
    7 小时前
    2026-2-12 0:08:17

    测试评论1

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇