AEO Check Blog
← 記事一覧

構造化データの書き方|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を入力するか、コードを直接貼り付けて検証できます。

確認できること:

  • 構造化データが正しく認識されているか
  • リッチリザルトの対象になるか
  • エラー・警告の詳細

使い方:

  1. テストしたいページのURLを入力
  2. 「URLをテスト」をクリック
  3. 検出されたスキーマの一覧が表示される
  4. エラーがあれば赤色、警告は黄色で表示

よくあるエラー例:

  • 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の「拡張」セクションで構造化データの状態を継続的に監視できます。

確認手順:

  1. Search Console → 左メニュー「拡張」
  2. 「パンくずリスト」「FAQ」「記事」等の項目を確認
  3. エラーがあるページを特定して修正

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検索での引用されやすさに寄与します。

  1. 情報の正確な理解 — AIが「この記事は誰が、いつ書いたか」を正確に把握できる
  2. 鮮度シグナルdateModifiedにより、コンテンツが最新であることを伝えられる
  3. 構造の明示 — FAQやHowToにより、AIが回答を抽出しやすい形式で情報を提供できる
  4. 信頼性の補強 — 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はページごとに固有の情報を設定する必要があります。

  • ❌ 全記事に同じheadlinedatePublished
  • ✅ 各記事の実際のタイトル・日付を動的に出力

間違い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 商品・料金ページ ★☆☆ 該当時

実装の手順:

  1. まずOrganizationをトップページに追加
  2. ブログ記事にArticle/BlogPostingを追加
  3. 全ページにBreadcrumbListを追加
  4. FAQがあるページにFAQPageを追加
  5. リッチリザルトテストで検証

構造化データは「一度正しく実装すれば、あとは自動で効果が続く」施策です。テンプレートに組み込んでしまえば、新しいページを作るたびに自動出力されます。

自社サイトの構造化データ実装状況を確認したい方は、無料診断ツールでJSON-LDの有無・必須プロパティの充実度・日付情報の設定状況を自動チェックできます。AIにそのまま渡せるMarkdown形式でレポートを出力します。


関連記事

この記事の内容、あなたのサイトは対応できていますか?

URLを入力するだけで、AI検索対応度を無料診断します。

無料で診断する →