2026年5月25日

2026年5月25日

WordPressでRecipeスキーマを実装してレシピのリッチリザルトの対象にする方法

レシピ記事に Recipe の構造化データを付けると、Google 検索でレシピ用のリッチリザルト(写真、調理時間、評価などが付いた表示)の対象になります。WordPress では、レシピ用プラグインを使う方法と、カスタムフィールドの値から JSON-LD を自前で出力する方法があります。この記事では、Google が求める項目、両方の実装方法、検証と公開後の確認までを説明します。

先に前提を確認しておきます。構造化データは表示の「対象になる」ための条件で、リッチリザルトが表示されるかどうかは Google が検索ごとに判断します。正しく実装しても表示されないことはあります。

Google の Recipe リッチリザルトで求められる項目

Google 検索セントラルの Recipe のドキュメントでは、Recipe のリッチリザルトは引き続きサポートされています(2026年10月現在)。項目は「必須」と「推奨」に分かれています。

必須:name(料理名)と image(料理の画像)です。

推奨:主なものは次のとおりです。

  • recipeIngredient:材料と分量を1項目ずつ
  • recipeInstructions:手順。HowToStep を並べる形がよく使われます
  • prepTime・cookTime・totalTime:時間。PT30M(30分)のような ISO 8601 の期間形式で書きます
  • recipeYield:何人分か、何個分か
  • author・datePublished・description
  • recipeCategory・recipeCuisine・keywords
  • nutrition.calories:カロリー
  • aggregateRating:評価(実際の読者の評価がある場合のみ)
  • video:調理動画がある場合

画像については、高解像度の画像を 16:9、4:3、1:1 の比率で複数用意することが推奨されています。WordPress ではアイキャッチ画像から複数サイズが自動生成されますが、トリミングの比率はテーマの設定によるので、どの比率の画像が出力されているかを確認してください。

Recipe を使ってはいけない内容

Google のガイドラインでは、料理のレシピではないもの(たとえば化粧品の作り方や、パーティーのアイデア集)に Recipe を使わないよう示されています。また、構造化データに書いた材料や手順は、ページ上で読者に見える形で掲載されている必要があります。構造化データにだけ情報を書くことは避けてください。

方法1:レシピ用プラグインを使う

レシピ記事が多いサイトや、評価・印刷用ページ・材料の分量調整なども欲しい場合は、レシピ用プラグインが手軽です。実在する代表的なものは次のとおりです。

  • WP Recipe Maker:無料版と有料版があります。レシピカードを記事に挿入すると、表示と構造化データが同じデータから作られるので、内容の食い違いが起きにくいのが利点です。
  • Tasty Recipes(WP Tasty):有料のレシピプラグインです。
  • Create by Mediavine:レシピやハウツーのカードを作れる無料プラグインです。

プラグインによっては、Yoast SEO や Rank Math が出力する構造化データ(記事や組織の情報)と結び付ける連携機能を持っています。機能の範囲や無料版・有料版の分かれ方は版によって変わるため、導入時に各プラグインの説明を確認してください。

SEO プラグインの構造化データ機能(Rank Math のスキーマ設定など)で Recipe を付けることもできますが、この場合は記事本文の表示と構造化データを別々に入力することになりやすく、片方だけ更新して内容がずれる原因になります。

どの方法でも、同じページに Recipe が2重に出力されていないかを確認してください。テーマが独自に構造化データを出していることもあります。

方法2:カスタムフィールドから JSON-LD を出力する

レシピ記事が少なく、プラグインを増やしたくない場合は、カスタムフィールドに入れた値から JSON-LD を出力できます。ここでは投稿に次のカスタムフィールドを用意する前提です。

  • recipe_ingredients:材料(1行に1つ)
  • recipe_steps:手順(1行に1つ)
  • recipe_prep_minutes・recipe_cook_minutes:準備・調理時間(分、数字のみ)
  • recipe_yield:分量(例:2人分)

ブロックエディターでは、エディターの設定でカスタムフィールドのパネルを表示すると入力できます(表記は版によって異なります)。ACF などのフィールド管理プラグインを使う場合も、値の取り出し方を合わせれば同じ考え方で書けます。

次のコードを子テーマの functions.php か mu-plugin に追加します。作業前にバックアップを取り、ステージング環境で試してください。

<?php
add_action( 'wp_head', function () {
	if ( ! is_singular( 'post' ) ) {
		return;
	}

	$post        = get_queried_object();
	$ingredients = get_post_meta( $post->ID, 'recipe_ingredients', true );
	$steps       = get_post_meta( $post->ID, 'recipe_steps', true );

	// 材料・手順・画像がそろっている記事だけに出力する
	if ( ! $ingredients || ! $steps || ! has_post_thumbnail( $post ) ) {
		return;
	}

	// 改行区切りのテキストを配列にする
	$to_lines = function ( $text ) {
		$lines = array_map( 'trim', explode( "\n", wp_strip_all_tags( $text ) ) );
		return array_values( array_filter( $lines, 'strlen' ) );
	};

	$instructions = array();
	foreach ( $to_lines( $steps ) as $step ) {
		$instructions[] = array(
			'@type' => 'HowToStep',
			'text'  => $step,
		);
	}

	$data = array(
		'@context'           => 'https://schema.org',
		'@type'              => 'Recipe',
		'name'               => html_entity_decode( wp_strip_all_tags( get_the_title( $post ) ), ENT_QUOTES, 'UTF-8' ),
		'image'              => array( get_the_post_thumbnail_url( $post, 'full' ) ),
		'author'             => array(
			'@type' => 'Person',
			'name'  => get_the_author_meta( 'display_name', $post->post_author ),
		),
		'datePublished'      => get_the_date( 'c', $post ),
		'description'        => wp_strip_all_tags( get_the_excerpt( $post ) ),
		'recipeIngredient'   => $to_lines( $ingredients ),
		'recipeInstructions' => $instructions,
	);

	$yield = get_post_meta( $post->ID, 'recipe_yield', true );
	if ( $yield ) {
		$data['recipeYield'] = wp_strip_all_tags( $yield );
	}

	$prep = absint( get_post_meta( $post->ID, 'recipe_prep_minutes', true ) );
	$cook = absint( get_post_meta( $post->ID, 'recipe_cook_minutes', true ) );
	if ( $prep ) {
		$data['prepTime'] = 'PT' . $prep . 'M';
	}
	if ( $cook ) {
		$data['cookTime'] = 'PT' . $cook . 'M';
	}
	if ( $prep && $cook ) {
		$data['totalTime'] = 'PT' . ( $prep + $cook ) . 'M';
	}

	// wp_json_encode は既定で「/」をエスケープするため、値に </script> が含まれても安全
	echo '<script type="application/ld+json">' . wp_json_encode( $data, JSON_UNESCAPED_UNICODE ) . "</script>\n";
} );

コードについての補足です。

  • 表示と一致させる:このコードは構造化データを出力するだけです。同じ材料と手順が記事本文にも書かれていることを確認してください。本文側も同じカスタムフィールドから表示するようにテンプレートを作ると、内容のずれを防げます。その場合も表示時は esc_html() でエスケープします。
  • 時間の形式:Google は ISO 8601 の期間形式を求めています。「30分」のような文字列をそのまま入れるとエラーになるので、コードでは分数の数字から PT30M を組み立てています。
  • 評価は入れていない:aggregateRating は、読者が実際に付けた評価の集計がある場合にだけ追加します。評価機能が無いサイトで固定値の評価を入れることは、ガイドライン違反になります。
  • タイトルの扱い:get_the_title() は引用符などを HTML エンティティに変換することがあるため、デコードしてから JSON に入れています。

検証と公開後の確認

実装したら、記事の URL(公開前ならコード)をリッチリザルト テストに入れ、Recipe が検出されるか、必須項目の不足やエラーが無いかを確認します。推奨項目の不足は警告として表示されます。警告があってもリッチリザルトの対象にはなりますが、埋められる項目は埋めておくと表示に使える情報が増えます。

文法として正しいかを確かめたい場合は、Schema Markup Validator も使えます。こちらは schema.org の仕様に沿っているかを見る道具で、Google の表示の対象になるかどうかはリッチリザルト テストで判断します。

公開後は、Search Console のレシピに関するレポート(表記は変わることがあります)で、エラーのある記事が出ていないかを定期的に確認します。プラグインやテーマの更新で出力が変わることもあるので、更新後にも数記事をテストに通しておくと安心です。

なお、レシピの一覧ページ(カテゴリページなど)を複数のレシピのカルーセル表示の対象にするには、各レシピページの Recipe に加えて、一覧ページに ItemList の構造化データが必要になります。対応するかどうかは、Google のカルーセルに関するドキュメントで現在の条件を確認してから判断してください。

まとめ

  • Recipe のリッチリザルトは2026年10月現在もサポートされており、必須は name と image、材料・手順・時間などは推奨項目
  • 時間は PT30M のような ISO 8601 形式で書き、画像は複数の比率を用意する
  • レシピ記事が多いなら、表示と構造化データを同じデータから作るレシピプラグインが扱いやすい
  • 自前で出力する場合は、本文の表示と同じデータを使い、評価は実在する評価だけを入れる
  • リッチリザルト テストと Search Console で、公開後もエラーが出ていないか確かめる

お気軽にご相談ください

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