写作与公文
为博客文章生成、审计并同步标签与分类(跨 CMS…
当需要从博客内容建议标签/分类、检查薄弱/孤儿标签,或通过已认证 API 同步 taxonomy 到支持的 CMS 时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
为博客文章生成、审计并同步标签与分类(跨特定
解决思路
- 可用命令:`/blog taxonomy suggest <file>`,从内容提取候选标签和分类。
- 可用命令:`/blog taxonomy sync <cms>`,通过认证 API 将 taxonomy 推送到 CMS。
- 可用命令:`/blog taxonomy audit [directory]`,检查 thin tag、orphan tag 和 taxonomy bloat。
- 标签建议 Step 1:读取目标文件并提取所有 H2 和 H3 标题,作为主要主题信号。
- 标签建议 Step 1:提取加粗和斜体短语,作为强调信号。
- 标签建议 Step 1:提取已有的 frontmatter tags/categories(如果存在)。
- 标签建议 Step 2:扫描正文中的高频短语。
- 标签建议 Step 2:1 词词条至少出现 4 次,排除 stop words。
- 标签建议 Step 2:2 词短语至少出现 3 次。
- 标签建议 Step 2:3 词短语至少出现 2 次。
- 标签建议 Step 2:排除常见的非标签词,包括 articles、prepositions、conjunctions、pronouns。
- 标签建议 Step 3:将相关候选词分组为 cluster。
- 标签建议 Step 3:合并单数和复数变体,保留更常见的形式。
- 标签建议 Step 3:合并带连字符和不带连字符的形式。
- 标签建议 Step 3:将同义词归到频率最高的词条下。
- 标签建议 Step 4:对 slugified 名称做模糊匹配,Levenshtein distance <= 2。
- 标签建议 Step 4:对少于 5 个字符的短 slug,不要仅凭 Levenshtein 自动合并;要求 token overlap 或人工复核。
- 标签建议 Step 4:为每个候选词打分:`(frequency * 2) + (heading_presence * 5) + (emphasis * 1)`。
- 标签建议 Step 4:返回排名前 5-10 的建议。
- 标签建议输出格式:表格包含 Rank、Tag、Score、Source。
- 标签建议输出格式:给出 Suggested Categories,包含 Primary 和可选 Secondary。
- CMS adapter 总览:WordPress 使用 REST、Application Passwords(base64)、tags 是带 ID 的一等实体。
- CMS adapter 总览:Shopify 使用 GraphQL(Admin API)、Admin API access token、tags 是 Article 上的字符串数组。
- CMS adapter 总览:Ghost 使用 REST(Admin API)、带 JWT 签名的 API key、tags 是一等实体。
- CMS adapter 总览:Strapi 使用 REST 或 GraphQL、Bearer API token、tags 是用户定义的内容类型。
- CMS adapter 总览:Sanity 使用 GROQ / Mutations、Bearer project token、tags 是 document type。
- WordPress:列出 tags:`GET {CMS_URL}/wp-json/wp/v2/tags?per_page=100&search={keyword}`,并带 `Authorization: Basic {base64(username:app_password)}`。
- WordPress:创建 tag:`POST {CMS_URL}/wp-json/wp/v2/tags`,Body 为 `{"name": "Tag Name", "slug": "tag-name", "description": "Optional"}`。
- WordPress:列出 categories(层级结构,支持 parent 字段):`GET {CMS_URL}/wp-json/wp/v2/categories?per_page=100`。
- WordPress:创建 category:`POST {CMS_URL}/wp-json/wp/v2/categories`,Body 为 `{"name": "Category", "slug": "category", "parent": 0}`。
- WordPress:给文章分配 tags:`POST {CMS_URL}/wp-json/wp/v2/posts/{id}`,Body 为 `{"tags": [1, 2, 3], "categories": [4]}`。
- WordPress:分页时跟随 `X-WP-TotalPages` header 完成完整列表。
- Shopify:注意 tags 是 Article 对象上的字符串数组,不是一等实体。
- Shopify:更新文章 tags(GraphQL Admin API)使用 `articleUpdate` mutation,传入 `id: "gid://shopify/Article/123"` 和 `article: { tags: ["tag-one", "tag-two", "tag-three"] }`,返回 `article { id tags }` 和 `userErrors { field message }`。
- Shopify:列出正在使用的所有 tags(GraphQL):查询 `articles(first: 250, after: $cursor)`,取 `pageInfo { hasNextPage endCursor }` 和 `edges { node { id title tags } }`。
- Shopify:认证 header 使用 `X-Shopify-Access-Token: {token}`。
- Shopify:分页时在 `pageInfo.hasNextPage` 为 true 时循环,把 `endCursor` 作为下一个 `$cursor`。
- Shopify:注意 REST API 自 2024 年 10 月标记为 legacy;自 2025 年 4 月起新应用需要 GraphQL。
- Ghost:列出 tags:`GET {CMS_URL}/ghost/api/admin/tags/?limit=all`,带 `Authorization: Ghost {jwt_token}`。
- Ghost:创建 tag:`POST {CMS_URL}/ghost/api/admin/tags/`,Body 为 `{"tags": [{"name": "Tag Name", "slug": "tag-name"}]}`。
- Ghost:JWT 生成:用 admin API key(id:secret 格式)签名,iat = now,exp = 5 min,audience = `/admin/`。
- Strapi:endpoint 由 content types 自动生成;典型设置:`GET {CMS_URL}/api/tags?pagination[pageSize]=100`。
- Strapi:创建 tag:`POST {CMS_URL}/api/tags`,Body 为 `{"data": {"name": "Tag Name", "slug": "tag-name"}}`,带 `Authorization: Bearer {api_token}`。
- Strapi:分页时递增 `pagination[page]` 直到所有页耗尽。
- Strapi:v4 响应使用 `data` wrapper 和 `attributes`;v5 使用更扁平的响应结构;去重前检测版本或归一化两种结构。
- Strapi:检查 content type schema 以确认字段名。
- Sanity:查询 tags(GROQ):`*[_type == "tag"] { _id, name, slug }`。
- Sanity:创建 tag(Mutations API):`POST https://{project_id}.api.sanity.io/{SANITY_API_VERSION}/data/mutate/{dataset}`,Body 为 `{"mutations": [{"create": {"_type": "tag", "name": "Tag", "slug": {"current": "tag"}}}]}`,带 `Authorization: Bearer {token}`。
- Sanity:将 `SANITY_API_VERSION` 默认设为项目环境提供的当前已测试 API 日期;不要在生成的请求中硬编码。
- Taxonomy 审计 Step 1:对目标目录中所有文章进行 inventory,或从 CMS 拉取。
- Taxonomy 审计 Step 1:构建映射 `tag_name -> [使用该 tag 的文章文件/ID 列表]`。
- Taxonomy 审计 Step 1:构建映射 `category_name -> [使用该 category 的文章文件/ID 列表]`。
- Taxonomy 审计 Step 2:检查 thin tag archives,阈值为每个 tag 少于 5 篇文章;在检查流量、意图和链接后,再决定 merge 或 noindex。
- Taxonomy 审计 Step 2:检查 orphan tags,阈值为 0 篇文章;建议删除。
- Taxonomy 审计 Step 2:检查 tag bloat,阈值为总 tags 数超过 `max(50, post_count * 0.25)`(按 taxonomy 目的调整);建议合并。
- Taxonomy 审计 Step 2:检查 category depth,阈值为超过 3 层;建议扁平化。
- Taxonomy 审计 Step 2:检查 uncategorized posts,即没有分配 category 的文章;分配到合适 category。
- Taxonomy 审计 Step 2:检查 duplicate slugs,即同一 slug 不同名称;合并到 canonical version。
- Taxonomy 审计 Step 3:按优先级分组发现:Critical 为 orphan tags 造成空 archive 页面(crawl waste)。
- Taxonomy 审计 Step 3:High 为在检查流量、意图和链接后仍少于 5 篇文章的 thin tags。
- Taxonomy 审计 Step 3:Medium 为超过缩放阈值的 tag bloat(taxonomy 稀释、更难导航)。
- Taxonomy 审计 Step 3:Low 为命名不一致(大小写混用、hyphen vs space)。
- Taxonomy 审计输出格式:报告 Total tags、Total categories、Healthy、Thin、Orphan。
- Taxonomy 审计输出格式:列出 Critical Issues,如 orphan tags list。
- Taxonomy 审计输出格式:给出 Recommendations,例如合并相同主题标签、删除 orphan tags、仅在检查流量/意图/链接后对少于 5 篇文章的 tag archives 做 merge 或 noindex。
- 站点级准则:每个站点目标为 5-10 个主分类,覆盖宽泛主题。
- 站点级准则:标签至少要有 5 篇文章才创建 archive page。
- 站点级准则:使用一致 slug 格式:小写、连字符分隔。
- 站点级准则:每篇文章必须且只能有 1 个主分类。
- 站点级准则:每篇文章推荐 3-8 个 tags,绝不超过 15 个。
- 环境变量:设置 `CMS_TYPE` 为 wordpress、shopify、ghost、strapi、sanity 之一。
- 环境变量:设置 `CMS_URL` 为 CMS 的 HTTPS 基础 URL,例如 https://example.com。
- 环境变量:可选设置 `CMS_ALLOWED_HOSTS` 为 CMS host 的逗号分隔 allowlist,例如 example.com,admin.example.com。
- 环境变量:使用 WordPress Application Passwords 时设置 `CMS_USERNAME`。
- 环境变量:设置 `CMS_API_KEY` 为认证凭据,如 WordPress app password、API token 或 key。
- 环境变量:设置 `SANITY_API_VERSION` 为 Sanity mutations 的 API 日期,例如 v2026-07-01。
- 环境变量:这些变量必须在 shell 环境中设置;绝不要把凭据存入文件或提交到版本控制;运行时通过 `$CMS_TYPE`、`$CMS_URL`、`$CMS_USERNAME`、`$CMS_API_KEY` 及可选平台变量读取。
- CMS 调用安全规则:要求 HTTPS;允许解析 http 和 https 路径,但认证请求只通过 HTTPS 发送。
- CMS 调用安全规则:解析 DNS 并阻止 loopback/private/link-local/reserved IPs。
- CMS 调用安全规则:对 redirects 使用同样检查验证,或禁用 redirects。
- CMS 调用安全规则:超时上限设为 10 秒。
- CMS 调用安全规则:当设置了 `CMS_ALLOWED_HOSTS` 时强制执行。
- 错误处理:如果 `CMS_TYPE`、`CMS_URL` 或 `CMS_API_KEY` 未设置,或 WordPress 缺少 `CMS_USERNAME`,报告缺少哪个变量并提供预期格式。
- 错误处理:如果 CMS API 返回 401/403,报告 `Authentication failed - check CMS_USERNAME/CMS_API_KEY`,并且不要重试。
- 错误处理:如果 CMS endpoint 在 10 秒后不可达,报告超时并建议检查 `CMS_URL`。
- 错误处理:如果 tag 已存在于 CMS,跳过创建并注明 `Tag already exists: [name]`。
- 错误处理:如果 CMS API 返回 429,优先遵守 `Retry-After`;否则使用 exponential backoff 并重试一次;如果限制持续,报告。
- 错误处理:如果 `CMS_TYPE` 不是 5 个支持平台之一,列出有效选项并退出。
适用边界 · 注意事项
- 不适用于需要同步/审计 CMS 但没有可用 API 凭据或写权限的情况(此时仅能做内容侧建议)。
- 不适用于 CMS_TYPE 不是 WordPress、Shopify、Ghost、Strapi、Sanity 这五种支持平台的情况。
- 不适用于不允许通过 API 自动增删/合并标签和分类,或必须完全人工审核 taxonomy 的场景。