リッチリザルト(検索結果に星やパンくずが出る表示)を狙って構造化データを入れたのに、記事を更新したら消えていた。そんな相談をときどき受けます。原因の多くは、JSON-LDを本文HTMLに手で書き込んでいることです。

本文と同じ場所に構造化データがあると、編集者がテキストを直すたびに、その脇のコードごと触ってしまいます。閉じ括弧がひとつ欠けるだけで、構造化データは無効になります。この記事では、CMSのデータから構造化データを自動生成し、編集者が触れないテンプレート側へ隔離する設計を、私のサイトの実装をもとに紹介します。更新のたびに壊す運用から、更新しても勝手に追従する運用へ切り替える話です。

なぜ手打ちの構造化データは壊れるのか

構造化データ(JSON-LD=検索エンジンにページの意味を伝える小さなデータ)を本文に直接貼ると、次の問題が起きます。

  • 編集者がコードを壊す:本文を直すつもりで、隣接するJSON-LDのタグや括弧を消してしまう
  • 本文とズレる:タイトルや日付を本文だけ直し、構造化データ側の更新を忘れる
  • 記事ごとに手作業:新規記事のたびにコードを書き写すので、抜けや打ち間違いが混ざる
手打ちで埋め込む場合とテンプレで自動生成する場合の比較図

とくに厄介なのが2つ目のズレです。Googleの構造化データに関するガイドラインでは、マークアップはページに見える内容を正しく表したものであるべきだ、とされています。ページに表示されていない情報を構造化データに書くことは避けるよう求められていて、見える内容と食い違うマークアップは、リッチリザルトの対象から外れたり、場合によっては問題として扱われたりします。手打ち運用は、この「不一致」を自分から作り込んでしまう構造だと感じています。

CMSのデータから生成し、テンプレートへ隔離する

解決の軸はシンプルです。構造化データは人が書くものではなく、CMSの項目から機械的に組み立てるものにする。編集者はタイトルや要約、公開日、アイキャッチといった「意味のある項目」だけを入力し、JSON-LDそのものは一切触りません。

私のサイト(Astro+EmDashというヘッドレスCMSで構築)では、記事ページのテンプレートの中で、CMSのフィールドから構造化データを組み立てています。実際のコードはこれだけです。

// 記事テンプレート内。CMSの項目から JSON-LD を組み立てる
const articleJsonLd = {
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "BlogPosting",
      headline: post.data.title,       // タイトル項目
      description: post.data.summary,  // 要約項目
      datePublished: post.data.post_date,
      image: articleImage,             // アイキャッチ項目
      inLanguage: "ja",
    },
    // パンくず(BreadcrumbList)も同じデータから生成
  ],
};

ポイントは、headlinedescription が、本文に表示している見出しや要約と同じ項目を参照していることです。編集者がタイトルを直せば、ページの見出しも構造化データも同時に変わります。片方だけ古いまま、という状態が起きません。

この仕組みの土台になっているのが、ヘッドレスCMSの発想です。中身(データ)と見た目(テンプレート)を分けておくと、構造化データという「見た目の一部」もテンプレート側に置ける。この考え方はヘッドレスCMSとは何かAstro+ヘッドレスCMSの実装を外注するでも触れています。

壊れない運用にするための4つの勘所

生成をテンプレートに寄せたうえで、運用として押さえておきたいのは次の4点です。

壊れない構造化データ運用の4つの勘所を示したカード図
  • CMSのデータから生成する:構造化データは手で書かず、入力項目から組み立てる。編集の対象を「意味のある項目」だけに絞る
  • テンプレートに隔離する:JSON-LDのコードは編集画面から見えない場所へ。編集者が誤って触る経路をなくす
  • 本文と一致させる:見出し・日付・画像は、ページ表示と構造化データで同じ項目を使う。二重管理をやめる
  • 公開前に検証する:Googleのリッチリザルト テストなどで、更新後のページが意図どおり読み取れるか確認する

4つ目の検証は、テンプレート方式にしても続けたい習慣です。項目の追加やテンプレートの改修で、思わぬところが変わることはあります。「生成する仕組み」と「公開前の確認」はセットだと考えています。

どの構造化データの型(記事・パンくず・FAQなど)を使うか、必須の項目は何かといった設計の詳細は、構造化データでSEOを底上げするにまとめています。あわせて読むと、生成の仕組みと中身の設計がつながって見えるはずです。

まとめ

構造化データが更新で壊れるのは、たいてい「本文に手で書いている」ことが原因です。CMSの項目から自動生成し、編集者が触れないテンプレート側へ隔離すれば、更新しても構造化データは本文に追従し、勝手に崩れません。手打ちをやめるだけで、運用の事故はかなり減らせます。

いまのサイトで「更新すると構造化データやリッチリザルトが消える・崩れる」「壊れない運用に作り替えたい」とお困りなら、テンプレート側での自動生成に寄せる改修が有効です。既存サイトの構造を見て、どこをCMS項目に寄せられるかご提案します。お問い合わせからお気軽にご相談ください。

本記事は2026年7月時点の情報です。構造化データの仕様やガイドラインは変わることがあるため、実装時は最新の公式ドキュメントをご確認ください。