宿泊施設の構造化データ実装ガイド|Hotel・HotelRoom・FAQPageのJSON-LDひな形付き

Category: Hotel Management
Author: Shibata
Date: 2026.09.11

宿泊施設の構造化データ実装ガイド|Hotel・HotelRoom・FAQPageのJSON-LDひな形付き

ChatGPTやGeminiに宿を尋ねたとき、AIは公式サイトを人のように眺めて理解しているわけではありません。ページの裏側にある機械向けの記述、構造化データを読んで、この施設は旅館で、客室は12室で、露天風呂があって、料金帯はこのくらい、という事実を組み立てています。宿泊施設のAI対策で最初に手を付けるべき技術的な作業がこの構造化データの実装です。

この記事では、宿泊施設の公式サイトに構造化データを実装する手順を、コピーして使えるJSON-LDのひな形とあわせて解説します。専門用語はできるだけ避けますが、制作会社に依頼する際の指示書としても使えるよう、必要な項目名はそのまま記載しています。全体の戦略については宿泊施設のAI対策とは?の記事をご覧ください。

構造化データとは何か

構造化データは、Schema.orgという共通の語彙を使って、ページの内容を機械が読める形式で記述したものです。人が読む本文とは別に、HTMLの中にJSON-LDという形式で埋め込みます。Googleはこれをリッチリザルトの表示に使い、ChatGPTやPerplexityなどのAI検索も、ページを読む際の手がかりとして参照します。

宿泊施設にとって重要なのは、構造化データが情報の曖昧さをなくしてくれる点です。本文に露天風呂完備と書いてあっても、AIはそれが客室付きなのか大浴場なのか、貸切なのかを判断できないことがあります。構造化データで設備を項目として列挙すれば、解釈の余地なく伝わります。

宿泊施設で使うスキーマの種類

Schema.orgには宿泊施設向けのタイプがいくつか用意されています。施設の形態に合わせて選びます。

タイプ対象補足
Hotelホテル、旅館、リゾート最も一般的。旅館もHotelで問題ありません
LodgingBusiness宿泊施設全般Hotelの上位タイプ。ヴィラや貸別荘、民泊など、ホテルと呼びにくい施設に使います
BedAndBreakfast朝食付きの小規模宿ペンションやゲストハウスに
Resortリゾート施設Hotelの下位タイプ。敷地内にアクティビティが多い施設に
VacationRental一棟貸し、バケーションレンタル比較的新しいタイプ。Googleのバケーションレンタル向けリッチリザルトに対応

迷ったらHotelかLodgingBusinessを選んでください。タイプの細かさよりも、中に入れる情報の正確さのほうがはるかに重要です。

基本のひな形:施設全体の構造化データ

まずは公式サイトのトップページに入れる、施設全体を表す構造化データです。以下をコピーし、施設の情報に書き換えて使ってください。HTMLに設置する際は、type属性にapplication/ld+jsonを指定したscriptタグで囲み、headタグ内かbodyタグの末尾に置きます。以降のひな形も同じです。

{
  "@context": "https://schema.org",
  "@type": "Hotel",
  "@id": "https://example.com/#hotel",
  "name": "施設名",
  "alternateName": "施設名の英語表記",
  "description": "施設の説明を200文字程度で。立地、客室数、温泉や食事の特徴など事実を中心に。",
  "url": "https://example.com/",
  "telephone": "+81-000-000-0000",
  "email": "info@example.com",
  "image": [
    "https://example.com/images/exterior.jpg",
    "https://example.com/images/room.jpg",
    "https://example.com/images/onsen.jpg"
  ],
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "町名・番地",
    "addressLocality": "市区町村",
    "addressRegion": "都道府県",
    "postalCode": "000-0000",
    "addressCountry": "JP"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": 35.0000,
    "longitude": 139.0000
  },
  "checkinTime": "15:00",
  "checkoutTime": "11:00",
  "numberOfRooms": 12,
  "priceRange": "¥30,000〜¥60,000",
  "petsAllowed": false,
  "smokingAllowed": false,
  "starRating": {
    "@type": "Rating",
    "ratingValue": "4"
  },
  "amenityFeature": [
    {"@type": "LocationFeatureSpecification", "name": "露天風呂", "value": true},
    {"@type": "LocationFeatureSpecification", "name": "貸切風呂", "value": true},
    {"@type": "LocationFeatureSpecification", "name": "サウナ", "value": true},
    {"@type": "LocationFeatureSpecification", "name": "無料Wi-Fi", "value": true},
    {"@type": "LocationFeatureSpecification", "name": "無料駐車場", "value": true},
    {"@type": "LocationFeatureSpecification", "name": "送迎サービス", "value": true}
  ],
  "availableLanguage": ["ja", "en"],
  "currenciesAccepted": "JPY",
  "paymentAccepted": "現金, クレジットカード, QRコード決済",
  "sameAs": [
    "https://www.instagram.com/施設のアカウント/",
    "https://maps.google.com/?cid=Googleマップの施設ID",
    "https://www.jalan.net/施設のページ/",
    "https://travel.rakuten.co.jp/施設のページ/"
  ]
}

各項目の考え方を補足します。

descriptionは、AIが施設を一言で説明する際にそのまま使われることが多い項目です。癒やしの空間といった表現ではなく、箱根湯本駅から車で10分、全12室の温泉旅館、源泉かけ流しの露天風呂と貸切風呂を備え、夕食は地元食材の会席、といった事実の羅列で構成してください。

sameAsは、この施設が他のサイト上でどのページに対応するかを示す項目です。Googleビジネスプロフィール、OTAの掲載ページ、SNSアカウントを列挙することで、AIがばらばらに存在する情報を同じ施設のものとして紐付けやすくなります。AI対策の観点では最も効く項目のひとつです。

amenityFeatureは設備を列挙します。旅行者がAIに尋ねる条件、露天風呂付き、サウナ付き、ペット可、子連れ歓迎、駅送迎あり、といった項目を意識して、あるものはtrue、ないものはfalseで明記します。ないものを明記することも、誤認を防ぐうえで意味があります。

priceRangeは目安で構いません。最安と最高の1泊1室料金を記載します。

客室ごとの構造化データ

客室タイプが複数ある施設は、客室ページごとにHotelRoomの構造化データを入れると、AIが特定の条件、たとえば露天風呂付き客室や4人で泊まれる部屋、といった質問に答えやすくなります。

{
  "@context": "https://schema.org",
  "@type": "HotelRoom",
  "name": "露天風呂付き特別室",
  "description": "本館2階、約60平米。信楽焼の露天風呂を備えた和洋室。ベッド2台と広縁付き。",
  "url": "https://example.com/rooms/special/",
  "image": "https://example.com/images/room-special.jpg",
  "occupancy": {
    "@type": "QuantitativeValue",
    "minValue": 1,
    "maxValue": 4
  },
  "bed": {
    "@type": "BedDetails",
    "numberOfBeds": 2,
    "typeOfBed": "セミダブル"
  },
  "floorSize": {
    "@type": "QuantitativeValue",
    "value": 60,
    "unitCode": "MTK"
  },
  "amenityFeature": [
    {"@type": "LocationFeatureSpecification", "name": "客室露天風呂", "value": true},
    {"@type": "LocationFeatureSpecification", "name": "禁煙", "value": true}
  ],
  "containedInPlace": {
    "@id": "https://example.com/#hotel"
  }
}

containedInPlaceで施設全体の構造化データの@idを参照することで、この客室があの施設のものだと関連付けられます。

よくある質問の構造化データ

旅行者がAIに投げる質問の多くは、施設のよくある質問と同じ内容です。質問と回答をFAQPageの構造化データにしておくと、AIがそのまま引用しやすくなります。よくある質問のページ、または各ページの下部に設置します。

{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "子どもは何歳から宿泊できますか?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "年齢制限はありません。0歳から宿泊いただけます。3歳以下は添い寝で無料、4歳以上は子ども料金となります。"
      }
    },
    {
      "@type": "Question",
      "name": "駅からの送迎はありますか?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "箱根湯本駅から無料送迎があります。14時から17時の間、毎時00分に駅前ロータリーを出発します。前日までにご予約ください。"
      }
    },
    {
      "@type": "Question",
      "name": "ペットと一緒に泊まれますか?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "ペットの同伴はご遠慮いただいています。"
      }
    }
  ]
}

回答は、ページ本文に表示されている内容と一致させてください。構造化データにだけ存在する情報は、Googleのガイドライン違反になります。

WordPressサイトへの実装方法

実装方法は主に3つあります。

SEOプラグインのカスタムスキーマ機能を使う

All in One SEOやYoast SEO、Rank Mathといったプラグインには、ページごとにカスタムスキーマを入力する機能があります。管理画面から上記のJSON-LDを貼り付けるだけで済むため、最も手軽です。ただし、プラグインが自動出力するWebPageやOrganizationのスキーマと重複しないよう、出力結果を確認してください。

テーマのheader.phpに直接記述する

サイト全体で共通の施設情報は、テーマのheader.phpやfunctions.phpにPHPで記述する方法が確実です。管理画面の操作で消えることがなく、Gitで変更履歴も残せます。制作会社に依頼する場合はこの方法を指定してください。

Googleタグマネージャーで挿入する

タグマネージャーで構造化データを挿入する方法もありますが、JavaScriptで後から挿入されるため、AIのクローラーが読み取れないことがあります。AI対策の目的では推奨しません。

実装後の確認方法

実装したら、必ず次の2つのツールで確認します。

Googleのリッチリザルトテストでは、Googleがリッチリザルトとして認識できるかを確認できます。ただし、宿泊施設のHotelスキーマはリッチリザルトの対象外なので、検出されないと表示されても誤りではありません。エラーが出ていないかだけを見てください。

Schema Markup Validatorでは、Schema.orgの仕様に沿っているかを確認できます。こちらはHotelスキーマも検証対象になるため、宿泊施設ではこちらを主に使います。

加えて、Google Search Consoleの拡張メニューで、サイト全体の構造化データのエラーを定期的に確認してください。

よくある失敗

実装の現場で繰り返し見かける失敗をまとめます。

1つ目は、本文と構造化データの内容が食い違っていることです。料金を改定したのに構造化データが古いまま、閉鎖した客室タイプが残っている、といった状態はAIの誤認の直接の原因になります。料金や設備を変更したら、構造化データも同時に更新する運用を決めてください。

2つ目は、施設名の表記ゆれです。構造化データのnameが漢字、Googleビジネスプロフィールがカタカナ、OTAが英語混じり、という状態だと、AIは同じ施設だと確信を持てません。正式名称をひとつ決め、全チャネルで統一します。

3つ目は、同じページに複数のプラグインやテーマが別々の構造化データを出力し、矛盾していることです。ページのソースを表示して、application/ld+jsonのスクリプトがいくつあるか、内容が重複していないかを確認してください。

4つ目は、構造化データを入れて満足してしまうことです。構造化データは骨格にすぎず、本文のテキストが具体的でなければAIは施設の魅力を説明できません。AI対策の全体像で解説した7つのステップのうち、構造化データは2番目の作業です。

まとめ

構造化データの実装は、宿泊施設のAI対策の中で最も技術的な作業ですが、ひな形があれば半日で終わる作業でもあります。まずはトップページに施設全体のHotelスキーマを入れ、sameAsでGoogleビジネスプロフィールやOTAと紐付けるところから始めてください。次に客室ごとのHotelRoom、よくある質問のFAQPageと広げていけば、AIが施設を正確に理解するための土台が整います。

株式会社ArchのAIO支援サービスでは、現状診断の中で構造化データの実装状況を確認し、実装からその後の計測まで対応しています。自社での実装に不安がある場合は、お問い合わせからご相談ください。

No Data >>

Contact Us

宿泊施設のブランディング、OTA関連施策、マーケティング、各種制作から施設運営まで幅広く対応可能です。
お気軽にお問い合わせくださいませ。

お問い合わせ >