Typecho 替换 Gravatar 为 CNGravatar 完整方案 - Winmax Music

针对 Typecho 博客系统替换 Gravatar 为国内可访问的 CNGravatar (cravatar.cn) 的完整解决方案:

方案概述

  1. 替换默认的 Gravatar 地址为 cravatar.cn 镜像
  2. 保持原有函数接口不变,只修改底层实现
  3. 确保向后兼容

修改步骤

方法一:直接修改核心文件(推荐)

修改 /var/Typecho/Common.php 文件:

找到 gravatarUrl 方法(约在 900 行附近),替换为:

public static function gravatarUrl($mail, $size, $rating, $default, $isSecure = false)
{
    if (defined('__TYPECHO_GRAVATAR_PREFIX__')) {
        $url = __TYPECHO_GRAVATAR_PREFIX__;
    } else {
        $url = 'https://cravatar.cn/avatar/';
    }
    
    $url .= md5(strtolower(trim($mail)));
    $url .= '?s=' . $size;
    $url .= '&r=' . $rating;
    $url .= '&d=' . $default;
    
    return $url;
}

方法二:通过插件方式(无需修改核心文件)

创建插件文件 /usr/plugins/CnGravatar/Plugin.php

<?php
class CnGravatar_Plugin implements Typecho_Plugin_Interface
{
    public static function activate()
    {
        Typecho_Plugin::factory('Typecho_Common')->gravatarUrl = array('CnGravatar_Plugin', 'gravatarUrl');
    }
    
    public static function deactivate() {}
    
    public static function config(Typecho_Widget_Helper_Form $form) {}
    
    public static function personalConfig(Typecho_Widget_Helper_Form $form) {}
    
    public static function gravatarUrl($mail, $size, $rating, $default, $isSecure = false)
    {
        $url = 'https://cravatar.cn/avatar/';
        $url .= md5(strtolower(trim($mail)));
        $url .= '?s=' . $size;
        $url .= '&r=' . $rating;
        $url .= '&d=' . $default;
        
        return $url;
    }
    
    public static function render() {}
}

然后在后台启用 "CnGravatar" 插件即可。

方法三:通过主题 functions.php 修改

如果你不想修改核心文件也不想用插件,可以在当前主题的 functions.php 中添加:

function themeInit($archive)
{
    require_once 'libs/CnGravatar.php';
}

然后创建 libs/CnGravatar.php

<?php
Typecho_Common::gravatarUrl = function($mail, $size, $rating, $default, $isSecure = false) {
    $url = 'https://cravatar.cn/avatar/';
    $url .= md5(strtolower(trim($mail)));
    $url .= '?s=' . $size;
    $url .= '&r=' . $rating;
    $url .= '&d=' . $default;
    
    return $url;
};

可选配置

1. 修改默认头像风格

CNGravatar 支持的默认头像类型(d=参数):

  • mp: 神秘人
  • identicon: 几何图案
  • monsterid: 小怪物
  • wavatar: 卡通脸
  • retro: 像素风
  • robohash: 机器人
  • blank: 透明图

修改方法:在调用 gravatarUrl 时修改 $default 参数,或直接修改上述代码中的默认值。

2. 多级回退策略增强版

如果你想要更健壮的回退机制(CNGravatar → QQ头像 → 本地默认),可以使用:

public static function gravatarUrl($mail, $size, $rating, $default, $isSecure = false)
{
    // 尝试CNGravatar
    $url = 'https://cravatar.cn/avatar/';
    $url .= md5(strtolower(trim($mail)));
    $url .= '?s=' . $size;
    
    // 如果邮箱是QQ邮箱,尝试获取QQ头像
    if (preg_match('/^(\d+)@qq\.com$/i', $mail, $matches)) {
        $qq = $matches[1];
        return "https://q1.qlogo.cn/g?b=qq&nk=$qq&s=$size";
    }
    
    // 默认头像回退
    $url .= '&d=' . $default;
    
    return $url;
}

测试验证

修改后,你可以通过以下方式测试是否生效:

  1. 查看博客评论区的用户头像
  2. 查看后台管理员头像
  3. 使用浏览器开发者工具检查图片实际加载地址是否为 cravatar.cn

注意事项

  1. 修改核心文件前请先备份
  2. 如果使用CDN服务,可能需要刷新缓存
  3. CNGravatar 是 Gravatar 的镜像服务,数据同步可能有延迟
  4. 如果用户之前没有 Gravatar 头像,可能需要重新注册

其他优化建议

  1. 本地缓存:可以考虑将头像缓存到本地服务器或CDN,减少对外部服务的依赖
  2. 懒加载:为头像添加懒加载属性提高页面性能
  3. 备用方案:在主题中添加备用头像显示逻辑

需要任何部分的更详细实现或遇到具体问题,可以告诉我,我会提供更针对性的帮助。

标签: none



没事发点牢骚,评论几句?!Nothing to complain about, comment a few words.