SEO 自动标签
给 WordPress 文章自动推荐标签,点一下生成候选标签,确认后再写入文章。
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/solowaltz/seo-auto-tags/archive/refs/heads/main.zip给 WordPress 文章自动推荐标签。点一下就能生成候选标签,确认后再写入文章,省去手动整理的麻烦。
支持本地算法和 OpenAI 兼容接口,既可以完全离线使用,也可以接入自己常用的 AI 服务。
作者:西瓜烧鱼 · 许可:GPL-2.0-or-later
主要功能
- 兼容区块编辑器和经典编辑器
- 根据标题和正文提取主题词,突出标签的 SEO 相关性
- 支持本地算法和 OpenAI 兼容接口:不想花钱时可完全本地运行
- 候选标签可编辑、取消、复制和重新生成
- 优先复用站内已有标签,过滤明显重复词
- 文章列表页支持一键补标签
- 提供标签健康度、调用限速、用量统计和结果缓存
- 支持屏蔽词和标签数量提醒
安全与隐私
- API Key 使用站点密钥加密后保存,也可以只放在
wp-config.php - AI 模式只把标题和正文片段发送到你自己配置的接口,本地模式不联网
- 接口地址强制使用 HTTPS,并检查 DNS,拦截本机、内网和云元数据地址
- 所有异步请求都校验权限和 nonce,避免越权生成或写入标签
- 插件不收集站点数据,不向作者服务器回传内容
为什么标签要控制数量
WordPress 的每个标签都会生成一个归档页。标签建得太多太碎,会:
- 产出大量内容稀薄的页面,稀释整站权重
- 让同一个意思被拆成多个标签(「PS教程」和「Photoshop教程」),互相分权
所以本插件默认只给 5 个候选,并且默认优先复用已有标签。
标签本身也要短。3~6 个字最理想:
- 太短(如「软件」「教程」)没有区分度,聚合的文章太多、主题散
- 太长(如「安卓手机录屏软件推荐」)只能聚合一两篇文章,同样会变成稀薄的归档页
因此中文标签限制在 2~8 字,打分时 3~6 字权重最高; 英文按视觉宽度折算,不会误伤 Photoshop、Portraiture 这类长词。
安装
- 下载本仓库的
seo-auto-tags.zip,或把整个目录打包成同名 zip - WordPress 后台 → 插件 → 安装插件 → 上传插件 → 选择 zip → 现在安装
- 启用插件
- 进入 设置 → SEO 自动标签 按需配置
要求:WordPress 5.8+、PHP 7.4+(建议 PHP 8.0 以上)。
也可以直接把
seo-auto-tags目录上传到wp-content/plugins/下再启用。
使用
写文章时:
- 编辑页右侧找到「SEO 自动标签」面板
- 点「生成标签」
- 取消勾选不想要的
- 点「应用选中标签」→ 保存文章
给旧文章补标签:
到「文章」列表页,找到「SEO 标签」列里显示「未打标签」的行,点「一键生成」, 确认弹窗里列出的标签后自动追加(不会删掉原有标签)。
配置 AI 模式
选择 AI 模式后填写服务商、API Key 和模型名。接口地址和模型名会自动带出。
内置预置:
| 服务商 | 说明 |
|---|---|
| DeepSeek | 中文效果好,价格低 |
| 通义千问 | 阿里云,新用户有免费额度 |
| 智谱 GLM | 有免费模型(glm-4-flash) |
| 月之暗面 Kimi | 长文本能力强 |
| OpenAI | 需要国外网络环境 |
| 自定义 | 任何 OpenAI 兼容接口(必须 https) |
填好后点「测试连接」确认能通,再去文章里用。
AI 兼容性
不同服务商的返回格式不完全一样,插件按常见格式逐个兜底:
- 标准 OpenAI 兼容:
choices[0].message.content - 老式 completions:
choices[0].text - 多模态数组:
message.content[0].text - 部分网关:
output.text/content - 网关强制返回 SSE 分块时,自动拼接
出错时会把 HTTP 状态码翻译成能照着修的建议:
| 状态码 | 提示 |
|---|---|
| 401 | API Key 无效或已过期,重新复制粘贴一次 |
| 402 | 账户余额不足,去服务商后台充值 |
| 404 | 接口地址不对,多数服务商要求以 /v1 结尾 |
| 429 | 被服务商限流了,等一会儿再试 |
| 超时 | 服务器可能出不了外网,或模型响应太慢 |
报错信息里的 API Key 会被自动脱敏。
AI 消耗说明
会真实调用接口的地方只有四处:
| 触发点 | 消耗 | 防护 |
|---|---|---|
| 编辑器点「生成标签」 | 一次调用 | 限速 + 缓存 |
| 打开编辑器自动生成(可选,默认关) | 同上 | 同上 |
| 文章列表页「一键生成」 | 每篇一次 | 限速 |
| 设置页「测试连接」 | 约 20 token | 一分钟最多 5 次 |
发送量控制:正文做「头 + 尾」采样,控制在 4000 字以内(约 2400 token), 单次调用成本约几厘钱。想更省就把「结果缓存」开着。
达到限速上限时自动改用本地算法并在界面上说明原因,不会报错中断,也不会偷偷继续花钱。
想彻底不花钱:生成方式选「本地算法」—— 不联网、不调用任何接口。
安全
| 项 | 做法 |
|---|---|
| CSRF | 所有 AJAX 接口校验 nonce |
| 越权 | 逐个校验当前用户对目标文章的编辑权限 |
| SSRF | AI 接口地址强制 https,禁止指向本机 / 内网 / 云元数据地址;保存、生成与测试时都会做 DNS 解析检查,并禁止跟随重定向 |
| API Key 泄露 | 强制 https 传输;设置页不回显完整 Key;报错信息自动脱敏 |
| 额度被刷 | 按用户按小时限速;「测试连接」另有一分钟 5 次节流 |
| 批量滥用 | 单次最多创建 12 个标签 |
| XSS | 前端一律用 textContent 写入 |
| 内存耗尽 | 超长正文按段落均匀采样,压到 3 万字以内再分析 |
| 进程占满 | 接口超时 25 秒,避免慢请求占满 PHP 进程池 |
数据不外泄
API Key
-
密钥用站点密钥加密后保存,数据库里看不到明文;服务器缺少安全加密能力时不会保存新的 Key
-
设置页不回显已保存的 Key(输入框恒为空,留空表示不改动)
-
前端 JavaScript 中不含任何 Key 相关字段,Key 只在服务端使用
-
报错信息里的 Key 会被自动抹掉
-
「测试连接」返回的模型回复只截取 40 字
-
想更安全的话,可以把 Key 放到
wp-config.php,完全不写入数据库:define( 'SEO_AUTO_TAGS_API_KEY', '你的Key' );定义后插件优先使用该常量,设置页会显示提示并隐藏输入框。
-
想停用 AI 时,可在设置页勾选「清除已保存的 Key」
站点与内容
- 请求头使用固定的
User-Agent: SEO-Auto-Tags/x.y.z; WordPress,不携带站点地址 - 不携带 Referer 等额外请求头;保持 WordPress 默认的 SSL 校验
- AI 结果缓存的键是「标题 + 正文 + 接口配置」的 md5 指纹,不可反推原文
- 插件不写任何日志文件,不向自建服务器回传数据
发往 AI 的内容
- 仅在你点击「生成标签」时发送文章标题与正文(采样后 4000 字以内)
- 本地算法模式不联网,不发送任何数据
目录结构
seo-auto-tags/
├── seo-auto-tags.php 插件主文件(含环境检查)
├── includes/
│ ├── class-settings.php 设置页 + 标签健康度面板
│ ├── class-generator.php 标签生成算法(本地 + AI)
│ ├── class-ajax.php 异步接口
│ ├── class-metabox.php 编辑器面板
│ └── class-columns.php 文章列表列 + 一键生成
├── assets/
│ ├── editor.js / editor.css 编辑器交互与样式
│ ├── columns.js 列表页一键生成
│ └── admin.js / admin.css 设置页交互与样式
├── uninstall.php 卸载清理
└── readme.txt WordPress 插件说明
开发
纯 PHP + 原生 JavaScript,不依赖任何构建步骤,克隆下来直接改。
运行环境需要启用 mbstring 扩展。
许可
GPL-2.0-or-later © 西瓜烧鱼 · www.rrshare.com