2026年9月17日
2026年9月17日
WordPressの構造化データ(schema.org)を正しく実装する手順と検証方法
WordPressで構造化データを実装するときは、「JSON-LD形式で、ページに実際に書かれている内容だけを、1種類の出力元から出す」ことが基本です。この記事では、まずSEOプラグインが何を出力しているかを確認し、足りない部分だけを子テーマやプラグインで追加し、Googleのツールで検証して、Search Consoleで継続的に監視するまでの手順を説明します。
構造化データで何ができて、何ができないか
構造化データは、ページの内容(記事の見出し、著者、公開日、商品の価格、レシピの材料など)を、検索エンジンが機械的に読み取れる形で記述したものです。語彙には schema.org が使われ、書式は JSON-LD・Microdata・RDFa の3種類がありますが、Google Search Central は扱いやすさから JSON-LD を推奨しています。
期待できるのは、Googleが内容を理解しやすくなることと、対応する種類であれば検索結果にリッチリザルト(星評価、パンくず、商品情報など)が表示される可能性があることです。一方で、構造化データを入れたこと自体で順位が上がるわけではなく、条件を満たしてもリッチリザルトが表示されるかどうかはGoogleが判断します。
また、Googleが対応するリッチリザルトの種類は見直しが続いています。2023年にはHowToの表示終了やFAQの表示対象の限定があり、その後も一部の種類の段階的な終了が告知されています(2026年10月現在)。実装前に、Search Central の「検索ギャラリー」で対象の種類が現在もサポートされているかを確認してください。
ステップ1:今出ている構造化データを確認する
いきなりコードを書く前に、現状の出力を調べます。多くのサイトでは、すでにSEOプラグインやテーマが何らかの構造化データを出しています。
- 対象ページをブラウザで開き、ページのソースを表示して
application/ld+jsonを検索する - Googleの「リッチリザルト テスト」にURLを入れ、検出された項目とエラー・警告を確認する
- schema.org 公式の「Schema Markup Validator」でも確認する(Google非対応の種類も含めて文法を検証できる)
Yoast SEO、Rank Math、All in One SEO などの主要なSEOプラグインは、WebSite・Organization(またはPerson)・WebPage・Article・BreadcrumbList などを、相互に参照し合う1つのグラフとして出力します。ここで別のプラグインや自作コードからも Article を出すと、同じページに Article が2つ存在する状態になり、どちらの情報が正しいのか分かりにくくなります。
確認の結果、次のどれに当たるかを判断します。
- プラグインの出力で十分:設定を整えるだけでよい(ステップ2)
- プラグインにない種類を追加したい:プラグインの拡張機能か自作コードで追加する(ステップ3)
- テーマとプラグインで重複している:どちらか一方の出力を止める
ステップ2:SEOプラグインの設定を整える
プラグインを使う場合、つまずきやすいのは「サイトの代表者」の設定です。組織サイトなら Organization として正式名称・ロゴ・公式URLを、個人ブログなら Person として名前を設定します。ここが空のままだと、記事の publisher や author が不足した状態で出力されることがあります。
ほかに確認したい点は次のとおりです。設定画面の名称や位置はプラグインのバージョンで変わるため、目的から探してください。
- 投稿タイプごとの既定のスキーマ種別(ブログ記事なら Article や BlogPosting)
- 著者ページのURLとプロフィール(author の url に使われることが多い)
- アイキャッチ画像の設定(Article の image に使われる)
- パンくずの有効化(BreadcrumbList の出力に関わる)
ステップ3:足りない種類をコードで追加する
プラグインにない種類を追加する場合は、子テーマの functions.php か、テーマ変更の影響を受けないように独自プラグイン(mu-plugin を含む)に書きます。作業前にバックアップを取り、ステージング環境で試してから本番に反映してください。
ここでは、SEOプラグインを使わないサイトで、投稿ページに Article を出力する例を示します。SEOプラグインを使っている場合は重複になるので、この例をそのまま足さないでください。
<?php
// 子テーマの functions.php、または独自プラグインに記述
add_action( 'wp_head', function () {
if ( ! is_singular( 'post' ) ) {
return;
}
$post = get_queried_object();
$data = array(
'@context' => 'https://schema.org',
'@type' => 'BlogPosting',
'headline' => wp_strip_all_tags( get_the_title( $post ) ),
'datePublished' => get_the_date( 'c', $post ),
'dateModified' => get_the_modified_date( 'c', $post ),
'author' => array(
'@type' => 'Person',
'name' => get_the_author_meta( 'display_name', $post->post_author ),
'url' => get_author_posts_url( $post->post_author ),
),
'mainEntityOfPage' => get_permalink( $post ),
);
$image = get_the_post_thumbnail_url( $post, 'full' );
if ( $image ) {
$data['image'] = array( $image );
}
echo '<script type="application/ld+json">'
. wp_json_encode( $data, JSON_UNESCAPED_UNICODE | JSON_HEX_TAG | JSON_HEX_AMP )
. '</script>' . "\n";
} );
このコードのポイントは次の3つです。
- 値は投稿データから取り出しており、ページに表示されていない情報を書き足していない
- 日付は
c形式(ISO 8601)で、タイムゾーン付きで出力される - JSONの生成は文字列連結ではなく
wp_json_encode()に任せ、JSON_HEX_TAGで<>をエスケープしてタイトルなどに含まれる文字で script タグが壊れないようにしている
SEOプラグインのグラフに項目を足したい場合は、プラグイン側の拡張用フィルターを使うほうが重複を避けられます。たとえば Yoast SEO には wpseo_schema_graph、Rank Math には rank_math/json_ld といったフィルターがありますが、引数や推奨される書き方は各プラグインの開発者向けドキュメントで確認してください。
ステップ4:ガイドラインに沿っているか確認する
構造化データで最も避けたいのは、ページに書かれていない内容をマークアップすることです。Googleのガイドラインでは、ユーザーに見えない情報や事実と異なる情報のマークアップは、リッチリザルトの対象外になったり、手動による対策の対象になったりするとされています。
よくある問題は次のとおりです。
- 自社が書いたレビューや、サイト全体の評価を各ページに Review や AggregateRating として出す
- 記事内に存在しないFAQを構造化データだけに書く
- 更新していないのに dateModified を毎日新しくする
- 価格や在庫など変化する情報を固定値で書いたまま更新しない
ステップ5:検証して、公開後も監視する
コードを反映したら、リッチリザルト テストで再度確認します。「エラー」はその項目が無効になる問題、「警告」は推奨プロパティの不足で、警告があっても無効になるわけではありません。キャッシュプラグインを使っている場合は、キャッシュを削除してからテストしないと古いHTMLで判定されます。
公開後は、Search Console の「拡張」や「ショッピング」といった区分にある各リッチリザルトのレポートで、有効なアイテム数とエラーの推移を見ます。テーマやプラグインの更新で出力が変わり、ある日から急にエラーが増えることがあるため、大きな更新の後にはレポートとテストツールの両方を見直すと安心です。
まとめ
- 構造化データは JSON-LD で、ページに実際にある内容だけを記述する
- まずソースとリッチリザルト テストで現状の出力を確認し、重複を避ける
- SEOプラグインを使うなら設定を整え、足りない種類はプラグインの拡張フィルターや独自コードで追加する
- 自作する場合は子テーマか独自プラグインに書き、
wp_json_encode()でエスケープする - 対応するリッチリザルトの種類は変わるため、検索ギャラリーと Search Console のレポートを定期的に確認する