seo-international について
多言語サイトの hreflang とリンク単位のローカライズを監査する、条件付きの SEO スキルです。言語タグ、相互リンク、自己参照、canonical との競合を確認し、不明なロケール情報を推測しません。
主な機能
- 01BCP-47 言語タグを検証
- 02相互リンクと自己参照を確認
- 03hreflang と canonical の競合を検出
- 04x-default と文書言語を確認
- 05hreflang の修正案を生成・検証
活用シーン
- 01言語版間の hreflang を監査
- 02無効な言語タグや戻りリンクの欠落を特定
- 03ローカライズ URL と canonical タグを確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ hainrixz/ claude-seo-ai --skill seo-internationalインストール後、Claude Code で/seo-internationalを入力して読み込まれたか確認します。
詳細
seo-international (M20)
hreflang は、どの言語・地域向け URL を検索エンジンに表示するかを伝えます。このモジュールは条件付きで実行されます。seo-vertical-detect が多言語サイト(複数の lang/ロケール URL、言語切り替え機能、または既存の hreflang)と判定した場合にのみ動作します。単一言語のサイトでは、すべての指摘が重大度 0 の not_applicable になります。スキーマタイプに関する懸念事項は references/schema-tier1.md に委ね、このモジュールではリンクレベルのローカライズのみを扱います。
入力
ディスパッチ用エンベロープで指定された PageSnapshot を使用します。<run_dir>/pages/<slug>.json から parsed(hreflang[]、canonicals[]、parsed 内の <html lang>)を読み取り、さらに headers.link と <run_dir>/pages/ 内の同階層のページから相互関係を確認します。逐語的な証拠を得るには pages/<slug>.html を Grep します。サイトのアーティファクトは <run_dir>/site/{robots.json,sitemaps.json,discovery.json} にあります。audit.mjs がすでに出力した決定論的な指摘は <run_dir>/findings.deterministic.json に記載されています。これらの ID を再出力せず、モデルが判定した指摘のみ追加してください。スナップショットがなく、URL/パスを指定して直接実行する場合は、まず node "${CLAUDE_PLUGIN_ROOT}/scripts/snapshot.mjs" <target> --out "${CLAUDE_PLUGIN_DATA}/runs" を実行し、表示されたスナップショットパスを使用してください。
監査
PageSnapshot を使用して作業します(render.used が none でなければ parsed_rendered、そうでなければ parsed)。<head> 内の <link rel="alternate" hreflang="..."> から hreflang を読み取ります(HTTP Link: ヘッダーやサイトマップの xhtml:link がある場合は、それらも受け付けます)。
- 相互参照 — ページ A が代替ページ B を宣言している場合、B も A を宣言する必要があります。一方向の hreflang は Google に無視されます。
- BCP-47 の妥当性 — 各
hreflang値は、有効な言語(en)または言語・地域(en-GB、pt-BR)のタグである必要があります。地域コードには ISO-3166-1 alpha-2 を使用し、言語から国を推測してはいけません(en-UKは無効です。en-GBを使用してください)。 - 自己参照 — ページ自身を hreflang セットに含めます。
- x-default — 言語選択ページ/フォールバック URL を示す
hreflang="x-default"を少なくとも 1 つ含めます。 - hreflang と canonical の競合 — hreflang URL は自己参照 canonical である必要があります。
rel=canonicalが別のページを指す URL を hreflang が指定すると、クラスターが無効になります(M2/seo-indexability と照合してください)。 <html lang>の一致 — ドキュメントのlang属性は、その URL が独自の hreflang エントリーで対象としているロケールと一致する必要があります。
修正
- AUTO(
fixable: auto):ロケール→URL マップが判明している場合(ユーザーから提供された場合、サイトマップにある場合、または代替ページから検出された場合)、すべてのロケールと単一のx-defaultを含む完全な相互参照 hreflang リンクセットを、fix用の<head>差分として生成します。追加的かつ決定論的です。 - PROPOSED(
fixable: proposed):検出された代替ページから推測した部分的なセットです。書き込みの前に、ユーザーがロケールマップを確認する必要があります。 - ADVISORY(
fixable: advisory):「多言語サイトのように見えますが、ロケールマップがありません」という通知です。ツールによる書き込みは行いません。 - ロケール、地域コード、代替 URL を捏造しないでください。マップが不完全な場合は、明確に示した
TODO(locale)プレースホルダーを残し、ユーザーに確認してください。
検証
- オフライン:
node "${CLAUDE_PLUGIN_ROOT}/scripts/hreflang-check.mjs" --snapshot <pages/<slug>.json>(または--url <u>/--file <path>)を実行します。<link>タグとHTTPLinkヘッダー(entries、header_entries)から代替セットを解析し、BCP-47 タグを検証して(invalid_bcp47)、has_x_default、self_referenced、duplicate_langsおよび canonical と hreflang の競合を報告します。このモードでは相互参照を検証しません。相互参照の検証には、宣言された各代替ページを取得する--url <u> --deep [--budget 25] [--ua <preset>]が必要です。 - 相互参照の検証には、宣言された各代替ページを取得する必要があります。これらの URL(またはサイトマップ階層)を利用できない場合、ステータスは
needs_apiとなり、誤ってpassと判定されることはありません。
Findings
Findings は schema/finding.schema.json に準拠し、軸は search です。単一言語サイトでは、すべての ID が重大度 0 の not_applicable です。重大度ポリシー:5 は、サイト/テンプレートのスコープで適格性を損なう壊滅的な事実にのみ使用します。4 は重大、3 は中程度、2 は軽微、1 は表面的、0 は情報提供です。また、アクティブなカテゴリにおける established の重大度 5 の fail のみがスコアの上限を設定できます(references/scoring-model.md)。
M20.hreflang.missing_reciprocal— ページがhreflang="de-DE"を宣言している URL から、元のページへの参照がありません。Google は一方向のアノテーションを無視するため、クラスターが形成されません(fail、重大度 4、fixable: proposed、信頼度established)。evidence.observedには、一方向の<link>が引用されています。M20.hreflang.invalid_bcp47— 例:hreflang="en-UK"(fail、重大度 3、fixable: auto、信頼度established。en-GBを推奨)。無効な値が 1 つあると、そのエントリは無効になりますが、セット全体が無効になるわけではありません。M20.hreflang.missing_self— ページが自身の代替ページセットに含まれていません(fail、重大度 3、fixable: auto、信頼度established)。M20.hreflang.canonical_conflict— hreflang URL のrel=canonicalが別のページを指しており、クラスターが無効化されています(fail、重大度 4、fixable: proposed、信頼度established。M2 と相互確認してください)。M20.hreflang.missing_xdefault— クラスターにx-defaultフォールバックがありません(warn、重大度 2、fixable: auto、信頼度directional。x-defaultは推奨されますが必須ではなく、存在しない場合はクラスターが壊れるのではなく、セレクターのルーティングが劣化します)。M20.lang.mismatch—<html lang>が、この URL の hreflang エントリで示されるロケールと一致しません(warn、重大度 2、fixable: auto、信頼度directional)。M20.hreflang.not_applicable— 単一言語サイト(not_applicable、重大度 0)。 プラットフォーム条件付き ID。 このモジュールは、profile.jsonにプラットフォーム(shopify)が記載されている場合にのみ発火する ID も 1 つ出力します。この ID はreferences/routing.mdの § Platform-conditional finding ids に索引され、references/platforms/<id>.mdの §10 で仕様が定められています。
各 finding では、verification.reproduce が上記の hreflang チェックコマンドを実行します。expected_impact は範囲と信頼度タグ付きで示されます(単独の % は使用しません)。
正確性
- hreflang は ターゲティング/クラスタリング のシグナルであり、ランキングを押し上げるものではありません。ロケールに応じて既存の URL のどれを表示するかを選択するもので、ランキングを上げるものではありません。ランキング向上の手段として売り込まないでください。
- hreflang は、質の低いコンテンツや機械翻訳されたコンテンツを 改善するものではなく、
rel=canonicalの代替でもありません。この 2 つは連携して機能します。 - Bing と Yandex での利用は限定的、またはまったくありません。文書で示されている恩恵の対象は Google です。検索エンジン間で同等に機能すると主張しないでください。
- 相互参照の有無は、1 ページだけからは断定できません。クロール予算内に代替ページを取得できていない場合、finding は
needs_apiです。一方からだけ見た状態は、一方向リンクの証拠にはなりません。