2026年10月25日
2026年10月25日
WordPressに構造化データ(schema.org・JSON-LD)を追加する方法|記事・パンくず・組織
構造化データは、ページの内容(記事の題名や公開日、パンくず、運営組織など)を、検索エンジンが読み取れる形で書いたものです。語彙には schema.org を使い、書式は JSON-LD がよく使われます。Google は構造化データを使って、パンくずや商品の価格などを検索結果に表示することがあります(リッチリザルト)。ただし、構造化データを入れても表示されるとは限りません。
WordPress の本体は構造化データを出力しません。この記事では、すでに出力されていないかを確かめたうえで、記事・パンくず・組織の構造化データを自分のコードで追加する方法を説明します。Google の対応状況は2026年10月時点の公式ドキュメントにもとづいています。
まず、すでに出力されていないか確認する
次のものは、構造化データを自動で出力します。同じ種類を二重に出すと、どちらが正しいのか分かりにくくなるので、先に確認します。
| 出力するもの | 内容 |
|---|---|
| Yoast SEO、Rank Math、All in One SEO などのSEOプラグイン | 記事・パンくず・組織などをまとめて出力する |
| WooCommerce | 商品ページに Product を出力する |
| テーマ | テーマによってはパンくずなどを出力する |
確認は、ページのソースを表示して application/ld+json を検索するのが簡単です。コマンドで調べる場合は次のようにします。
curl -s https://example.com/sample-post/ | grep -o '<script type="application/ld+json"[^>]*>[^<]*'
SEOプラグインが必要な種類を出力しているなら、そのプラグインの設定で調整するほうが管理しやすく、この記事のコードは不要です。プラグインの比較は WordPressのスキーマ(構造化データ)プラグイン比較 を参照してください。
コードを置く場所
テーマを更新しても消えないように、次のどちらかに置きます。
wp-content/mu-plugins/wpdr-schema.phpとして保存する(自動で読み込まれるプラグインになり、管理画面から無効にできない)wp-content/plugins/wpdr-schema/wpdr-schema.phpとして保存し、「プラグイン」画面で有効化する
子テーマの functions.php に書いてもかまいませんが、テーマを変えると出力も止まります。以下のコードは1つのファイルにまとめて使えます。先頭に次の部分を置きます。
<?php
/**
* Plugin Name: WPDR Schema
* Description: 投稿・パンくず・組織の構造化データ(JSON-LD)を出力する
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
// HTMLタグと文字参照(& など)を取り除いた文字列にする
function wpdr_text( $text ) {
return html_entity_decode( wp_strip_all_tags( (string) $text ), ENT_QUOTES, 'UTF-8' );
}
// JSON-LD を script タグで出力する
function wpdr_print_json_ld( array $data ) {
echo '<script type="application/ld+json">' . wp_json_encode( $data, JSON_UNESCAPED_UNICODE ) . '</script>' . "\n";
}
wp_json_encode() は既定で / を \/ と書くので、本文に </script> という文字列があっても script タグが途中で閉じません。JSON_UNESCAPED_SLASHES は付けないでください。JSON_UNESCAPED_UNICODE は日本語をUnicodeエスケープ(バックスラッシュと u に続く16進数4桁)に変えず、そのまま出して読みやすくするためのもので、付けなくても JSON としては正しく読み取られます。
記事(BlogPosting)
投稿ページに、題名・公開日・更新日・著者・アイキャッチ画像を出力します。Google の記事の構造化データには必須の項目が無く、headline、datePublished、dateModified、author(name と url)、image が推奨されています。
add_action( 'wp_head', 'wpdr_article_schema' );
function wpdr_article_schema() {
if ( ! is_singular( 'post' ) ) {
return;
}
$post = get_queried_object();
$data = array(
'@context' => 'https://schema.org',
'@type' => 'BlogPosting',
'headline' => wpdr_text( $post->post_title ),
'datePublished' => get_the_date( 'c', $post ),
'dateModified' => get_the_modified_date( 'c', $post ),
'author' => array(
'@type' => 'Person',
'name' => wpdr_text( 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 );
}
if ( has_excerpt( $post ) ) {
$data['description'] = wpdr_text( $post->post_excerpt );
}
wpdr_print_json_ld( $data );
}
- 日付の
cは、2026-10-15T09:00:00+09:00のような ISO 8601 形式です。「設定」→「一般」のタイムゾーンが反映されます author.urlには著者を特定できるページを指定します。SEOプラグインなどで著者アーカイブを無効にしている場合は、プロフィールページのURLに変えてください- 画像は、アイキャッチ画像がある投稿だけに出します。Google は幅×高さが5万ピクセル以上の画像を推奨しています
- 抜粋は手入力したものだけを使います。自動生成の抜粋は末尾に
[…]が付くためです
パンくず(BreadcrumbList)
投稿では「ホーム → カテゴリー → 記事」、固定ページでは「ホーム → 親ページ → ページ」の順に出力します。
add_action( 'wp_head', 'wpdr_breadcrumb_schema' );
function wpdr_breadcrumb_schema() {
if ( ! is_singular( array( 'post', 'page' ) ) || is_front_page() ) {
return;
}
$post = get_queried_object();
$trail = array(
array(
'name' => 'ホーム',
'item' => home_url( '/' ),
),
);
if ( 'post' === $post->post_type ) {
$cats = get_the_category( $post->ID );
if ( $cats ) {
$trail[] = array(
'name' => wpdr_text( $cats[0]->name ),
'item' => get_category_link( $cats[0] ),
);
}
} else {
foreach ( array_reverse( get_post_ancestors( $post ) ) as $ancestor_id ) {
$trail[] = array(
'name' => wpdr_text( get_post_field( 'post_title', $ancestor_id ) ),
'item' => get_permalink( $ancestor_id ),
);
}
}
// 最後(今のページ)は item を省略できる
$trail[] = array( 'name' => wpdr_text( $post->post_title ) );
$items = array();
foreach ( $trail as $i => $crumb ) {
$items[] = array_merge(
array(
'@type' => 'ListItem',
'position' => $i + 1,
),
$crumb
);
}
wpdr_print_json_ld(
array(
'@context' => 'https://schema.org',
'@type' => 'BreadcrumbList',
'itemListElement' => $items,
)
);
}
- Google の仕様では、各項目に
nameとposition、最後以外の項目にitem(URL)が必要です。最後の項目のitemを省くと、そのページのURLが使われます - 投稿が複数のカテゴリーに属する場合、
get_the_category()の1件目を使います。テーマが画面に表示しているパンくずと順番や名前が違う場合は、画面の表示に合わせてください
パンくずの考え方は WordPressのBreadcrumbListスキーマ設定方法 でも説明しています。
運営組織(Organization)
トップページに、サイトの運営組織の名前・URL・ロゴを出力します。Google はロゴの表示などにこの情報を使います。
add_action( 'wp_head', 'wpdr_organization_schema' );
function wpdr_organization_schema() {
if ( ! is_front_page() ) {
return;
}
$data = array(
'@context' => 'https://schema.org',
'@type' => 'Organization',
'name' => wpdr_text( get_bloginfo( 'name' ) ),
'url' => home_url( '/' ),
);
// カスタマイザーのロゴ、無ければサイトアイコンを使う
$logo_id = get_theme_mod( 'custom_logo' );
$logo = $logo_id ? wp_get_attachment_image_url( $logo_id, 'full' ) : get_site_icon_url( 512 );
if ( $logo ) {
$data['logo'] = $logo;
}
// 公式のSNSアカウントなどがあればURLを書く
$same_as = array(
// 'https://x.com/example',
);
if ( $same_as ) {
$data['sameAs'] = $same_as;
}
wpdr_print_json_ld( $data );
}
サイト名を組織名にしていますが、会社名が違う場合は name を書き換えます。sameAs には、実際に運用している公式アカウントのURLだけを書きます。個人のブログなら、Organization ではなく Person を使う選択もあります。詳しくは WordPressにOrganizationスキーマ(JSON-LD)を設定する方法 を参照してください。
WooCommerce の商品に項目を足す
WooCommerce は商品ページに Product の構造化データを標準で出力します。自分で Product を別に出力すると商品が二重になるので、足りない項目はフィルター woocommerce_structured_data_product で追記します。次はブランドを足す例です。
add_filter( 'woocommerce_structured_data_product', 'wpdr_wc_product_markup', 10, 2 );
function wpdr_wc_product_markup( $markup, $product ) {
$markup['brand'] = array(
'@type' => 'Brand',
'name' => 'ブランド名',
);
return $markup;
}
$product は商品のオブジェクトなので、商品ごとに値を変えたい場合はカスタムフィールドなどから読み出します。Product の詳しい項目は WordPressでProductスキーマを実装してGoogleのショッピング系検索結果に対応する方法 で説明しています。
FAQPage の現状
Google は、よくある質問(FAQPage)のリッチリザルトを、2023年8月に政府と保健医療の有名サイトだけに絞り、2026年5月7日からは検索結果に表示しなくなりました。FAQPage は schema.org の型としては今も有効ですが、Google の検索結果で質問と回答が開閉表示されることはありません。同じように、HowTo のリッチリザルトも2023年に終了しています。
FAQ の構造化データをこれから追加しても、Google の検索結果の見た目は変わりません。既に出力している場合に、急いで削除する必要もありません。
出力を検証する
- 対象のページを開き、ソースに
application/ld+jsonが出ていることを確認する - リッチリザルトテスト にURLを入力し、Google が対応する種類(記事、パンくずリストなど)が検出され、エラーが無いことを確認する
- Google 以外の型も含めて文法を確かめたい場合は、Schema Markup Validator を使う
- 公開後は Search Console のリッチリザルトのレポート(パンくずリストなど)でエラーを確認する
キャッシュ系のプラグインやサーバーのキャッシュを使っている場合は、コードを追加したあとにキャッシュを削除してから確認します。
注意点
- 構造化データには、ページに表示されている内容だけを書きます。画面に無いレビューや質問を構造化データにだけ書くと、Google のガイドライン違反として扱われることがあります
- 同じ種類を複数の仕組み(プラグイン・テーマ・自作コード)から出さないようにします
- 構造化データは検索順位を上げるためのものではなく、内容を正しく伝えるためのものです。リッチリザルトが表示されるかどうかは Google が判断します
まとめ
- WordPress 本体は構造化データを出力しない。SEOプラグイン・WooCommerce・テーマが出力していないかを先に確かめる
- 自作する場合は、
wp_headで JSON-LD をwp_json_encode()して出力する - 記事は
BlogPosting、パンくずはBreadcrumbList、トップページはOrganizationを出す - WooCommerce の商品は自前で出さず、
woocommerce_structured_data_productで追記する - FAQ のリッチリザルトは2026年5月で終了した
- リッチリザルトテストと Search Console で検証する
関連記事: