WEM Image ALT Assistant
基于 DeepSeek Vision 的 WordPress 图片 ALT 审核与辅助生成插件,支持上下文分析、批量审核、安全写入和前台 ALT 验证。
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/coowinit/seo-image-alt/archive/refs/heads/main.zip基于 WordPress 媒体库、页面上下文与 DeepSeek Vision 的图片 ALT 审核工作台。
当前版本:v1.1.2
WEM Image ALT Assistant 用于帮助 WordPress 网站发现缺失或需要复核的图片 ALT,并让 AI 在“看懂图片 + 理解页面上下文”的基础上生成候选文本,再由人工审核后安全写入 WordPress 原生 ALT 字段。
它不是“一键把所有空 ALT 填满”的自动化工具,而是一套:
Image Audit → AI Candidate → Human Review → Safe Apply
的图片 ALT 管理流程。
项目定位
很多 WordPress 网站积累了大量历史图片,常见问题包括:
- 图片没有 ALT;
- 图片已经有 ALT,但描述过于机械;
- 只根据文件名生成 ALT,缺少真实图片语义;
- 图片所在页面与媒体库
post_parent并不一致; - 同一产品页面包含多张图片,需要不同的描述;
- 装饰性图片本来就应该保持
alt=""; - 媒体库 ALT 已更新,但历史页面前台 HTML 可能仍未同步。
WEM Image ALT Assistant 不试图替代媒体库、SEO 插件或页面编辑器,而是补上 WordPress 原生后台缺少的:
图片发现
↓
上下文理解
↓
AI 视觉分析
↓
候选 ALT
↓
人工审核
↓
安全应用
↓
前台验证
核心原则
1. AI 只做助手,不直接替人决定
默认流程:
AI Generate
↓
Candidate
↓
Human Review
↓
Approved
↓
Apply ALT
AI 返回结果后不会直接写入正式 ALT。
2. 不覆盖已有 ALT
插件默认拒绝覆盖已经存在的 WordPress 原生 ALT。
这意味着:
- 原人工 ALT 不会被批量覆盖;
- AI 候选只处理当前仍为空的 ALT;
- 批量应用前仍会再次检查原生 ALT 状态。
3. 不是所有空 ALT 都应该填文字
图片可能属于:
content
→ 内容图片,需要描述性 ALT
decorative
→ 装饰性 / 占位图片,可能应该保持 alt=""
uncertain
→ 当前上下文不足,需要人工判断
AI 的 decorative 判断只是建议,最终仍由人工确认。
核心工作流
WordPress Media Library
↓
Image Scanner
↓
WordPress Context
↓
DeepSeek Vision
↓
Structured AI Result
├── type
├── alt
└── reason
↓
Human Review
↓
Approved
↓
Apply to _wp_attachment_image_alt
↓
Frontend ALT Audit
主要功能
图片扫描
默认扫描 WordPress 媒体库中的图片,并按工作状态分类:
- 待处理;
- 待审核;
- 已审核;
- 已有 ALT;
- 无需 ALT;
- 失败;
- 全部图片。
支持:
- 搜索;
- 分页;
- 图片缩略图;
- 点击查看大图;
- 单张生成;
- 本页批量生成;
- 失败重试。
AI 视觉生成
当前使用 DeepSeek Vision 对图片进行视觉理解,并结合 WordPress 上下文生成结构化结果:
{
"type": "content",
"alt": "Dark wood-grain WPC wall panel with hollow slat profile",
"reason": "The image shows the product profile and visible hollow structure."
}
后台会把结果拆分显示:
type:图片类型判断;alt:真正的 ALT 候选;reason:AI 判断依据。
完整 JSON 不会直接作为 ALT 写入。
ALT 输出语言
DeepSeek 设置中支持:
自动
English
简体中文
外贸英文网站通常建议固定为 English,避免同一媒体库出现中英文 ALT 混用。
WordPress Context
生成 ALT 时,插件会向 AI 提供精简且与图片相关的上下文,包括:
- 图片文件名;
- 媒体标题;
- Caption;
- 父级 Post / Page / Product 标题;
- 父级文章类型;
- 页面摘要;
- Taxonomy Terms;
- Yoast Focus Keyword;
- Rank Math Focus Keyword。
目标不是让 AI 堆砌 SEO 关键词,而是减少误判。
上下文优先级应理解为:
图片本身
>
实际页面 / 产品信息
>
分类与页面摘要
>
SEO 关键词
人工审核
AI 生成后进入“待审核”。
人工可以:
- 查看大图;
- 阅读 AI 判断依据;
- 修改候选 ALT;
- 勾选“审核通过”;
- 标记“无需 ALT”;
- 忽略不需要处理的测试 / 后台素材。
如果已审核的 ALT 再次被编辑:
已审核
↓
候选内容变化
↓
自动取消审核
↓
重新确认
服务器端也会校验审核时的候选内容,避免界面状态与实际保存内容不一致。
批量审核与批量应用
插件将“生成”“审核”“应用”明确分成三个阶段:
批量生成候选
↓
快速人工浏览
↓
批量审核通过
↓
批量应用已审核 ALT
批量审核
只改变审核状态,不写入正式 ALT。
批量应用
只有同时满足以下条件才会写入:
已选择
+
候选 ALT 非空
+
审核通过
+
候选内容未变化
+
当前 WordPress 原生 ALT 仍为空
否则自动跳过。
批量处理完成后会显示:
成功
失败
跳过
全站批量任务(v1.1.x)
当媒体库达到数百或数千张图片时,“每页 20 张 → 选择 → 生成 → 审核 → 应用”的页面级流程会产生大量重复操作。
v1.1.0 起新增 大型媒体库模式,批量任务不再依赖当前分页。
推荐流程
测试生成 20 张
↓
确认 Prompt 与 ALT 质量
↓
生成全部待处理
↓
随机抽查 20–50 张内容图
↓
批量审核全部合格内容图
↓
人工处理 decorative / uncertain / failed
↓
应用全部已审核 ALT
v1.1.2 批量任务异常隔离
大型媒体库中出现少量异常图片是正常情况,单张图片不能阻塞 1000+ 张任务。v1.1.2 将错误分成两类:
单图错误
→ 图片读取 / 下载失败
→ 无效或损坏图片
→ 不支持的图片输入
→ 记录失败
→ 自动继续下一张
全局错误
→ API Key / 权限 / 额度
→ Model / 请求配置异常
→ 暂停整个任务
→ 修复后重新尝试
因此,类似 Failed to download image 的错误不会再让整个全站任务停在同一张图片上。失败图片仍保留在“失败”列表,可以在主任务结束后统一重试或人工处理。
当任务确实因全局错误暂停时,后台会显示当前 Attachment,并提供:
- 重新尝试 / 继续:修复 API 或配置问题后重试当前图片;
- 跳过当前图片并继续:人工确认后跳过当前阻塞项,继续后面的队列;
- 停止任务:保留已经完成的结果,不回滚。
测试生成 20 张与结果预览
v1.1.1 补全了“测试生成”的闭环:测试完成后不需要再去“待审核”分页寻找图片,当前任务会直接显示本次真正处理的图片与 ALT 候选。
测试生成 20 张
↓
直接查看这 20 张图片
↓
图片 + AI 类型 + ALT 候选 + 判断依据
↓
字符 / 词数与基础质量提示
↓
人工编辑 / 逐张审核
↓
审核通过合格内容图
↓
应用这批已审核 ALT
↓
生成全部剩余图片
测试结果会显示:
- 图片缩略图,可点击查看大图;
content / decorative / uncertain判断;- AI ALT 候选;
- AI 判断依据;
- 字符数与英文词数;
- “长度与结构合适 / ALT 偏长 / 疑似 JSON / AI 不确定 / 生成失败”等提示;
- 人工编辑与“审核通过”;
- 单张应用 ALT。
“审核通过合格内容图”仍使用与全站审核相同的保守质量门槛,并不代表 SEO 自动打分。它只用于快速排除明显异常候选。
测试生成的 20 张是真实任务结果,不是预览模拟数据;生成成功后已经保存到 Attachment Meta,因此后续可以直接审核和应用,不会浪费本次 API 调用。
全站生成
“生成全部待处理”会先取得当前符合条件的 Attachment ID 快照,然后:
1 张图片
→ 1 次 AJAX
→ 1 次 DeepSeek Vision
→ 保存结果
→ 继续下一张
不会把 1000+ 张图片放入一个 PHP 请求中,因此更适合 SiteGround、Cloudflare 和普通 WordPress 主机环境。JPEG / PNG / GIF / WebP 之外的格式不会进入 Vision 生成任务。
任务进度会持久化保存,支持:
- 刷新页面后继续;
- 暂停;
- 恢复;
- 停止;
- 失败统计;
- 自动重试普通网络 / 5xx / 空响应错误;
- DeepSeek HTTP 429 限流时等待后继续;
- 单张图片下载失败、格式异常或图片输入错误会记录为失败并自动继续下一张;
- API Key / 额度 / 权限 / Model 等全局错误才暂停整个任务;
- 全局错误暂停时可“重新尝试 / 继续”,也提供“跳过当前图片并继续”的人工兜底。
当前版本采用“后台页面驱动”的轻量队列。生成任务需要保持 Image ALT 后台页面打开;关闭页面不会丢失进度,重新打开后会继续。
批量审核全部合格内容图
该功能不是把所有 AI 结果无条件审核通过,而是先经过保守质量门槛。
只有同时符合以下条件的候选才进入全站审核任务:
AI type = content
+
原生 ALT 为空
+
候选 ALT 非空
+
候选不是 JSON / JSON-like 文本
+
候选长度处于正常范围
+
英文候选词数处于正常范围
以下类型不会自动审核:
decorative
uncertain
failed
JSON 异常
过长 / 过短候选
已有原生 ALT
它们继续留给人工检查。
即使候选通过门槛,也建议在执行全站审核前随机检查 20–50 张真实图片。
应用全部已审核 ALT
“应用全部已审核 ALT”不受分页限制,会处理整个媒体库中当前已审核的候选。
每次服务器请求最多处理一小批本地数据,不调用 AI。
写入前仍然重新检查:
审核通过
+
候选仍然存在
+
候选内容未变化
+
当前 _wp_attachment_image_alt 仍为空
已有 ALT 永远不会被覆盖。
与原页面级操作的关系
v1.1.x 没有移除原来的页面级流程。
少量图片 / 精细人工处理
→ 继续使用每页批量操作
数百 / 数千张历史图片
→ 使用全站批量任务
两套工作流共用同一套 Attachment Meta 和审核状态,可以混合使用。
无需 ALT 与忽略
无需 ALT
用于人工确认的装饰性图片。
WordPress 原生 ALT 保持为空:
alt=""
插件只记录该图片已经确认过,不再反复出现在待处理队列。
忽略
适合:
- 测试图片;
- 后台素材;
- 临时媒体;
- 不参与前台内容表达的图片。
两种状态都可以恢复为“待处理”。
前台 ALT 验证
媒体库中的:
_wp_attachment_image_alt
已经更新,并不代表历史页面最终输出的 <img> 一定同步。
插件提供只读工具:
Image ALT
→ 前台 ALT 验证
输入当前 WordPress 网站的一篇文章、页面或产品 URL 后,插件会:
Frontend HTML
↓
扫描 <img>
↓
尝试映射 Attachment ID
↓
读取 Media Library ALT
↓
对比实际 Frontend ALT
结果包括:
- 前台已同步;
- 前台仍为空;
- 前台与媒体库不同;
- 两边都为空;
- 仅前台有 ALT;
- 无法映射媒体库。
该功能只做诊断,不会修改:
post_content;- Gutenberg Block;
- Elementor 数据;
- 前台 HTML 数据库内容。
图片发送方式
插件优先读取 WordPress 本地文件,并以 Base64 方式发送给 Vision API。v1.1.2 起进一步避免把大尺寸原图直接交给远程下载器。
优点:
- staging 站点可用;
- 私有测试站不依赖外部访问图片 URL;
- Cloudflare / Basic Auth 环境下更稳定;
- 中文、空格及其他非 ASCII 图片文件名不再依赖远程 URL 下载;
- 发送约 1024px 的 WordPress 中间尺寸,降低批量任务的数据量和失败概率。
当前优先级:
WordPress large
↓
medium_large
↓
medium
↓
8 MiB 以内的本地原图
↓
最后才使用 Attachment URL fallback
可读取的本地图片会编码为 Base64。只有本地文件和可用中间尺寸都无法使用时,才回退到公开 URL;URL 路径中的中文或其他非 ASCII 字符会进行百分号编码。
URL fallback 仍要求 DeepSeek 能访问该图片,因此它只是最后的兼容方案,不是正常批量处理的首选路径。
支持的图片格式
当前视觉分析支持:
- JPEG;
- PNG;
- GIF;
- WebP。
当前不发送:
- SVG;
- AVIF。
不支持的图片不会被强行提交给 AI。
DeepSeek 配置
后台:
Image ALT
→ DeepSeek 设置
配置:
- API Key;
- Vision Model;
- ALT 输出语言;
- 连接测试。
也可以在 wp-config.php 中配置:
define( 'WIAA_DEEPSEEK_API_KEY', 'YOUR_API_KEY' );
wp-config.php 常量优先于后台数据库设置。
当前插件使用:
deepseek-v4-flash-vision-exp
安装
WordPress 后台:
插件
→ 安装插件
→ 上传 seo-image-alt-v1.1.2.zip
→ 激活
激活后进入:
Image ALT
├── 图片 ALT
├── 前台 ALT 验证
└── DeepSeek 设置
推荐使用流程
第一次在真实网站使用时,建议不要直接处理全部图片。
推荐:
1. 配置 DeepSeek
2. 测试连接
3. 先选择 5–20 张图片
4. 批量生成候选
5. 检查 AI 分类与 ALT 质量
6. 人工修改
7. 批量审核通过
8. 批量应用已审核 ALT
9. 使用“前台 ALT 验证”检查实际输出
10. 小批量站点继续下一批;大型媒体库可改用“全站批量任务”
权限
Administrator
拥有:
wiaa_use_image_alt_assistant
wiaa_manage_image_alt_assistant
可以:
- 使用图片 ALT 工具;
- 生成 / 审核 / 应用 ALT;
- 使用前台 ALT 验证;
- 管理 DeepSeek API 设置。
Editor
拥有:
wiaa_use_image_alt_assistant
可以使用图片工作台,但不能查看或修改 API Key。
数据保存
最终 ALT 使用 WordPress 原生字段:
_wp_attachment_image_alt
插件自己的流程状态保存在 Attachment Post Meta:
_wiaa_candidate_alt
_wiaa_generation_status
_wiaa_last_error
_wiaa_model
_wiaa_generated_at
_wiaa_reviewed
_wiaa_reviewed_at
_wiaa_alt_intent
_wiaa_ai_note
_wiaa_applied_alt
_wiaa_applied_at
没有新增自定义数据库表。
主题模板中如何读取 ALT
WEM Image ALT Assistant 最终把人工审核通过的 ALT 写入 WordPress 原生字段:
_wp_attachment_image_alt
因此,主题模板不需要调用插件私有接口,只要按照 WordPress 原生方式读取图片 ALT 即可。
ALT 数据属于 WordPress 媒体库,而不是只属于本插件。
即使以后停用 WEM Image ALT Assistant,只要媒体附件仍然存在,已经写入的 ALT 仍然可以被主题模板正常读取。
方式一:已知 Attachment ID 时,优先使用 WordPress 原生图片函数
如果自定义字段保存的是媒体附件 ID,推荐直接使用:
$image_id = 123;
echo wp_get_attachment_image(
$image_id,
'full'
);
WordPress 会自动生成 <img>,并读取 _wp_attachment_image_alt,同时处理:
src;width/height;srcset;sizes;loading;decoding。
如果只需要单独读取 ALT:
$image_alt = get_post_meta(
$image_id,
'_wp_attachment_image_alt',
true
);
输出时使用:
alt="<?php echo esc_attr( $image_alt ); ?>"
方式二:只有图片 URL 时,通过 URL 找到 Attachment ID
一些旧主题或自定义字段保存的是图片 URL,而不是 Attachment ID。
可以在主题 functions.php 中增加一个辅助函数:
/**
* 根据 WordPress 媒体库图片 URL 获取原生 ALT。
*
* @param string $image_url 图片 URL。
* @param string $fallback 找不到媒体附件时的备用 ALT。
* @return string
*/
function wem_get_image_alt_by_url( $image_url, $fallback = '' ) {
if ( empty( $image_url ) ) {
return $fallback;
}
// 去掉 ?ver= 等查询参数。
$clean_url = strtok( $image_url, '?' );
// 根据上传图片 URL 获取 Attachment ID。
$attachment_id = attachment_url_to_postid( $clean_url );
if ( $attachment_id ) {
return trim(
(string) get_post_meta(
$attachment_id,
'_wp_attachment_image_alt',
true
)
);
}
return $fallback;
}
然后在模板中:
$pic01 = get_post_meta(
get_the_ID(),
'product_mainimg01',
true
);
$alt01 = wem_get_image_alt_by_url( $pic01 );
HTML:
<img
src="<?php echo esc_url( $pic01 ); ?>"
alt="<?php echo esc_attr( $alt01 ); ?>"
>
这样,插件后台审核并应用的 ALT 会自动进入主题前台输出。
产品双图切换示例
旧主题中常见:
$pic01 = get_post_meta( get_the_ID(), 'product_mainimg01', true );
$pic02 = get_post_meta( get_the_ID(), 'product_mainimg02', true );
可以改成:
<?php
$pic01 = get_post_meta( get_the_ID(), 'product_mainimg01', true );
$pic02 = get_post_meta( get_the_ID(), 'product_mainimg02', true );
$alt01 = wem_get_image_alt_by_url( $pic01 );
$alt02 = wem_get_image_alt_by_url( $pic02 );
?>
<a class="hover-switch" href="<?php the_permalink(); ?>">
<img
width="770"
height="500"
src="<?php echo esc_url( $pic01 ); ?>"
alt="<?php echo esc_attr( $alt01 ); ?>"
>
<img
width="770"
height="500"
src="<?php echo esc_url( $pic02 ); ?>"
alt="<?php echo esc_attr( $alt02 ); ?>"
>
</a>
不要继续使用:
alt="The first image"
alt="The second image"
这类占位式 ALT。
WordPress 特色图片
对于 Post / Page 的特色图片,优先使用:
<?php the_post_thumbnail( 'full' ); ?>
而不是自己获取 the_post_thumbnail_url() 后再拼接一个空 alt。
例如:
<div class="picbox">
<a href="<?php the_permalink(); ?>">
<?php the_post_thumbnail( 'full' ); ?>
</a>
</div>
the_post_thumbnail() 会基于 Attachment ID 生成 WordPress 原生图片 HTML,并读取媒体库 ALT。
固定上传目录图片
如果模板中直接写了:
<img
src="/wp-content/uploads/2024/12/free-samples01.webp"
alt=""
>
也可以先转换成完整 URL:
$image_url = home_url(
'/wp-content/uploads/2024/12/free-samples01.webp'
);
$image_alt = wem_get_image_alt_by_url(
$image_url,
'Composite decking free samples'
);
再输出:
<img
src="<?php echo esc_url( $image_url ); ?>"
alt="<?php echo esc_attr( $image_alt ); ?>"
>
第二个参数只是在无法找到 Attachment 时使用的备用 ALT。
装饰性图片不要强行读取文字 ALT
不是所有图片都应该有描述性 ALT。
例如:
- 数字装饰图;
- 分隔元素;
- 已经有相邻文字说明的纯装饰图标;
- 不承担独立信息的视觉元素。
这类图片可以继续使用:
alt=""
例如图标旁边已经有 “Free Samples / About Us / Contact Us”,图标本身通常保持空 ALT 更合适,避免屏幕阅读器重复朗读。
CSS background-image 没有 ALT
例如:
<div
class="swiper-slide"
style="background-image: url(...);"
>
CSS 背景图片本身没有 HTML alt 属性。
如果图片只是视觉背景,可以保持这种实现;如果图片本身承担重要信息,应考虑改成真正的 <img>,再使用 WordPress 原生 ALT。
推荐的数据存储方式
对于新的 WordPress 主题或内容模型,优先保存:
Attachment ID
而不是只保存:
Image URL
推荐:
$image_id = get_post_meta(
get_the_ID(),
'product_image_id',
true
);
echo wp_get_attachment_image(
$image_id,
'full'
);
Attachment ID 可以直接关联:
- ALT;
- Caption;
- Title;
- 图片尺寸;
srcset;sizes;- Attachment Metadata。
如果旧项目已经保存 URL,则使用 attachment_url_to_postid() 作为兼容方案即可。
模板开发建议
推荐遵循:
Attachment ID
→ wp_get_attachment_image()
→ 最优先
Image URL
→ attachment_url_to_postid()
→ 兼容旧主题
Featured Image
→ the_post_thumbnail()
Decorative Image
→ alt=""
CSS Background
→ 不存在 ALT
输出自定义 <img> 时至少使用:
esc_url()
esc_attr()
分别处理 src 和 alt。
与插件的关系
WEM Image ALT Assistant 负责:
扫描
↓
AI 生成候选
↓
人工审核
↓
安全写入 WordPress 原生 ALT
主题模板负责:
Attachment ID / Image URL
↓
读取 _wp_attachment_image_alt
↓
输出到 <img alt="">
两者通过 WordPress 原生媒体数据连接,不需要让主题依赖插件内部类或函数:
WEM Image ALT Assistant
↓
_wp_attachment_image_alt
↓
WordPress Theme
↓
Frontend HTML
这也是本项目坚持 WordPress Native 的重要原因之一。
开发者扩展
插件提供:
wiaa_image_context
Filter,用于向 AI Context 追加可靠的业务数据。
例如 WEM Content Model 可以增加:
Product Name
Product Model
Product Family
Color
Dimensions
Application
示例:
add_filter(
'wiaa_image_context',
function ( $context, $attachment_id, $parent ) {
if ( $parent && 'product' === $parent->post_type ) {
$context['product_model'] = get_post_meta(
$parent->ID,
'product_model',
true
);
}
return $context;
},
10,
3
);
核心插件不写死某一种产品模型,保持独立和可复用。
AI ALT 写作原则
插件 Prompt 强调:
- 准确描述图片;
- 优先可访问性语义;
- 结合可靠上下文;
- 不臆造产品参数;
- 不堆砌关键词;
- 不使用无意义的
image of/photo of; - 只在自然情况下使用产品关键词;
- ALT 保持简洁、可读。
对于产品图片,比固定字符数更重要的是:
准确描述这张图片与同页其他图片的区别。
安全与隐私
只有管理员或编辑者主动执行 AI 生成时,当前图片和精简上下文才会发送到 DeepSeek。
插件不会:
- 扫描后自动上传整个媒体库;
- 自动覆盖人工 ALT;
- 自动修改历史文章正文;
- 自动重写 Gutenberg / Elementor 数据;
- 自动发布 AI 结果。
DeepSeek API Key 不会在后台页面完整回显。
当前边界
v1.1.x 仍明确不做:
- 自动覆盖已有 ALT;
- 上传图片后自动调用 AI;
- 前台实时 AI 生成;
- ALT SEO 打分;
- 图片压缩;
- 图片重命名;
- Title / Caption / Description 批量生成;
- OCR 管理;
- 自动翻译全部 ALT;
- 多 AI Provider;
- 自动修改历史
post_content; - 自动修复 Elementor / Gutenberg 中已保存的 ALT;
- 复杂图片使用关系图。
这些功能只有在真实使用证明有价值时才考虑增加。
已知限制
Attachment Parent 不一定是真实使用页面
WordPress 图片可能:
- 被多个页面使用;
- 上传时没有父级;
- 后来被 Elementor / Gutenberg 插入其他页面。
因此当前页面上下文是可靠但保守的起点。
AI 无法替代页面语义判断
同一张图片放在不同页面中,ALT 可能应该不同。
所以插件始终坚持:
AI generates. Human decides.
架构
当前项目保持轻量:
Image Scanner
↓
Image Context
↓
DeepSeek Client
↓
ALT Generator
↓
Review Workflow
↓
Native WordPress ALT
↓
Frontend Auditor
没有引入:
- Vector Database;
- RAG;
- 自定义数据库;
- 复杂任务框架;
- 大型 AI SDK。
目标是保持:
WordPress Native · Review First · AI as Assistant · Simple · Useful · Maintainable
运行要求
- WordPress 6.0+
- PHP 7.4+
- 可用的 DeepSeek API Key
License
GPL-2.0-or-later