Typecho 替换 Gravatar 为 CNGravatar 完整方案
针对 Typecho 博客系统替换 Gravatar 为国内可访问的 CNGravatar (cravatar.cn) 的完整解决方案:
方案概述
- 替换默认的 Gravatar 地址为 cravatar.cn 镜像
- 保持原有函数接口不变,只修改底层实现
- 确保向后兼容
修改步骤
方法一:直接修改核心文件(推荐)
修改 /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;
}
测试验证
修改后,你可以通过以下方式测试是否生效:
- 查看博客评论区的用户头像
- 查看后台管理员头像
- 使用浏览器开发者工具检查图片实际加载地址是否为
cravatar.cn
注意事项
- 修改核心文件前请先备份
- 如果使用CDN服务,可能需要刷新缓存
- CNGravatar 是 Gravatar 的镜像服务,数据同步可能有延迟
- 如果用户之前没有 Gravatar 头像,可能需要重新注册
其他优化建议
- 本地缓存:可以考虑将头像缓存到本地服务器或CDN,减少对外部服务的依赖
- 懒加载:为头像添加懒加载属性提高页面性能
- 备用方案:在主题中添加备用头像显示逻辑
需要任何部分的更详细实现或遇到具体问题,可以告诉我,我会提供更针对性的帮助。