マークアップ × ページ内容の一致確認
このページでできること
- 結果詳細画面に出ている「構造化マークアップとページ内容の一致確認」テーブルが、どんな条件で 一致 / 不一致 / 未実装 を判定しているかを把握できます。
- schema.org 型ごとに、どのプロパティが何と比較されるか(突き合わせ対象)を確認できます。
- 突き合わせのテキスト一致は厳密ではなく、空白除去・部分一致を許す方向にチューニングされていることを理解できます。
担当コード: src/StructuredDataConsistencyChecker.php / src/HtmlParser.php。出力は crawl_results.result_json.consistency_checks 配列。
なぜこの確認が必要か
JSON-LD などで宣言する構造化マークアップは、Google から見えるが人間にはほぼ見えない裏方の情報です。そのため、「ページの本文を書き換えたのに JSON-LD だけ古いまま」という状況が発生しやすく、これが続くと Google から「ページ内容と構造化データが乖離している」と判断されてリッチリザルト対象から外される恐れがあります。
クヌギスキーマは、マークアップで宣言した値とページの実コンテンツを機械的に突き合わせ、ズレを検出します。
確認ロジックの全体像
- クロールで取得した HTML を
HtmlParserが解析し、 title、meta description、h1、パンくず、FAQ 候補、記事シグナル(著者・日付)、組織シグナル、商品シグナルを抽出します。 - 同じ HTML から
StructuredDataExtractorが JSON-LD / Microdata / RDFa を取り出し、エンティティ群を作ります。 StructuredDataConsistencyCheckerが各エンティティの型を見て、その型に対応するプロパティをページ側の対応シグナルと突き合わせ、結果を 1 行ずつconsistency_checks配列に追加します。- 結果詳細画面(結果一覧/詳細)の「マークアップとページ内容の一致確認」テーブルがこの配列を表示しています。
突き合わせ対象(型ごとの一覧)
| schema.org 型 | 突き合わせるフィールド | ページ側の対応 |
|---|---|---|
WebPage |
name, description, url, @id |
title タグ、meta description、ページ URL |
WebSite(ページ検出分) |
name, url, publisher, potentialAction, sameAs 等 |
ページ上の JSON-LD 等から検出された WebSite エンティティ |
Article / BlogPosting / NewsArticle |
headline, author, datePublished, dateModified, description, url, @id |
h1(無ければ title)、ページ内の著者表示、本文中の日付、meta description、ページ URL |
BreadcrumbList |
itemListElement(各要素の name) |
ページ内のパンくず UI(<nav class="breadcrumb"> や <ol> 等)から抽出した「>」区切りリスト |
FAQPage |
mainEntity 配下の Question / Answer 文字列 |
ページ内で見つかった Q&A ライクな見出し・本文ペア |
Organization / LocalBusiness |
組織名(name)、住所、電話番号、URL など |
ページのフッタや住所表記から抽出した組織シグナル |
Product |
name、価格・通貨 |
商品名らしい h1、ページ内の ¥ / 円 / USD 等の価格表記 |
WebSite 期待値との照合(プロダクト単位)
メタ情報の事前登録 で登録した WebSite 期待値は、各 URL のクロール結果とは別に WebsiteExpectationChecker が評価します。
- ページから検出された
@type: WebSiteの各プロパティと、product_website_expectationsの登録値を厳密一致(前後空白除去のみ)で比較します。 - 登録側が空のフィールドは照合しません(「未設定=スキップ」)。
- 結果も
consistency_checksに行として追加され、結果詳細の一致確認テーブルに表示されます。
パンくず UI の検出には、同画面のパンくずセレクター(breadcrumb_selectors_json)が HtmlParser に渡されます。提案・照合自体をオフにする場合は 構造化マークアップ検出設定 で種別単位に制御します。
検出設定による除外
product_schema_detection_settings.disabled_types_json に含まれる代表 @type は、StructuredDataConsistencyChecker と StructuredDataSuggester の両方から除外されます(JSON-LD の抽出は継続)。
判定結果のバッジ
一致確認テーブルの「結果」列は 5 種類のバッジで表現されます。
| バッジ | 意味 | 典型例 |
|---|---|---|
| 一致(緑) | マークアップ側の値とページ内容の主要部分が合致した | JSON-LD の headline と <h1> がほぼ同じ |
| 実装済み(緑) | 突き合わせの結果、すでにマークアップが入っているので OK | パンくず UI と BreadcrumbList の両方が揃っている |
| 要確認(黄) | マークアップは入っているが、対応するページ内容が拾えなかった など | headline はあるが h1 が無い |
| 不一致(赤) | 双方に値はあるが、テキストの主要部分が一致しない | JSON-LD の author とページ表示の著者名がズレている |
| 未実装(赤) | ページ側にシグナルがあるのに、対応するマークアップが入っていない | パンくず UI はあるが BreadcrumbList が無い |
テキスト一致の判定方法
厳密なバイト単位比較ではなく、運用上の揺れに耐える設計です。
- 前後の空白・連続空白を除去して比較。
- 大文字 / 小文字の違いは無視。
- マークアップ側の値が長文の場合(
descriptionなど)、ページ側との部分一致でも「一致」扱いになります(先頭一致 / 含む関係の判定)。 - URL 比較ではスキーム(http / https)の違い・末尾スラッシュの違いを正規化したうえで比較します。
パンくずの突き合わせ
パンくずは「項目の並び」と「各項目の名前」両方を見ます。
BreadcrumbListのitemListElementから、各要素のnameを取り出します(item.nameのような入れ子もケアします)。- ページ側は
<nav>/<ol>/aria-label="breadcrumb"等を見て、「ホーム > カテゴリ > 詳細」のようなリストを抽出します。 - マークアップだけ存在 + ページにパンくず UI が無い →
warning。 - ページに UI はあるがマークアップが無い →
missing(未実装)。結果詳細 画面では「JSON-LD などで BreadcrumbList を追加すると、Google 検索結果のパンくず表示に対応できます。」と案内されます。 - 両方あるが項目数や順序が大きく違う →
mismatch。
「構造化マークアップが見つからないため、一致確認は実施できません。」が出る場合
JSON-LD / Microdata / RDFa が 1 件も検出できなかった URL では、突き合わせ用の根拠が無いため、1 行だけ info ステータスの行を出して終了します。
- このメッセージが出る URL は、まず 結果詳細 の「構造化できそうなコンテンツの提案」セクションを確認し、追加可能なスキーマがないか確認してください。
- 静的ページ(情報量が少ない LP など)では、明確な構造化候補が無いこともあります。その場合は、最低限
WebPageやBreadcrumbListの追加検討から始めるのが安全です。
該当箇所の HTML を確認する
結果詳細画面では、一致確認テーブルの各行をクリックすると、その判定の根拠となった構造化マークアップ HTML 断片がインライン展開されます。
- 行クリック / Tab + Enter / Tab + Space で展開・収納できます。
- 古いクロール結果(実装当初の結果)には
rawが保存されていないことがあります。その場合は「古いクロール結果の可能性があります。「手動でクロール実行」から再取得すると表示されます」と案内されます。