blog-taxonomy について
blog-taxonomyは、記事ファイルやCMSにおけるブログのタグ、カテゴリー、トピッククラスターを管理するスキルです。記事内容から分類候補を提案し、認証済みAPIでCMSへ同期するとともに、サイト全体の分類状態を監査します。
主な機能
- 01記事内容からタグとカテゴリーを提案
- 02候補語のグループ化と順位付け
- 03CMS API経由で分類情報を同期
- 04記事数の少ないタグ、孤立タグ、重複タグを監査
- 05WordPress、Shopify、Ghost、Strapi、Sanityに対応
活用シーン
- 01新しいブログ記事のタグ候補を作成
- 02カテゴリーとタグをCMSに同期
- 03サイト内の未使用タグや記事数の少ないタグを発見
- 04記事間の分類ルールの一貫性を確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ infrasity-labs/ dev-gtm-claude-skills --skill blog-taxonomyインストール後、Claude Code で/blog-taxonomyを入力して読み込まれたか確認します。
詳細
ブログのタクソノミー
CMS プラットフォーム全体でタグ、カテゴリー、トピッククラスターを管理します。
コマンド
| コマンド | 目的 |
|---|---|
/blog taxonomy suggest <file> | コンテンツから候補となるタグとカテゴリーを抽出します |
/blog taxonomy sync <cms> | 認証済み API を介してタクソノミーを CMS に反映します |
/blog taxonomy audit [directory] | 内容の薄いタグ、孤立したタグ、タクソノミーの肥大化を確認します |
タグ提案のワークフロー
ステップ 1:コンテンツ構造の解析
対象ファイルを読み込み、以下を抽出します。
- すべての H2 および H3 見出し(主要なトピックを示す要素)
- 太字および斜体のフレーズ(強調を示す要素)
- 存在する場合は、既存のフロントマターのタグ/カテゴリー
ステップ 2:頻度分析
本文をスキャンして、出現頻度の高いフレーズを確認します。
- 1 語の用語:最低 4 回(ストップワードを除く)
- 2 語のフレーズ:最低 3 回
- 3 語のフレーズ:最低 2 回
一般的なタグ以外の単語(冠詞、前置詞、接続詞、代名詞)は除外します。
ステップ 3:意味によるグループ化
関連する候補をクラスターにまとめます。
- 単数形と複数形の異なる表記を統合します(出現頻度の高い形を残します)
- ハイフン付きとハイフンなしの表記を統合します
- 同義語を出現頻度が最も高い用語の下にまとめます
ステップ 4:重複排除と順位付け
- スラッグ化した名前を対象に、あいまい一致を行います(レーベンシュタイン距離 <= 2)
- 各候補をスコア付けします:
(frequency * 2) + (heading_presence * 5) + (emphasis * 1) - 順位の高い候補を 5~10 件返します
出力形式
## Tag Suggestions: [Post Title]
| Rank | Tag | Score | Source |
|------|-----|-------|--------|
| 1 | content-marketing | 18 | H2 + 6 mentions |
| 2 | seo-strategy | 14 | H3 + 4 mentions |
| 3 | keyword-research | 11 | 5 mentions + bold |
### Suggested Categories
- Primary: [best-fit category]
- Secondary: [optional second category]
CMS アダプター
アダプターの概要
| CMS | API の種類 | 認証方法 | タグのモデル |
|---|---|---|---|
| WordPress | REST | アプリケーションパスワード(base64) | ID を持つ第一級エンティティ |
| Shopify | GraphQL(Admin API) | Admin API アクセストークン | Article 上の文字列配列 |
| Ghost | REST(Admin API) | JWT 署名付き API キー | 第一級エンティティ |
| Strapi | REST または GraphQL | API トークン(Bearer) | ユーザー定義のコンテンツタイプ |
| Sanity | GROQ / Mutations | プロジェクトトークン(Bearer) | ドキュメントタイプ |
WordPress アダプター
タグの一覧表示:
GET {CMS_URL}/wp-json/wp/v2/tags?per_page=100&search={keyword}
Authorization: Basic {base64(username:app_password)}
タグの作成:
POST {CMS_URL}/wp-json/wp/v2/tags
Body: {"name": "Tag Name", "slug": "tag-name", "description": "Optional"}
カテゴリーの一覧表示(階層構造で、parent フィールドをサポート):
GET {CMS_URL}/wp-json/wp/v2/categories?per_page=100
カテゴリーの作成:
POST {CMS_URL}/wp-json/wp/v2/categories
Body: {"name": "Category", "slug": "category", "parent": 0}
投稿へのタグの割り当て:
POST {CMS_URL}/wp-json/wp/v2/posts/{id}
Body: {"tags": [1, 2, 3], "categories": [4]}
ページネーション:一覧をすべて取得するには、X-WP-TotalPages ヘッダーに従ってください。
Shopify アダプター
Shopify のタグは Article オブジェクト上の文字列配列であり、第一級エンティティではありません。
記事タグの更新(GraphQL Admin API):
mutation {
articleUpdate(id: "gid://shopify/Article/123", article: {
tags: ["tag-one", "tag-two", "tag-three"]
}) {
article { id tags }
userErrors { field message }
}
}
使用中のタグをすべて一覧表示(GraphQL):
{
articles(first: 250) {
edges {
node { id title tags }
}
}
}
認証ヘッダー:X-Shopify-Access-Token: {token}
注:REST API は 2024 年 10 月にレガシー扱いとなりました。2025 年 4 月以降、新しいアプリでは GraphQL が必須です。
Ghost アダプター
タグの一覧表示:
GET {CMS_URL}/ghost/api/admin/tags/?limit=all
Authorization: Ghost {jwt_token}
タグの作成:
POST {CMS_URL}/ghost/api/admin/tags/
Body: {"tags": [{"name": "Tag Name", "slug": "tag-name"}]}
JWT の生成:Admin API キー(id:secret 形式)で署名し、iat = 現在時刻、exp = 5 分後、
audience = /admin/ とします。
Strapi アダプター
エンドポイントはコンテンツタイプから自動生成されます。一般的な設定:
GET {CMS_URL}/api/tags?pagination[pageSize]=100
POST {CMS_URL}/api/tags
Body: {"data": {"name": "Tag Name", "slug": "tag-name"}}
Authorization: Bearer {api_token}
Strapi v4+ では data ラッパーを使用します。フィールド名はコンテンツタイプのスキーマで確認してください。
Sanity アダプター
タグのクエリ(GROQ):
*[_type == "tag"] { _id, name, slug }
タグの作成(Mutations API):
POST https://{project_id}.api.sanity.io/v2024-01-01/data/mutate/{dataset}
Body: {"mutations": [{"create": {"_type": "tag", "name": "Tag", "slug": {"current": "tag"}}}]}
Authorization: Bearer {token}
タクソノミー監査のワークフロー
ステップ 1:一覧の作成
対象ディレクトリ内のすべての投稿をスキャンするか、CMS から取得します。次のマップを作成します。
- tag_name -> [このタグを使用している投稿ファイル/ID のリスト]
- category_name -> [投稿ファイル/ID のリスト]
ステップ 2:健全性のチェック
| チェック項目 | しきい値 | 対応 |
|---|---|---|
| 内容の薄いタグアーカイブ | タグあたり < 5 件の投稿 | noindex または統合を推奨 |
| 孤立したタグ | 投稿 0 件 | 削除を推奨 |
| タグの肥大化 | タグ合計 > 50 件 | 統合を推奨 |
| カテゴリーの階層の深さ | > 3 階層 | 階層のフラット化を推奨 |
| 未分類の投稿 | カテゴリーが割り当てられていない | 適切なカテゴリーを割り当てます |
| 重複するスラッグ | 同じスラッグで名前が異なる | 正規版に統合します |
ステップ 3:推奨事項
調査結果を優先度別に分類します。
- 重大:孤立したタグによって空のアーカイブページが作成される(クロールの無駄)
- 高:投稿数が 3 件未満のタグ(ユーザー体験の低下、SEO シグナルの弱化)
- 中:タグが 50 件を超えて増えすぎている(分類体系が分散し、ナビゲーションが困難になる)
- 低:命名規則の不一致(大文字・小文字の混在、ハイフンとスペースの混在)
出力形式
## Taxonomy Audit: [Site/Directory]
**Total tags**: [n] | **Total categories**: [n]
**Healthy**: [n] | **Thin**: [n] | **Orphan**: [n]
### Critical Issues
- [orphan tags list]
### Recommendations
1. Merge [tag-a] and [tag-b] (same topic, [n] combined posts)
2. Delete orphan tags: [list]
3. Add noindex to tag archives with < 5 posts
サイト全体のガイドライン
- サイトごとにメインカテゴリを 5~10 個(幅広いトピック)設定します
- アーカイブページを作成する前に、タグに少なくとも 5 件の投稿を付けます
- スラッグ形式を統一します:小文字、ハイフン区切り
- 各投稿にはメインカテゴリを必ず 1 つだけ設定します
- 投稿ごとのタグ数は 3~8 個を推奨し、15 個を超えないようにします
環境変数
| 変数 | 用途 | 例 |
|---|---|---|
| CMS_TYPE | プラットフォーム識別子 | wordpress, shopify, ghost, strapi, sanity |
| CMS_URL | CMS のベース URL | https://example.com |
| CMS_API_KEY | 認証情報 | アプリケーションパスワード、API トークン、またはキー |
これらはシェル環境に設定する必要があります。認証情報をファイルに保存したり、
バージョン管理にコミットしたりしないでください。このスキルは実行時に $CMS_TYPE、$CMS_URL、
および $CMS_API_KEY を通じてこれらの値を読み取ります。
エラー処理
- 環境変数がない場合:CMS_TYPE、CMS_URL、または CMS_API_KEY が設定されていない場合は、不足している変数を報告し、想定される形式を提示します
- 認証情報が無効な場合:CMS API が 401/403 を返した場合は、「Authentication failed - check CMS_API_KEY」と報告し、再試行しません
- 接続タイムアウト:10 秒経過しても CMS エンドポイントに到達できない場合は、タイムアウトを報告し、CMS_URL の確認を提案します
- タグスラッグの重複:CMS にタグがすでに存在する場合は、作成をスキップし、「Tag already exists: [name]」と記録します
- レート制限:CMS API が 429 を返した場合は、待機して 1 回再試行します。制限が続く場合は報告します
- サポート対象外の CMS:CMS_TYPE がサポート対象の 5 つのプラットフォームのいずれでもない場合は、有効な選択肢を一覧表示して終了します