構造化データとは?
構造化データとは、Webページの内容を検索エンジンが「機械的に理解できる形」で記述するマークアップだ。たとえば「このページはレシピで、調理時間は30分、カロリーは350kcal」「このページはFAQで、質問が5つある」といった情報を、HTMLの中に機械可読な形式で埋め込む。
リッチリザルトとは
構造化データを正しく実装すると、Google検索の結果に「リッチリザルト」が表示される可能性がある。リッチリザルトとは、通常の検索結果(タイトル + URL + スニペット)に加えて、星評価、FAQ、パンくずリスト、画像、価格などが表示される拡張形式のことだ。通常の検索結果より目立つため、CTR(クリック率)が大幅に向上する。
3つの記述形式
構造化データの記述形式には、JSON-LD、Microdata、RDFaの3種類がある。Googleが公式に推奨しているのはJSON-LDだ。
| 形式 |
特徴 |
Google推奨 |
| JSON-LD |
scriptタグ内にJSONで記述。HTMLと完全に分離できる |
推奨 |
| Microdata |
HTML要素に属性を追加して記述。HTMLと密結合 |
対応 |
| RDFa |
HTML要素に属性を追加。Microdataに似ている |
対応 |
Point
JSON-LDはHTMLのコンテンツと構造化データを完全に分離できるため、メンテナンス性が高い。既存のHTMLを一切変更せずにscriptタグを追加するだけで実装できるのが最大のメリットだ。この記事ではJSON-LDのみを扱う。
JSON-LDの基本構文
JSON-LDは<script type="application/ld+json">タグの中にJSON形式で記述する。以下が最小限の構造だ。
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "スキーマタイプ",
"プロパティ名": "値"
}
</script>
基本ルール
@contextは常に"https://schema.org"を指定する
@typeにはスキーマタイプ(Article、FAQPage等)を指定する
- 配置場所は
<head>内が推奨だが、<body>内のどこでもOK
- 1ページに複数のJSON-LDブロックを配置できる
- JSONの文法に従う(最後のプロパティにカンマを付けないなど)
注意
JSON-LDはJSONの文法に従うため、文法エラーがあると検索エンジンに読み取ってもらえない。特に末尾のカンマ(trailing comma)やダブルクォーテーションの閉じ忘れは頻出のミスだ。記述後は必ずバリデーションツールでチェックしよう。
よく使うスキーマ テンプレート集(コピペ可能)
ここからは、実際によく使われるスキーマタイプのJSON-LDテンプレートを紹介する。○○の部分を自分のサイト情報に書き換えてそのまま使ってほしい。
Article(記事)
ブログ記事やニュース記事に使用する。Google検索の記事リッチリザルト(見出し、画像、日付)に対応する。
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "記事のタイトル",
"description": "記事の概要(120文字以内推奨)",
"image": "https://example.com/images/article-thumbnail.jpg",
"author": {
"@type": "Person",
"name": "著者名",
"url": "https://example.com/author/profile/"
},
"publisher": {
"@type": "Organization",
"name": "サイト名",
"logo": {
"@type": "ImageObject",
"url": "https://example.com/images/logo.png"
}
},
"datePublished": "2026-03-16",
"dateModified": "2026-03-16",
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://example.com/article/"
}
}
</script>
FAQPage(よくある質問)
FAQ(よくある質問)セクションがあるページに使用する。検索結果にアコーディオン形式のFAQが表示される可能性がある。
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "質問1のテキスト",
"acceptedAnswer": {
"@type": "Answer",
"text": "回答1のテキスト"
}
},
{
"@type": "Question",
"name": "質問2のテキスト",
"acceptedAnswer": {
"@type": "Answer",
"text": "回答2のテキスト"
}
},
{
"@type": "Question",
"name": "質問3のテキスト",
"acceptedAnswer": {
"@type": "Answer",
"text": "回答3のテキスト"
}
}
]
}
</script>
Point
FAQPageのJSON-LDに含める質問と回答は、実際にページ上に表示されているFAQの内容と一致させる必要がある。ページに存在しないFAQを構造化データだけに書くのはGoogleのガイドライン違反だ。
HowTo(手順ガイド)
手順解説ページに使用する。検索結果にステップ形式の手順が表示される可能性がある。
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "○○の手順ガイド",
"description": "この手順で○○を実現する方法を解説します",
"totalTime": "PT30M",
"step": [
{
"@type": "HowToStep",
"name": "ステップ1のタイトル",
"text": "ステップ1の詳細な説明",
"url": "https://example.com/guide/#step1"
},
{
"@type": "HowToStep",
"name": "ステップ2のタイトル",
"text": "ステップ2の詳細な説明",
"url": "https://example.com/guide/#step2"
},
{
"@type": "HowToStep",
"name": "ステップ3のタイトル",
"text": "ステップ3の詳細な説明",
"url": "https://example.com/guide/#step3"
}
]
}
</script>
BreadcrumbList(パンくず)
パンくずリストを構造化データで記述する。検索結果のURLがパンくず形式で表示されるようになる。
<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": "ガイド",
"item": "https://example.com/guides/"
},
{
"@type": "ListItem",
"position": 3,
"name": "記事タイトル",
"item": "https://example.com/guides/article-name/"
}
]
}
</script>
WebApplication(Webアプリ/ツール)
オンラインツールやWebアプリケーションに使用する。アプリ名、カテゴリ、対応OSなどを記述できる。
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebApplication",
"name": "ツール名",
"description": "ツールの説明文",
"url": "https://example.com/tools/tool-name/",
"applicationCategory": "UtilitiesApplication",
"operatingSystem": "All",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "JPY"
},
"author": {
"@type": "Organization",
"name": "サイト名"
}
}
</script>
LocalBusiness(店舗・事業所)
実店舗や事業所の情報を記述する。Google検索やGoogleマップでのローカル検索結果に反映される。
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "店舗名",
"description": "店舗の説明",
"image": "https://example.com/images/shop.jpg",
"address": {
"@type": "PostalAddress",
"streetAddress": "○○1-2-3",
"addressLocality": "○○市",
"addressRegion": "○○県",
"postalCode": "000-0000",
"addressCountry": "JP"
},
"telephone": "+81-XX-XXXX-XXXX",
"url": "https://example.com/",
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "09:00",
"closes": "18:00"
}
],
"priceRange": "$$"
}
</script>
Product(商品)
商品ページに使用する。検索結果に価格、在庫状況、レビュー評価が表示される可能性がある。
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "商品名",
"description": "商品の説明",
"image": "https://example.com/images/product.jpg",
"brand": {
"@type": "Brand",
"name": "ブランド名"
},
"offers": {
"@type": "Offer",
"price": "3980",
"priceCurrency": "JPY",
"availability": "https://schema.org/InStock",
"url": "https://example.com/products/product-name/"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.5",
"reviewCount": "120"
}
}
</script>
Organization(組織)
会社や団体の情報を記述する。Google検索のナレッジパネルに反映される可能性がある。トップページに配置するのが一般的だ。
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "組織名",
"url": "https://example.com/",
"logo": "https://example.com/images/logo.png",
"description": "組織の説明",
"foundingDate": "2020-01-01",
"contactPoint": {
"@type": "ContactPoint",
"telephone": "+81-XX-XXXX-XXXX",
"contactType": "customer service",
"availableLanguage": "Japanese"
},
"sameAs": [
"https://twitter.com/example",
"https://www.facebook.com/example",
"https://www.instagram.com/example"
]
}
</script>
ツール紹介
上記のテンプレートを手動で書くのが面倒な場合は、スキーマジェネレーターを使えばフォーム入力だけで正しいJSON-LDを自動生成できる。Article・FAQ・LocalBusiness・Product・Organizationなど主要スキーマに対応している。
構造化データの検証方法
構造化データを実装したら、必ず検証ツールでエラーがないか確認しよう。JSONの文法ミスやプロパティの不足があると、リッチリザルトが表示されない。
-
Googleリッチリザルトテスト
Googleの公式ツール(https://search.google.com/test/rich-results)にURLまたはコードを入力すると、リッチリザルトの対象になるかどうかを判定してくれる。エラーや警告も表示されるので、修正箇所が一目でわかる。
-
Schema Markup Validator
Schema.orgの公式バリデーター(https://validator.schema.org/)は、JSON-LDの文法とスキーマの正しさを検証する。Google以外の検索エンジン(Bing、Yahoo等)向けの検証にも有用だ。
-
ToolShare Lab 構造化データバリデーター
構造化データバリデーターにJSON-LDコードを貼り付けるだけで、文法チェック・プロパティ検証・プレビューを一括で行える。ブラウザ上で完結するため、外部サイトにコードを送信する必要がない。
-
Chrome拡張機能
「Structured Data Testing Tool」や「SEO Meta in 1 Click」などのChrome拡張を使うと、ブラウザで表示しているページの構造化データをリアルタイムで確認できる。開発中のチェックに便利だ。
実装のベストプラクティス
構造化データは正しく実装しないとリッチリザルトが表示されないだけでなく、Googleから手動対策(ペナルティ)を受ける可能性もある。以下のルールを守ろう。
1. ページの内容と一致させる
構造化データに書いた情報は、実際にページ上に表示されている内容と一致している必要がある。たとえば、FAQPageの質問と回答がページ上に存在しない場合はガイドライン違反だ。「リッチリザルトを出すためだけに存在しない情報を書く」のは意図的なスパム行為とみなされる。
2. 必須プロパティと推奨プロパティ
各スキーマタイプには「必須プロパティ」と「推奨プロパティ」がある。必須プロパティが欠けているとリッチリザルトの対象にならない。推奨プロパティはなくてもエラーにはならないが、設定したほうがリッチリザルトの表示品質が向上する。Googleの公式ドキュメントで各スキーマの必須/推奨を確認しておこう。
| スキーマタイプ |
必須プロパティ |
推奨プロパティ |
| Article |
headline, image, datePublished, author |
dateModified, publisher, description |
| FAQPage |
mainEntity(Question + Answer) |
- |
| HowTo |
name, step |
description, totalTime, image |
| BreadcrumbList |
itemListElement(position, name, item) |
- |
| Product |
name |
image, description, offers, aggregateRating |
| LocalBusiness |
name, address |
telephone, openingHoursSpecification, image |
3. 画像URLは絶対パスで
OGPと同様、構造化データ内の画像URLはhttps://から始まる絶対パスで記述する。相対パスだとGoogleが画像を取得できず、リッチリザルトに画像が表示されない。
4. 日付はISO 8601形式で
datePublishedやdateModifiedはISO 8601形式(YYYY-MM-DDまたはYYYY-MM-DDTHH:MM:SS+09:00)で記述する。「2026年3月16日」のような日本語表記はNGだ。
NG: "datePublished": "2026年3月16日"
OK: "datePublished": "2026-03-16"
OK: "datePublished": "2026-03-16T09:00:00+09:00"
5. 複数スキーマの併用
1つのページに複数のJSON-LDブロックを配置することは問題ない。たとえば、ブログ記事ページに「Article + FAQPage + BreadcrumbList」の3つを設置するのは一般的な手法だ。それぞれ独立した<script type="application/ld+json">ブロックとして記述する。
Point
構造化データは「書けば必ずリッチリザルトが表示される」わけではない。Googleが表示するかどうかは、ページの品質、検索クエリとの関連性、ユーザーにとっての有用性など複合的な要素で判断される。正しく書くことは前提条件であり、表示を保証するものではないことを理解しておこう。
WordPress・Next.jsでの実装方法
WordPress: プラグインで自動生成
WordPressの場合、SEOプラグインが構造化データを自動生成してくれる。手動でJSON-LDを書く必要がなく、管理画面から設定するだけで対応できる。
| プラグイン |
自動生成されるスキーマ |
カスタムスキーマ |
| Yoast SEO |
Article, BreadcrumbList, Organization, WebSite |
FAQ, HowToはYoast SEO Blocksで対応 |
| Rank Math |
Article, BreadcrumbList, Organization, Product等 |
カスタムJSON-LDエディター搭載 |
| All in One SEO |
Article, BreadcrumbList, Organization |
カスタムスキーマエディター搭載 |
WordPress: 手動で追加する場合
プラグインに頼らず手動で構造化データを追加したい場合は、テーマのheader.phpに直接JSON-LDを記述するか、functions.phpにフックを追加する。
// functions.php に追加
function my_json_ld_schema() {
if (is_singular('post')) {
global $post;
$schema = array(
'@context' => 'https://schema.org',
'@type' => 'Article',
'headline' => get_the_title(),
'description' => mb_substr(get_the_excerpt(), 0, 120),
'image' => get_the_post_thumbnail_url($post->ID, 'full'),
'datePublished' => get_the_date('c'),
'dateModified' => get_the_modified_date('c'),
'author' => array(
'@type' => 'Person',
'name' => get_the_author()
),
'publisher' => array(
'@type' => 'Organization',
'name' => get_bloginfo('name'),
'logo' => array(
'@type' => 'ImageObject',
'url' => 'https://example.com/images/logo.png'
)
)
);
echo '<script type="application/ld+json">'
. json_encode($schema, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)
. '</script>';
}
}
add_action('wp_head', 'my_json_ld_schema');
Next.js(App Router)
Next.js 14以降のApp Routerでは、metadataオブジェクトに構造化データを直接記述する方法はないが、ページコンポーネント内にscriptタグとして埋め込む方法が一般的だ。
// app/article/page.tsx
export default function ArticlePage() {
const jsonLd = {
'@context': 'https://schema.org',
'@type': 'Article',
headline: '記事タイトル',
description: '記事の概要',
image: 'https://example.com/images/article.jpg',
datePublished: '2026-03-16',
dateModified: '2026-03-16',
author: {
'@type': 'Person',
name: '著者名',
},
};
return (
<>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
/>
<article>...</article>
</>
);
}
静的HTML
静的HTMLサイトの場合は、各ページの<head>内または<body>の閉じタグの直前にJSON-LDのscriptタグを直接記述する。テンプレートエンジンを使っている場合は、ページごとの変数を差し込む形にすると管理しやすい。