Google検索でFAQが折りたたみ形式で展開表示されると、クリック前に答えが見える—— 検索結果ページのリアルエステートを広げる最も手軽な方法がFAQPageスキーマです。 この記事では、FAQPageスキーマ(JSON-LD形式)の正しい書き方と、 Googleのよくある質問リッチリザルトが表示される条件・注意点を実例付きで解説します。
FAQPageスキーマとは
FAQPageスキーマとは、ウェブページのFAQセクションの内容をGoogleが機械的に読み取れる形式で宣言するための構造化データです。 Schema.org(Googleなどが共同策定したデータ語彙の標準)で定義されており、 JSON-LD形式で記述してHTMLの<head>タグ内に埋め込みます。
Googleがこの構造化データを認識すると、検索結果ページで質問と回答のリストが 折りたたみ式で表示される「よくある質問リッチリザルト」が出ることがあります。 通常の青リンク1行に比べて表示領域が2〜5倍に広がり、クリック率(CTR)の向上が期待できます。
ただし、HTMLのFAQセクションが本文に実際に存在することが前提条件です。 JSON-LDだけを埋め込んで本文にFAQがない場合、Googleはリッチリザルトを表示しません。
リッチリザルトが表示される条件
Googleの公式ドキュメントに基づくと、よくある質問リッチリザルトが表示されるには次の条件を満たす必要があります。
- 本文にFAQが存在すること—— HTMLページ上に質問と回答のテキストが実際に記述されていること。 JSON-LDの内容とHTMLのテキストが一致していることが重要です。
- FAQ項目がGoogleポリシーに準拠していること—— 広告・プロモーションのみを目的としたFAQや、 不適切なコンテンツを含む場合は表示されません。
- 回答が適切な長さであること—— 極端に短い回答(数語のみ)や、1000文字を超えるような長すぎる回答は 表示されないことがあります。 目安として1回答あたり50〜300文字が適切です。
- 1ページに1つのFAQPageスキーマのみ設置すること—— 複数設置した場合は無効と判定されることがあります。
スキーマを正しく設定してもリッチリザルトが必ず表示されるとは限りません。 Googleは表示するかどうかを最終的に判断する裁量を持っており、 ページの品質評価や競合状況によって結果は異なります。
FAQPageスキーマのJSON-LD実例
次のコードは、2つのFAQ項目を持つFAQPageスキーマの最小構成例です。
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "FAQPageスキーマとは何ですか?",
"acceptedAnswer": {
"@type": "Answer",
"text": "FAQPageスキーマとは、ウェブページのFAQセクションの内容を
Googleが機械的に読み取れる形式で記述するための構造化データです。"
}
},
{
"@type": "Question",
"name": "設定すれば必ずリッチリザルトが表示されますか?",
"acceptedAnswer": {
"@type": "Answer",
"text": "いいえ、必ずしも表示されるわけではありません。ページ品質や
Googleの判断によって表示されない場合があります。"
}
}
]
}各キーの役割を確認しておきます。@contextは スキーマの語彙として schema.org を使うことを宣言します。@type: "FAQPage"で このスキーマがFAQページであることを示し、mainEntityに Q&Aのリストを配列として格納します。 各質問は@type: "Question"、 回答はacceptedAnswerの中に@type: "Answer"で記述します。
FAQPageスキーマの設定手順
手順は大きく4ステップです。JSON-LD構造化データ生成ツールを使えば、コードを手書きせずに生成できます。
- FAQセクションをHTMLに作成する—— ページ本文に質問と回答のテキストを記述します。 HTMLにFAQが存在しない状態でJSON-LDだけ埋め込んでもリッチリザルトには反映されません。
- JSON-LDを生成する——JSON-LD構造化データ生成ツールでFAQPageを選択し、質問と回答を入力して「JSON-LDを生成する」をクリックします。 生成されたコードはJSON整形/検証ツールでバリデーションしてから使うと安心です。
- scriptタグをheadに貼り付ける—— 生成された
<script type="application/ld+json">タグをHTMLの<head>内にコピーして貼り付けます。 bodyタグ内への配置でも技術的には動作しますが、headへの配置が一般的です。 - Googleリッチリザルトテストで検証する——GoogleリッチリザルトテストにURLまたはHTMLコードを入力し、「FAQPage」が検出されていれば設置完了です。 エラーや警告が表示された場合は内容に従って修正します。
よくある落とし穴
FAQPageスキーマを設定してもリッチリザルトが表示されない原因の多くは、 次のいくつかのパターンに当てはまります。
| 落とし穴 | 症状・原因 | 対処法 |
|---|---|---|
| HTMLにFAQが存在しない | JSON-LDだけ埋め込み、本文にQ&Aテキストがない | ページ本文にFAQセクションを追加する |
| 回答が短すぎる | 「はい」「違います」など一言回答 | 50文字以上の具体的な説明を加える |
| 1ページに複数のFAQPageスキーマ | コンポーネントを複数配置して重複 | 1つのFAQPageにmainEntityをまとめる |
| JSON-LDの構文エラー | カンマ抜け・引用符のズレなど | JSON整形ツールでバリデーションする |
| インデックスが古い | スキーマ追加後にGoogleが再クロールしていない | Search ConsoleのURL検査からインデックス登録をリクエストする |
Next.jsでの実装例
Next.js(App Router)では、generateMetadataと別に、layout.tsxまたは各ページのpage.tsx内で次のようにJSON-LDをscriptタグとして出力します。
// app/tools/[slug]/page.tsx の例
const faqSchema = {
'@context': 'https://schema.org',
'@type': 'FAQPage',
mainEntity: faqItems.map((item) => ({
'@type': 'Question',
name: item.q,
acceptedAnswer: {
'@type': 'Answer',
text: item.a,
},
})),
}
export default function ToolPage() {
return (
<>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(faqSchema) }}
/>
{/* ページ本文 */}
</>
)
}faqItemsの配列を単一ソースとしてHTMLのFAQセクションとJSON-LDの両方に使うと、 内容のズレが起きにくくなります。 ぱんだツールズでもこのパターンを採用しています。
まとめ
- FAQPageスキーマはQ&Aを構造化データとしてGoogleに宣言し、リッチリザルト表示を狙う仕組み
- JSON-LD形式で記述し、HTMLの
<head>内のscriptタグに埋め込む - ページ本文にFAQセクションが存在しない場合、リッチリザルトには反映されない
- 1ページに設置するFAQPageスキーマは1つのみ。複数配置すると無効になる
- 回答は50〜300文字程度が目安。極端に短い回答は避ける
- 設定後はGoogleリッチリザルトテストで検証し、Search Consoleで再クロールをリクエストする
- JSON-LD構造化データ生成ツールを使えばFAQPageスキーマをコード不要で生成できる