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タグと文字参照(&amp; など)を取り除いた文字列にする
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 の検索結果の見た目は変わりません。既に出力している場合に、急いで削除する必要もありません。

出力を検証する

  1. 対象のページを開き、ソースに application/ld+json が出ていることを確認する
  2. リッチリザルトテスト にURLを入力し、Google が対応する種類(記事、パンくずリストなど)が検出され、エラーが無いことを確認する
  3. Google 以外の型も含めて文法を確かめたい場合は、Schema Markup Validator を使う
  4. 公開後は 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 で検証する

関連記事:

お気軽にご相談ください

お見積りへ お問い合わせへ
▲