# よくあるエラーと対処

> 症状から原因と手当てを引く。サイトを作る人と、管理画面を使うお店の人の両方で起きるもの。

URL: https://sitekit.example/docs/troubleshooting

## 値が入らない（HTML の文言のまま）

1. **1分待つ。** 公開 JSON は 60 秒キャッシュされます
2. **中継の環境変数を確かめる。** `CMS_SITE` と `CMS_ORIGIN` のどちらかが無いと、中継は何もしません
3. **GET で確かめる。** `curl -sD - -o /dev/null https://example.com/ | grep -i sitekit` で `x-sitekit-rendered: 1` が出れば中継は効いています。`curl -I`（HEAD）では付かないので、効いていないと誤解しないこと
4. **キーの綴りを確かめる。** `data-cms="hours.days"` は schema.json の `groups[].key` と `fields[].key` の組み合わせです
5. **一覧が空なら公開状態を確かめる。** 下書きの記事は載りません

## 一部の表示が崩れる・閉じタグが余る

印を付けた要素の中に、同じタグ名の要素が入っています。`<div data-cms="x"><div>…</div></div>` は壊れます。中を `<span>` など別のタグにします。

## 属性が付かない

- `data-cms-attr` を1つの要素に2つ書いていませんか（`href:url data-color:color`）。2つ書くとどちらも付きません。要素を分けます
- タグ名・属性名が大文字だと無視されます
- URL を入れる属性に `javascript:` などで始まる値は入りません

## お知らせの欄が空のまま（「まだありません」も出ない）

`data-cms-filter` で0件になると、行も `data-cms-empty` も出ません。`data-cms-empty` が見るのは一覧そのものが空かどうかです。タグページでは、中継が絞り込んだ一覧を使います（[直せる箇所の印](https://sitekit.example/docs/cms#タグ)）。

## 記事ページの `<title>` や OGP がサイト共通の値になる・`<title>` が2つ出る

`<head>` にも `<template data-cms-entry="news">` を置き、その中に `<title>` や `<meta>` を書きます。静的な `<title>` には `data-cms-fallback="news"` を付けます（[記事ごとのページ](https://sitekit.example/docs/cms#記事ごとのページ)）。

## 文字色やタグの色が付かない

サイトの CSS に `.sk-c-red` などの6色や、`.sk-tag[data-color=…]` を書いていません。属性は出ているのに規則が無い状態です。6色とも最初に書きます。

## 値が二重に入る・一覧の値がおかしい

中継を使うサイトで、script に `data-embed` も付けています。埋め込みは2回実行できません。`data-embed` を外します。

## 「入力内容をご確認ください」と出る（`invalid_request`）

- `required` の項目が空です
- 型の制約を超えています（`text` は 200 文字まで、`email` の形でない など）
- 入力の `name` と schema.json の `fields[].key` を確かめます。誤りのある項目には `aria-invalid="true"` が付きます

## 送信すると `not_found` になる

`data-sitekit-form="…"` の値が schema.json の `forms[].key` と一致していないか、`data-site` のサイト ID が違います。

## 送信ボタンを押すと「送信できませんでした」

- ブラウザの開発者ツールで CORS のエラーが出ているなら、そのページのオリジンがサイトの許可オリジンに入っていません（スキーム・ポートまで完全一致）。この場合も送信は保存されていることがあります
- `rate_limited` は同じ接続元から 10 分に 20 件を超えたときです。時間をおけば送れます

## チェックボックスの値が1つしか届かない

同じ `name` を複数使うと最後の値だけが送られます。キーを分けます（`topic_a`、`topic_b`）。

## 送ったのに届いていない

- **ハニーポット（`_hp`）が埋まっていないか。** 埋まった送信は、画面上は成功に見えても保存されません。`autocomplete="off"` と `tabindex="-1"` を付け、画面の外に置きます
- 管理画面のお問い合わせ一覧にあるなら、保存はされています。届いていないのは通知です（次へ）

## 通知が届かない

お問い合わせの詳細で、通知ごとの成否を見ます。✗ は「連絡が届いていない」であって「お問い合わせが消えた」ではありません。失敗した通知は再送できます。

- **何も記録されていない** — その通知が設定されていません。管理画面の「設定 → 各フォーム」で宛先を入れ、オンにします
- **Slack** — チャンネルを消した・アプリを外したときは、Webhook URL を発行し直して入れ直します
- **お礼メールが送られない** — フォームに `type: "email"` の項目があり、値が入っているときだけ送られます
- **schema.json を直したのに宛先が変わらない** — 宛先は schema.json では決めていません。管理画面の設定が正本です

## GTM でフォーム送信が数えられない

- 管理画面で完了イベント名を変えたのに、GTM のトリガーが古い名前のままになっていませんか
- 中継を使うサイトで `data-gtm` と管理画面の GTM ID の両方を書くと、コンテナが食い違います。`data-gtm` を外します
- GTM のプレビューでフォームを実際に送り、イベント一覧に完了イベントが出るか確かめます

## 検索結果にプレビューのページが出る

中継の `CMS_INDEXABLE_HOSTS` に本番のホストだけを書きます（[中継とホスティング](https://sitekit.example/docs/hosting#検索避けcms_indexable_hosts)）。

## 既存の記事の見え方が変わった

本文の書き方（`**太字**`・`[文字](URL)`・`{color:…}`・素の URL の自動リンク）は、前に書いた記事にも効きます。記号として書いた `**` が太字になるのが一番多い形です。本文を検索して `**` を確かめます。

## 管理画面: ログインできない

ログインを何度も間違えると、しばらくロックされます（ログイン ID と接続元ごとに 10 分に 5 回、ログイン ID ごとに 10 分に 50 回）。**10 分待てば自然に解けます。** 解けないときは、パスワード・ログイン ID の誤りか、担当から外れていないかを確かめます。

## 管理画面: パスワードを変えたら他の端末がログアウトした

仕様です。パスワードを変えると、安全のため他の端末（お店のタブレットなど）はいったんログアウトされます。新しいパスワードで入り直します。

## 管理画面: 動画や写真がアップロードできない

- 受け付ける動画は **MP4（H.264）だけ**です。iPhone の `.mov`（HEVC）や HEIC の写真は、ブラウザで再生・表示できないため受け付けません。拡張子を変えても通りません
- iPhone は「設定 → カメラ → フォーマット → **互換性優先**」にすると、以後の撮影が MP4・JPEG になります（撮影済みのものは変わりません）
- **100MB を超える動画**は受け付けません。YouTube などに上げて、動画ブロックの「外部URL」に貼ります

## 管理画面: リンクを貼っても情報が取れない

リンクカードの「情報を取得」は、相手のページの `og:title` などを読みます。相手のページに OGP が無い・ログインが要る・ボットを弾いている・5秒で応答しない・HTML でない、のどれかなら取れません。異常ではないので、手で書きます。
