構造化データの書き方|JSON-LDの基本からコピペ例・テスト方法まで
「構造化データを入れたほうがいい」と聞いたけど、何をどう書けばいいかわからない——そんな方のための実装ガイドです。
構造化データとは、ページの内容を検索エンジンやAIに機械的に伝えるためのマークアップです。2026年現在、Googleのリッチリザルトだけでなく、ChatGPTやPerplexityなどのAI検索エンジンもJSON-LDを参照してサイト情報を理解しています。
この記事では、JSON-LDの基本構文から、コピペで使える5種類のテンプレート、プラットフォーム別の追加方法、テストツールの使い方まで、読み終わったらすぐ実装できる状態を目指します。
実装前に現状を把握したい方は、無料診断ツールで構造化データの実装状況を自動チェックできます。
JSON-LDとは?3つの形式の比較と推奨理由
構造化データの記述形式は3種類あります。結論から言えば、JSON-LDを使ってください。
| 形式 | 記述場所 | 特徴 | Google推奨 |
|---|---|---|---|
| JSON-LD | <script>タグ内 |
HTMLと完全に分離。追加・削除が容易 | ✅ 推奨 |
| Microdata | HTML属性 | HTMLタグに直接埋め込む。保守が困難 | △ サポート |
| RDFa | HTML属性 | Microdataと似た方式。複雑 | △ サポート |
Google公式はJSON-LDを推奨しています。理由は明確です。
JSON-LDの利点:
- HTMLの構造を一切変更しない(
<head>か<body>に<script>を1つ追加するだけ) - デザイン変更の影響を受けない
- CMSやテンプレートエンジンで動的生成しやすい
- コピペで追加・削除できる
- バリデーションツールでの検証が容易
Microdataの問題点:
<!-- Microdata: HTMLに属性を埋め込む必要がある -->
<div itemscope itemtype="https://schema.org/Organization">
<span itemprop="name">テスト株式会社</span>
<a itemprop="url" href="https://example.com">サイト</a>
</div>
<!-- JSON-LD: HTMLとは完全に独立 -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "テスト株式会社",
"url": "https://example.com"
}
</script>
Microdataはデザイン変更のたびに壊れるリスクがあります。JSON-LDなら<script>タグを1つ管理するだけです。
JSON-LDの基本構文
すべてのJSON-LDは以下の構造を持ちます。
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "スキーマの種類",
"プロパティ名": "値"
}
</script>
@context: 常に"https://schema.org"(語彙の定義元)@type: データの種類(Organization、Article等)- その他: スキーマごとに定義されたプロパティ
設置場所は<head>内が推奨ですが、<body>内でも動作します。
コピペで使える構造化データ5種類
以下の5種類を優先度順に解説します。すべて完全なJSON-LDコードなので、自社情報に書き換えてそのまま使えます。
1. Organization(組織情報)— 全サイト必須
サイト運営者が誰かをAIに伝える最も基本的なスキーマです。トップページに1つ設置してください。
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "株式会社サンプル",
"url": "https://example.com",
"logo": "https://example.com/images/logo.png",
"description": "Webマーケティング支援を行う企業です",
"foundingDate": "2018-04-01",
"address": {
"@type": "PostalAddress",
"addressLocality": "渋谷区",
"addressRegion": "東京都",
"addressCountry": "JP"
},
"contactPoint": {
"@type": "ContactPoint",
"email": "info@example.com",
"contactType": "customer service",
"availableLanguage": "Japanese"
},
"sameAs": [
"https://twitter.com/example",
"https://www.facebook.com/example"
]
}
書き換えポイント:
name: 正式な法人名(登記名と一致させる)logo: 絶対URLで指定。推奨サイズ112×112px以上sameAs: 公式SNSアカウントのURL(あるだけ追加)
2. Article / BlogPosting(記事情報)— ブログ必須
記事の著者・公開日・更新日をAIに伝えます。すべてのブログ記事に設置してください。
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "構造化データの書き方|JSON-LDの基本からコピペ例まで",
"datePublished": "2026-05-07",
"dateModified": "2026-05-07",
"author": {
"@type": "Person",
"name": "田中太郎",
"url": "https://example.com/author/tanaka"
},
"publisher": {
"@type": "Organization",
"name": "株式会社サンプル",
"logo": {
"@type": "ImageObject",
"url": "https://example.com/images/logo.png"
}
},
"image": "https://example.com/images/article-thumbnail.jpg",
"description": "JSON-LDの書き方を初心者向けに解説します",
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://example.com/blog/structured-data-guide"
}
}
書き換えポイント:
headline: 記事タイトル(60文字以内推奨)datePublished/dateModified: ISO 8601形式(YYYY-MM-DD)author: 実在する著者情報。urlは著者プロフィールページ@type: ニュース記事ならNewsArticle、ブログならBlogPosting、汎用ならArticle
3. BreadcrumbList(パンくずリスト)— 全ページ推奨
サイト内のページ階層をAIに伝えます。検索結果でパンくず表示されるメリットもあります。
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "ホーム",
"item": "https://example.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "ブログ",
"item": "https://example.com/blog/"
},
{
"@type": "ListItem",
"position": 3,
"name": "構造化データの書き方"
}
]
}
書き換えポイント:
position: 1から順番に(ホームが1)- 最後の項目(現在のページ)には
item(URL)を省略可 - 階層が深い場合も全レベルを記述する
4. FAQPage(よくある質問)— FAQ掲載ページ
質問と回答のペアをAIに伝えます。AI検索エンジンはQ&A形式の情報を引用しやすい傾向があります。
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "構造化データとは何ですか?",
"acceptedAnswer": {
"@type": "Answer",
"text": "構造化データとは、Webページの内容を検索エンジンやAIが機械的に理解できるようにするためのマークアップです。JSON-LD形式でHTMLに追加します。"
}
},
{
"@type": "Question",
"name": "JSON-LDはどこに設置しますか?",
"acceptedAnswer": {
"@type": "Answer",
"text": "HTMLの<head>タグ内に<script type=\"application/ld+json\">として追加します。<body>内でも動作しますが、<head>内が推奨です。"
}
},
{
"@type": "Question",
"name": "構造化データを入れると検索順位は上がりますか?",
"acceptedAnswer": {
"@type": "Answer",
"text": "構造化データ自体は直接的なランキング要因ではありません。ただし、リッチリザルト表示によるCTR向上や、AIによる正確な情報理解を通じて間接的に効果があります。"
}
}
]
}
書き換えポイント:
name: 実際にユーザーが検索しそうな質問文にするtext: HTML上のFAQ本文と内容を一致させる(不一致はペナルティ対象)- 質問数: 3〜10個が適切。多すぎると逆効果
注意: Google公式によると、FAQPageのリッチリザルト表示は現在、政府系・医療系サイトに限定されています。ただしAI検索エンジンはFAQ構造を参照するため、実装する価値はあります。
5. Product(商品情報)— EC・サービスサイト
商品やサービスの価格・レビュー情報をAIに伝えます。ECサイトやSaaSの料金ページに設置します。
{
"@context": "https://schema.org",
"@type": "Product",
"name": "プレミアムプラン",
"description": "全機能が使える上位プラン。月間レポート付き。",
"image": "https://example.com/images/premium-plan.jpg",
"brand": {
"@type": "Brand",
"name": "株式会社サンプル"
},
"offers": {
"@type": "Offer",
"price": "9800",
"priceCurrency": "JPY",
"availability": "https://schema.org/InStock",
"url": "https://example.com/pricing"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.5",
"reviewCount": "128"
}
}
書き換えポイント:
price: 税込価格を数値で(カンマなし)priceCurrency: 日本円は"JPY"availability:InStock/OutOfStock/PreOrderから選択aggregateRating: レビュー機能がない場合は省略(架空の数値は禁止)
プラットフォーム別の追加方法
WordPress(Yoast SEO)
Yoast SEOを使えば、コードを書かずに構造化データを出力できます。
自動出力されるもの:
- Organization(「SEO」→「検索での見え方」→「組織」で設定)
- Article/BlogPosting(投稿ごとに自動生成)
- BreadcrumbList(「SEO」→「検索での見え方」→「パンくずリスト」を有効化)
手動追加が必要なもの:
- FAQPage → 「Yoast FAQ Block」をエディタで追加
- Product → WooCommerce連携、またはカスタムコードで追加
カスタムJSON-LDを追加する方法(functions.php):
function add_custom_jsonld() {
if (is_front_page()) {
?>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "株式会社サンプル",
"url": "<?php echo home_url(); ?>",
"logo": "<?php echo get_template_directory_uri(); ?>/images/logo.png"
}
</script>
<?php
}
}
add_action('wp_head', 'add_custom_jsonld');
Shopify
Shopifyは商品ページのProduct構造化データを自動出力します。追加で必要なものはテーマのliquidファイルに記述します。
theme.liquid の </head> 直前に追加:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "{{ shop.name }}",
"url": "{{ shop.url }}",
"logo": "{{ 'logo.png' | asset_url }}"
}
</script>
ブログ記事テンプレート(article.liquid):
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "{{ article.title | escape }}",
"datePublished": "{{ article.published_at | date: '%Y-%m-%d' }}",
"dateModified": "{{ article.updated_at | date: '%Y-%m-%d' }}",
"author": {
"@type": "Person",
"name": "{{ article.author }}"
}
}
</script>
Next.js(App Router)
Next.jsではlayout.tsxまたは各page.tsxで<script>タグを出力します。
app/layout.tsx(全ページ共通のOrganization):
export default function RootLayout({ children }: { children: React.ReactNode }) {
const orgJsonLd = {
"@context": "https://schema.org",
"@type": "Organization",
name: "株式会社サンプル",
url: "https://example.com",
logo: "https://example.com/images/logo.png",
};
return (
<html lang="ja">
<head>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(orgJsonLd) }}
/>
</head>
<body>{children}</body>
</html>
);
}
app/blog/[slug]/page.tsx(記事ページ):
export default function BlogPost({ params }: { params: { slug: string } }) {
const post = getPostBySlug(params.slug);
const articleJsonLd = {
"@context": "https://schema.org",
"@type": "BlogPosting",
headline: post.title,
datePublished: post.date,
dateModified: post.updatedAt || post.date,
author: { "@type": "Person", name: post.author },
publisher: { "@type": "Organization", name: "株式会社サンプル" },
description: post.description,
};
const breadcrumbJsonLd = {
"@context": "https://schema.org",
"@type": "BreadcrumbList",
itemListElement: [
{ "@type": "ListItem", position: 1, name: "ホーム", item: "https://example.com/" },
{ "@type": "ListItem", position: 2, name: "ブログ", item: "https://example.com/blog/" },
{ "@type": "ListItem", position: 3, name: post.title },
],
};
return (
<>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(articleJsonLd) }}
/>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(breadcrumbJsonLd) }}
/>
<article>{/* 記事本文 */}</article>
</>
);
}
静的HTML
CMSを使わない静的サイトの場合、<head>タグ内に直接記述します。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ページタイトル</title>
<!-- 構造化データ: Organization -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "株式会社サンプル",
"url": "https://example.com",
"logo": "https://example.com/images/logo.png"
}
</script>
<!-- 構造化データ: BreadcrumbList -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{"@type": "ListItem", "position": 1, "name": "ホーム", "item": "https://example.com/"},
{"@type": "ListItem", "position": 2, "name": "サービス"}
]
}
</script>
</head>
<body>
<!-- ページ本文 -->
</body>
</html>
ポイント: 1ページに複数の<script type="application/ld+json">を設置できます。Organization + BreadcrumbList + Articleのように、役割ごとに分けて記述するのが保守しやすい方法です。
テスト方法(実装後の検証)
JSON-LDを追加したら、必ずテストツールで検証してください。構文エラーがあると、検索エンジンに無視されます。
1. Google リッチリザルトテスト(最重要)
URL: https://search.google.com/test/rich-results
Googleが公式に提供するテストツールです。URLを入力するか、コードを直接貼り付けて検証できます。
確認できること:
- 構造化データが正しく認識されているか
- リッチリザルトの対象になるか
- エラー・警告の詳細
使い方:
- テストしたいページのURLを入力
- 「URLをテスト」をクリック
- 検出されたスキーマの一覧が表示される
- エラーがあれば赤色、警告は黄色で表示
よくあるエラー例:
Missing field "name"→ 必須プロパティが未設定Invalid URL in field "url"→ URLの形式が不正Value for field "datePublished" is invalid→ 日付形式がISO 8601でない
2. Schema Markup Validator
URL: https://validator.schema.org/
Schema.org公式のバリデーターです。Googleのツールよりも厳密にスキーマの仕様準拠を検証します。
使い分け:
- リッチリザルトテスト → Googleが認識するかの確認(実用面)
- Schema Markup Validator → 仕様に準拠しているかの確認(正確性)
両方でエラーがなければ問題ありません。
3. Chrome DevToolsでの確認
ブラウザで手軽に確認する方法です。
1. 対象ページを開く
2. F12(DevTools)→ Elementsタブ
3. Ctrl+F で "application/ld+json" を検索
4. <script>タグの中身を確認
JSON部分をコピーして、JSONLintに貼り付ければ構文エラーを検出できます。
4. Google Search Console での継続監視
実装後は、Google Search Consoleの「拡張」セクションで構造化データの状態を継続的に監視できます。
確認手順:
- Search Console → 左メニュー「拡張」
- 「パンくずリスト」「FAQ」「記事」等の項目を確認
- エラーがあるページを特定して修正
Search Consoleは数日〜数週間のタイムラグがあるため、実装直後はリッチリザルトテストで確認し、その後Search Consoleで継続監視する流れが効率的です。
AI検索と構造化データの関係
2026年現在、構造化データはGoogle検索だけでなく、AI検索エンジンにとっても重要な情報源です。
ChatGPT・Perplexityは構造化データをどう使うか
AI検索エンジンがWebページを参照する際、以下の情報を構造化データから取得しています。
| 取得情報 | 使われ方 | 対応スキーマ |
|---|---|---|
| サイト運営者 | 情報源の信頼性判断 | Organization |
| 記事の著者・公開日 | 鮮度・権威性の評価 | Article/BlogPosting |
| ページ階層 | サイト構造の理解 | BreadcrumbList |
| Q&Aペア | 質問への直接回答 | FAQPage |
| 商品情報 | 価格比較・推薦 | Product |
具体的な影響:
- ChatGPT検索: OAI-SearchBotがクロールする際、JSON-LDから
datePublishedを読み取り、情報の鮮度を判断します。古い日付の記事より、最近更新された記事が優先される傾向があります - Perplexity: 回答に引用する際、Organization情報から情報源の名前を正確に表示します。構造化データがないと、ドメイン名だけが表示される場合があります
- Google AI Overview: Google公式は「AI機能に表示されるための追加要件はない」としていますが、構造化データはコンテンツの正確な理解を助けます
構造化データがAI引用に与える間接的効果
構造化データは直接的なランキング要因ではありません。しかし、以下の経路で間接的にAI検索での引用されやすさに寄与します。
- 情報の正確な理解 — AIが「この記事は誰が、いつ書いたか」を正確に把握できる
- 鮮度シグナル —
dateModifiedにより、コンテンツが最新であることを伝えられる - 構造の明示 — FAQやHowToにより、AIが回答を抽出しやすい形式で情報を提供できる
- 信頼性の補強 — Organization + authorの組み合わせで、E-E-A-T(経験・専門性・権威性・信頼性)を機械的に伝えられる
AI検索対策の全体像については構造化データでChatGPT対策で詳しく解説しています。
よくある間違いと注意点
間違い1: JSONの構文エラーに気づかない
最も多い失敗です。カンマの過不足、引用符の閉じ忘れ、全角文字の混入でJSON全体が無効になります。
// ❌ 最後のプロパティの後にカンマがある(trailing comma)
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "テスト株式会社",
}
// ✅ 最後のプロパティにはカンマなし
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "テスト株式会社"
}
対策: 実装後に必ずリッチリザルトテストで検証する。
間違い2: HTML上の内容とJSON-LDの内容が不一致
ページに表示されている情報とJSON-LDの記述が異なると、Googleはスパムと判断する可能性があります。
- ❌ ページ上の価格は「9,800円」なのにJSON-LDでは
"price": "5000" - ❌ FAQのJSON-LDに、ページ上に存在しない質問を記述
- ✅ ページに表示されている内容をそのままJSON-LDに反映
間違い3: dateModifiedをdatePublishedより前にする
// ❌ 更新日が公開日より前
{
"datePublished": "2026-05-07",
"dateModified": "2026-04-01"
}
// ✅ 更新日は公開日以降
{
"datePublished": "2026-05-07",
"dateModified": "2026-05-07"
}
間違い4: 全ページに同じJSON-LDをコピペ
Organization(全ページ共通)は問題ありませんが、ArticleやBreadcrumbListはページごとに固有の情報を設定する必要があります。
- ❌ 全記事に同じ
headlineとdatePublished - ✅ 各記事の実際のタイトル・日付を動的に出力
間違い5: aggregateRatingを架空の数値で設定
レビュー機能がないのに"ratingValue": "4.8"のような架空の評価を設定すると、Googleの手動対策(ペナルティ)の対象になります。実際のレビューデータがない場合は、aggregateRatingを省略してください。
間違い6: 非公開ページに構造化データを設置
robots.txtやnoindexでブロックしているページに構造化データを入れても、検索エンジンはクロールできないため意味がありません。構造化データはインデックス対象のページにのみ設置してください。
よくある質問
構造化データを入れると検索順位は上がりますか?
構造化データ自体は直接的なランキング要因ではありません。Google公式も「リッチリザルトの対象になる可能性がある」としか述べていません。ただし、リッチリザルト表示によるCTR向上と、AIによる正確な情報理解を通じて間接的に効果があります。
1ページに複数のJSON-LDを設置しても問題ありませんか?
問題ありません。むしろ推奨されます。Organization + BreadcrumbList + Articleのように、役割ごとに別々の<script type="application/ld+json">タグで記述してください。1つのタグに全部まとめるより保守しやすくなります。
WordPressプラグインと手動記述はどちらがいいですか?
WordPressならYoast SEOやRank Mathの利用を推奨します。記事の公開日・更新日・著者情報を自動で出力してくれるため、手動管理の手間とミスを防げます。プラグインが対応していないスキーマ(カスタムFAQ等)のみ手動で追加してください。
JSON-LDの設置場所は<head>と<body>のどちらが正しいですか?
どちらでも動作します。Google公式は<head>内を推奨しています。テンプレートで管理しやすい場所に設置してください。
構造化データのエラーを放置するとペナルティを受けますか?
構文エラーや不完全な構造化データがあっても、検索順位が下がることはありません。単にリッチリザルトが表示されなくなるだけです。ただし、意図的に虚偽の情報を記述した場合(架空のレビュー等)は手動対策の対象になります。
まとめ
| スキーマ | 設置対象 | 優先度 | 実装難易度 |
|---|---|---|---|
| Organization | トップページ(全ページ共通可) | ★★★ 最優先 | 低 |
| Article/BlogPosting | ブログ・記事ページ | ★★★ 最優先 | 低 |
| BreadcrumbList | 全ページ | ★★☆ 高 | 低 |
| FAQPage | FAQ掲載ページ | ★★☆ 高 | 中 |
| Product | 商品・料金ページ | ★☆☆ 該当時 | 中 |
実装の手順:
- まずOrganizationをトップページに追加
- ブログ記事にArticle/BlogPostingを追加
- 全ページにBreadcrumbListを追加
- FAQがあるページにFAQPageを追加
- リッチリザルトテストで検証
構造化データは「一度正しく実装すれば、あとは自動で効果が続く」施策です。テンプレートに組み込んでしまえば、新しいページを作るたびに自動出力されます。
自社サイトの構造化データ実装状況を確認したい方は、無料診断ツールでJSON-LDの有無・必須プロパティの充実度・日付情報の設定状況を自動チェックできます。AIにそのまま渡せるMarkdown形式でレポートを出力します。
関連記事
関連記事
FAQPageスキーマはもう効かない?2026年に残すべき構造化データと代替策
2023年8月のGoogle変更でFAQPageリッチリザルトは政府・医療サイト限定に。しかしAI検索では依然有効です。残すべきケース・代替策・2026年に優先...
構造化データでChatGPT対策|JSON-LDの書き方と実装手順【2026年版】
構造化データ(JSON-LD)はChatGPT・Perplexity等のAI検索エンジンがサイト情報を正確に理解するための仕組みです。AI検索対策に効く5つのス...
ChatGPT・Perplexityからの流入を測定する方法|GA4とSearch Consoleの設定手順
ChatGPT・Perplexity・AI OverviewからのAI検索流入をGA4とSearch Consoleで測定する方法を解説。リファラーパターン、設...