同一张原图在缩略图、中图和大图中使用不同水印,核心不是“装两个水印插件”,而是为每个派生尺寸定义可重复的图片处理策略。原文推荐的 Awesome Watermark 已多年没有维护,不适合继续作为生产方案。
先说明旧插件现状
WordPress.org 当前信息显示,Awesome Watermark 仍停留在 1.0,最后更新于 2015 年,测试版本也停留在 WordPress 4.2 系列。它可以作为历史实现参考,但在现代 WordPress 与 PHP 环境中直接启用存在兼容和安全风险。
不要因为它“恰好支持多个尺寸”就跳过源码审计、暂存测试和备份。
正确拆分需求
先确认以下规则:
- 原始上传文件是否必须保持无水印。
- 哪些 WordPress 图片尺寸用于哪些页面。
- 每个尺寸的水印图片、边距、透明度和位置。
- 旧图片是否需要批量重新生成。
- 删除水印后能否从原图重新生成干净版本。
- CDN、对象存储和本地媒体库谁是派生图事实源。
- GIF、SVG、WebP、AVIF 和带透明通道图片如何处理。
建议始终保留原图。水印应施加在派生图或交付副本上,否则规则变化后只能从备份恢复。
方案一:对象存储或图片 CDN 动态处理
如果图片已经使用支持样式处理的对象存储/CDN,可以为缩略图、中图和大图建立命名样式:
avatar-thumb-watermark
product-card-watermark
product-detail-watermark
模板只请求对应样式 URL。优点是:
- 原图保持不变。
- 修改规则后无需重新上传所有媒体。
- 转码、缩放和水印可以在一次处理链完成。
- 更容易限制输出尺寸并缓存。
需要确认签名、防盗链、缓存失效和供应商迁移策略。不要在前端公开包含管理权限的签名密钥。
方案二:上传后生成派生文件
WordPress 可先注册业务尺寸:
<?php
add_action(
'after_setup_theme',
function (): void {
add_image_size(
'product-card',
640,
640,
true
);
add_image_size(
'product-detail',
1600,
1200,
false
);
}
);
随后由经过审计的图片处理模块,在附件元数据生成后对指定派生文件叠加对应水印。实现需要满足:
- 使用服务器实际可用的 GD 或 Imagick 能力。
- 根据 EXIF 方向、色彩空间和透明通道正确处理。
- 写临时文件后原子替换,失败时不破坏已有图片。
- 对同一个源文件重复执行得到相同结果,避免水印叠加。
- 记录规则版本,规则变化时可从原图重新生成。
- 在队列或 WP-CLI 中批处理旧附件,避免后台请求超时。
WordPress 标准 WP_Image_Editor 并没有一个统一的“叠加图片水印”高级接口。若直接调用 Imagick/GD,就必须明确扩展依赖并为两套实现测试,不能只复制一段未验证的代码。
方案三:使用维护中的媒体插件
选择插件时,不只看功能列表,还要看:
- 最近更新时间与支持的 WordPress/PHP 版本。
- 安装量、漏洞记录和维护者响应。
- 是否修改原图,是否可恢复。
- 是否支持现有图片重新生成和失败回滚。
- 是否兼容对象存储、响应式图片和现代格式。
- 卸载后是否留下不可理解的媒体状态。
在暂存站导入一组代表性图片,生成所有尺寸,再检查文件 MIME、像素、透明度、方向、文件大小和前端 srcset,通过后再上生产。
交付清单
- 备份数据库和
uploads。 - 记录所有自定义尺寸及水印规则。
- 确认模板请求的是正确派生尺寸,不是原图。
- 限制最大上传像素,避免内存峰值。
- 批处理可暂停、重试并记录失败附件 ID。
- 随机抽检旧图与新图,并在 Retina 屏幕和移动端查看。
- 保留回滚方案,避免插件停用后页面全部 404。
水印属于资产生产流程。最可靠的方案不是找到一个“万能插件”,而是让原图、规则、派生文件和缓存之间的关系可追踪、可重复、可恢复。