0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【実装ガイド】求人サイトの構造化データ(JobPosting)をJSON-LDで正しくマークアップする方法

0
Posted at

はじめに

求人サイトを運営していると、Googleしごと検索(Google for Jobs)への表示が集客に大きく影響します。この機能を活用するには、求人ページにSchema.orgのJobPosting構造化データをJSON-LD形式で実装する必要があります。

本記事では、Google公式ドキュメントに基づいて、JobPostingの正しい実装方法・よくあるミス・バリデーション手順をまとめます。

Googleしごと検索とは

Googleで「東京 エンジニア 求人」のように検索すると、通常の検索結果の上部に求人専用のリッチリザルトが表示されます。これが**Googleしごと検索(Google for Jobs)**です。

  • 2019年1月に日本でサービス開始
  • 求人ページにJobPosting構造化データが正しく実装されていれば、自動的にクロール・表示される
  • 求人専用UIで給与・勤務地・雇用形態のフィルタリングが可能

求人サイト運営者にとっては、追加費用なしで検索露出を増やせる重要な施策です。

必須プロパティと推奨プロパティ

必須プロパティ

Googleがリッチリザルト表示のために要求する必須フィールドは以下の5つです。

プロパティ 説明
title Text 職種名。純粋な職種名のみを記述(装飾禁止)
description Text 求人の詳細説明。HTMLタグ使用可(<p>, <ul>, <li>, <br>等)
datePosted Date 掲載日(ISO 8601形式: 2026-03-01
hiringOrganization Organization 採用企業情報(name, sameAs, logo
jobLocation Place 勤務地(address内にaddressCountryが必須)

推奨プロパティ

設定しておくとリッチリザルトの情報量が増え、クリック率向上が期待できます。

プロパティ 説明
validThrough DateTime 求人の有効期限。期限切れ求人の放置はペナルティ対象
employmentType Text FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN
baseSalary MonetaryAmount 給与情報(通貨・金額・単位)
identifier PropertyValue 企業独自の求人ID
jobLocationType Text TELECOMMUTE(完全リモート勤務の場合)
applicantLocationRequirements AdministrativeArea リモートワーカーの勤務可能地域
directApply Boolean URLから直接応募可能か

ベータ(教育・経験要件)

プロパティ 説明
educationRequirements 学歴要件
experienceRequirements 必要経験月数
experienceInPlaceOfEducation 学歴の代わりに経験で代替可能か

実装例

正社員求人(基本形)

<script type="application/ld+json">
{
  "@context": "https://schema.org/",
  "@type": "JobPosting",
  "title": "フロントエンドエンジニア",
  "description": "<p>Webアプリケーション開発チームで、フロントエンド開発をリードしていただきます。</p><h3>業務内容</h3><ul><li>React/Next.jsを使用したWebアプリケーションの設計・開発</li><li>UI/UXの改善提案と実装</li><li>コードレビューおよび技術指導</li></ul><h3>必須スキル</h3><ul><li>React/TypeScriptでの開発経験3年以上</li><li>HTML/CSS/JavaScriptの深い理解</li></ul>",
  "datePosted": "2026-03-01",
  "validThrough": "2026-05-31T23:59:59+09:00",
  "employmentType": "FULL_TIME",
  "hiringOrganization": {
    "@type": "Organization",
    "name": "株式会社テックサンプル",
    "sameAs": "https://www.example-tech.co.jp",
    "logo": "https://www.example-tech.co.jp/images/logo.png"
  },
  "jobLocation": {
    "@type": "Place",
    "address": {
      "@type": "PostalAddress",
      "streetAddress": "六本木1-1-1",
      "addressLocality": "港区",
      "addressRegion": "東京都",
      "postalCode": "106-0032",
      "addressCountry": "JP"
    }
  },
  "baseSalary": {
    "@type": "MonetaryAmount",
    "currency": "JPY",
    "value": {
      "@type": "QuantitativeValue",
      "minValue": 5000000,
      "maxValue": 8000000,
      "unitText": "YEAR"
    }
  },
  "identifier": {
    "@type": "PropertyValue",
    "name": "株式会社テックサンプル",
    "value": "FE-2026-001"
  },
  "directApply": true
}
</script>

フルリモート求人

リモート求人の場合、jobLocationTypeapplicantLocationRequirementsの追加が必要です。

<script type="application/ld+json">
{
  "@context": "https://schema.org/",
  "@type": "JobPosting",
  "title": "バックエンドエンジニア",
  "description": "<p>フルリモートで勤務可能なバックエンドエンジニアを募集します。</p><ul><li>Go/Pythonを使用したAPI開発</li><li>AWSインフラの設計・構築</li></ul>",
  "datePosted": "2026-03-01",
  "validThrough": "2026-04-30T23:59:59+09:00",
  "employmentType": "FULL_TIME",
  "jobLocationType": "TELECOMMUTE",
  "applicantLocationRequirements": {
    "@type": "Country",
    "name": "Japan"
  },
  "hiringOrganization": {
    "@type": "Organization",
    "name": "株式会社リモートテック",
    "sameAs": "https://www.remote-tech.co.jp",
    "logo": "https://www.remote-tech.co.jp/logo.png"
  },
  "jobLocation": {
    "@type": "Place",
    "address": {
      "@type": "PostalAddress",
      "addressCountry": "JP",
      "addressRegion": "東京都"
    }
  },
  "baseSalary": {
    "@type": "MonetaryAmount",
    "currency": "JPY",
    "value": {
      "@type": "QuantitativeValue",
      "minValue": 6000000,
      "maxValue": 10000000,
      "unitText": "YEAR"
    }
  }
}
</script>

jobLocationType: "TELECOMMUTE" を設定した場合、applicantLocationRequirementsで少なくとも1つの国を指定する必要があります。省略するとSearch Consoleで警告が出ます。

アルバイト・時給の求人

<script type="application/ld+json">
{
  "@context": "https://schema.org/",
  "@type": "JobPosting",
  "title": "カフェスタッフ",
  "description": "<p>カフェでのホール・キッチンスタッフを募集しています。未経験者歓迎。</p><ul><li>接客・レジ対応</li><li>ドリンク・フード調理補助</li></ul>",
  "datePosted": "2026-03-01",
  "validThrough": "2026-03-31T23:59:59+09:00",
  "employmentType": "PART_TIME",
  "hiringOrganization": {
    "@type": "Organization",
    "name": "株式会社カフェサンプル",
    "sameAs": "https://www.cafe-sample.co.jp"
  },
  "jobLocation": {
    "@type": "Place",
    "address": {
      "@type": "PostalAddress",
      "streetAddress": "神宮前5-5-5",
      "addressLocality": "渋谷区",
      "addressRegion": "東京都",
      "postalCode": "150-0001",
      "addressCountry": "JP"
    }
  },
  "baseSalary": {
    "@type": "MonetaryAmount",
    "currency": "JPY",
    "value": {
      "@type": "QuantitativeValue",
      "minValue": 1200,
      "maxValue": 1500,
      "unitText": "HOUR"
    }
  }
}
</script>

baseSalaryの unitText 対応表

日本語 unitText
時給 HOUR
日給 DAY
週給 WEEK
月給 MONTH
年収 YEAR

よくある実装ミス

実際にSearch Consoleで見かけるエラーと、その原因をまとめます。

1. titleに装飾的な情報を含める

- "title": "【急募】東京都港区のWebデザイナー 月給30万円以上!"
+ "title": "Webデザイナー"

titleには純粋な職種名のみを記述します。勤務地・給与・「急募」等のキーワードを含めると、Googleのコンテンツポリシー違反になる可能性があります。

2. 求人一覧ページに複数のJobPostingを設置

❌ /jobs?page=1 に10件分のJobPostingを一括記述
✅ /jobs/12345 のような個別求人ページに1つずつ記述

1ページ1JobPostingが原則です。一覧ページにまとめて設置すると、リッチリザルトが表示されません。

3. employmentTypeやunitTextを小文字で記述

- "employmentType": "full_time"
+ "employmentType": "FULL_TIME"

これらの列挙値は大文字で記述する必要があります(case-sensitive)。

4. validThroughを設定し忘れる

期限切れの求人がGoogleしごと検索に残り続けると、コンテンツポリシー違反としてサイト全体のJobPostingが非表示になるリスクがあります。

対処法:

  • validThroughを必ず設定する
  • 期限切れ求人は404または410を返す
  • 定期的にSearch Consoleの「求人情報」レポートを確認する

5. SPAでクライアントサイドのみでJSON-LDを生成

React/Vue等のSPAで、JavaScriptの実行結果としてJSON-LDを出力している場合、Googlebotが正しく読み取れないことがあります。

❌ useEffect内でJSON-LDを動的に生成
✅ SSR(Next.js等)でHTMLにJSON-LDを含めて出力

Next.jsであれば<Head>コンポーネント内、またはApp Routerのmetadataで構造化データを出力するのが安全です。

6. リモート求人でapplicantLocationRequirementsを省略

jobLocationType: "TELECOMMUTE"を設定した場合、applicantLocationRequirementsの省略はSearch Consoleで警告の対象になります。

バリデーション手順

実装後は以下の手順で検証します。

Step 1: リッチリザルトテスト

リッチリザルトテストにURLまたはコードスニペットを入力して、エラーがないか確認します。

  • 「JobPosting」として認識されているか
  • 必須プロパティが揃っているか
  • プレビューが正しく表示されるか

Step 2: Search Consoleで監視

本番デプロイ後、Google Search Console「拡張」→「求人情報」 レポートで、以下を確認します。

  • 有効なページ数の推移
  • エラー・警告の内容と該当URL
  • カバレッジの状況

Step 3: URL検査ツール

個別URLのインデックス状況を確認し、問題があれば「インデックス登録をリクエスト」を実行します。

日本の求人サイトの対応状況

参考として、日本の主要求人サイトのJobPosting対応状況を調べてみました。

サイト 対応状況
doda ✅ 対応(JSON-LD)
Green ✅ 対応(JSON-LD)
バイトル ✅ 対応(JSON-LD)
マイナビバイト ✅ 対応(JSON-LD)
求人ボックス ✅ 対応(JSON-LD)
はたらいく ✅ 対応(JSON-LD)
Indeed ❌ 非対応(アグリゲーター側のため不要)
タウンワーク ❌ 非対応

上位30サイト中約70%がJSON-LD形式で対応済みとのクローリング調査結果があります。まだ未対応のサイトも少なくないため、実装するだけで競合との差別化になります。

なお、求人アグリゲーションサイトでも、個別の求人詳細ページにJobPostingを実装することでGoogleしごと検索への表示が可能です。

2025年の重要な変更: Indexing API制限

2025年1月以降、GoogleはIndexing APIの利用に事前承認を要求するようになりました。以前は求人サイトがIndexing APIを使って即座にインデックス登録できましたが、現在は以下の代替手段が推奨されています。

  • XMLサイトマップに求人URLを含めて送信
  • RSSフィードの活用
  • 標準的なクロール機構への依存

新規求人の掲載から検索表示までのタイムラグが大きくなる可能性があるため、サイトマップの更新頻度を上げるなどの対策が重要です。

まとめ

  • JobPosting構造化データはJSON-LD形式で個別求人ページに実装する
  • 必須プロパティ5つ(title, description, datePosted, hiringOrganization, jobLocation)は最低限設定する
  • validThroughは推奨だが、期限切れ放置のリスクを考えると事実上必須
  • 実装後はリッチリザルトテストSearch Consoleで必ず検証する
  • 日本の主要求人サイトの約70%が対応済み。未対応サイトはまだ差別化のチャンスがある

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?