Yily-OSS-Sync
上传图片到媒体库时,自动同步到阿里云OSS;删除媒体库文件时,同步删除OSS文件。 保留本地文件以保证站点性能,OSS作为CDN源站或备份存储。
Install
No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:
wp plugin install https://github.com/zuoyunlai/yily-oss-sync/archive/refs/heads/main.zipReadme
阿里云OSS同步插件
WordPress 媒体库图片自动同步到阿里云OSS,支持本地操作与OSS双向同步。
功能特性
- ✅ 上传同步:媒体库上传图片时自动上传到OSS,保持原路径结构
- ✅ 删除同步:从媒体库删除图片时自动从OSS删除对应文件
- ✅ 缩略图同步:上传时同步所有尺寸的缩略图
- ✅ 批量同步:一键将现有媒体库全部同步到OSS
- ✅ CDN加速:可配置CDN域名,图片链接自动替换为CDN地址
- ✅ 状态记录:每张图片同步状态记录在元数据中
- ✅ 后台运行:批量同步在后台异步执行,不卡页面
- ✅ 零依赖:原生PHP HTTP实现,无需安装composer或SDK
安装步骤
1. 上传插件
上传插件目录 zuoyunlai-oss-sync/ 到 WordPress 的 wp-content/plugins/ 目录
2. 在WordPress后台激活插件
后台 → 插件 → 找到"阿里云OSS同步插件" → 启用
3. 配置OSS
- 后台 → 设置 → OSS同步
- 填写阿里云 AccessKey ID / Secret
- 填写 Bucket 名称和 Endpoint
- 保存设置(系统会自动验证连接)
4. 阿里云OSS控制台设置
CORS跨域规则(必须):
- 对象存储 → 选择Bucket → 数据安全 → 跨域设置
- 添加规则:
- Allowed Origin:
https://www.zuoyunlai.com(你的域名) - Allowed Methods:GET, PUT, POST, DELETE, HEAD
- Allowed Headers:
* - Expose Headers:ETag
- Max Age:3600
- Allowed Origin:
Bucket权限:
- 媒体文件建议设为公共读
- 如需防盗链,在"防盗链"设置中白名单你的CDN域名
5. 批量同步现有图片(可选)
在设置页面点击「立即批量同步到OSS」,将现有媒体库图片同步到OSS
配置说明
| 配置项 | 说明 | 示例 |
|---|---|---|
| 开启同步 | 勾选后启用自动同步 | ✅ 开启 |
| AccessKey ID | RAM账号AccessKey ID | LTAI5tXXXXXXXXXXXXXXXX |
| AccessKey Secret | RAM账号密码 | xxxxxxxx |
| Bucket | OSS Bucket名称 | my-images |
| Endpoint | Bucket地域节点(无https://前缀) | oss-cn-hangzhou.aliyuncs.com |
| 保存路径前缀 | OSS存储路径前缀 | wp-content/uploads/ |
| CDN加速域名 | 留空用OSS原生地址 | https://cdn.example.com |
存储路径结构
OSS Bucket/
└── wp-content/uploads/ ← 前缀
└── 2026/
└── 05/
├── image.jpg ← 原图
├── image-150x150.jpg ← 缩略图
└── image-300x200.jpg ← 中等尺寸
CDN工作原理
用户访问图片
↓
WordPress输出URL: https://cdn.example.com/wp-content/uploads/2026/05/image.jpg
↓
CDN节点(缓存命中则直接返回)
↓
未命中 → 回源到OSS → 返回给用户并缓存
媒体库元数据
插件在每张图片附件中保存以下元数据:
_zoss_sync_status:同步状态(synced/failed)_zoss_oss_key:OSS存储路径(如wp-content/uploads/2026/05/image.jpg)_zoss_oss_url:OSS访问地址(含CDN域名)
钩子(Hooks)
// 上传到OSS前拦截(返回false则跳过本次OSS上传)
add_filter('zoss_before_upload', function($file_path, $oss_key) {
// $file_path: 本地文件完整路径
// $oss_key: OSS存储路径
return true; // return false to skip
}, 10, 2);
// 上传OSS成功后回调
add_action('zoss_upload_success', function($attachment_id, $oss_key, $oss_url) {
// your code
}, 10, 3);
// 从OSS删除前回调
add_action('zoss_before_delete', function($oss_key) {
// your code
}, 10, 1);
常见问题
Q: 提示"连接测试失败"?
A: 检查:1) AccessKey/Secret是否正确;2) Bucket名称是否匹配;3) Endpoint是否正确(结尾无https://);4) 该RAM账号是否有OSS读写权限
Q: 上传成功但OSS上看不到文件?
A: 检查Bucket的Endpoint是否与实际地域匹配。如Bucket在杭州,Endpoint不能写北京:oss-cn-hangzhou.aliyuncs.com
Q: 如何确认图片已同步到OSS?
A: 查看媒体库中该图片的元数据,_zoss_sync_status 应为 synced
Q: 开启CDN后图片不显示? A: 1) 检查CDN是否已绑定OSS Bucket;2) 检查CDN控制台的回源HOST设置;3) 检查CDN的CORS设置
文件结构
zuoyunlai-oss-sync/
├── zuoyunlai-oss-sync.php # 主插件文件
├── composer.json # 依赖配置(无需composer)
├── README.md # 说明文档
└── includes/
├── class-oss-handler.php # OSS操作类(原生HTTP)
└── class-admin-settings.php # 后台设置页面
技术说明
插件使用阿里云OSS REST API(兼容AWS S3签名V4),直接通过PHP cURL发送签名请求, 无需安装阿里云官方SDK,更加轻量和可靠。