
2026/06/22 3:51
個人ウェブサイト向けの JSON-LD とは
RSS: https://news.ycombinator.com/rss
要約▶
日本語訳:
検索エンジンがあなたのウェブサイトの内容を理解する最も効果的な方法は、各ページの
<head> セクション内に <script type="application/ld+json"> ブロックを使用して、JSON オブジェクトを含む JSON-LD 構造データを実装することです。この技術的アプローチは、約 4 ヶ月間、サイト開発に合計 100 時間を要した後に採用され、 crawlers が @graph 下に格納された導かれたグラフ構造を通じてコンテンツをよりよく解釈できるようにします。これにより、リンクプレビューが改善され、ランキングも潜在的に向上します。このプロセスは、@context プロパティに対して https://schema.org スタンダードに基づいており、各ページがノードとして機能し、特定のプロパティを必要とします。ルートページには完全な "WebSite" ノードを含め、他のページは最小限のバージョンを使用します。また、個人向けのサイトは知識グラフにおけるアイデンティティ混同を防ぐために、url、name、image、sameAs という重要なプロパティを持つ "Person" ノードを含む必要があります。専用の "ProfilePage" は、メインサイトと著者を isPartOf および mainEntity を使用して接続すべきです。プロジェクトは "SoftwareApplication" ノードを利用し(オープンソースの場合は、しばしば offers の値が 0 となる)、 "BreadcrumbLists"、"CollectionPage"、"Blog"、そして "BlogPosting" サブタイプを含めることで、正確なナビゲーションパス、リストのカテゴリ分類、および検索結果での投稿の配置を確実にします。結局のところ、この精密なセマンティック構造化は、リッチな検索結果、より良いコンテンツ品質メトリクス、ならびに主要プラットフォームによるより正確なインデックス化をもたらします。本文
個人サイトへの JSON-LD(構造化データ)実装ガイド
JSON-LD(JSON リンクト データ)は、ウェブページに構造化データを追加する形式です。これにより、Web クローラーがサイトの意味的な構造を把握しやすくなり、より豊富なリンクプレビューや検索結果のランク付け改善につながります。
本稿では、静的サイトでもビルドステップなしで実装可能な、個人サイトに必要な JSON-LD の種類と設定方法を解説します。
基本概念と導入方法
ページに JSON-LD を追加するには、
<head> セクション内に以下のスクリプトタグを配置します。
<script type="application/ld+json"> { "@context": "https://schema.org", "@graph": [ { "@type": "WebSite", "@id": "https://hawksley.dev/#website", "url": "https://hawksley.dev/", "name": "Ethan Hawksley" }, // ここにさらにノードを追加します。 ] } </script>
スクリプトタグの意味
<script type="application/ld+json">
- MIME タイプ:
を指定することで、ブラウザの JavaScript エンジンがこれを実行しないようブロックします。application/ld+json - 解析対象: Googlebot などの専門的なクローラーはこの要素を検出し、中身を解析・インデックス化します。
コンテキストの設定
{ "@context": "https://schema.org" }
- データ構造を決定する**スキーマ(コンテキスト)**を定義します。
- Web クローラーは標準として Schema.org を使用するため、有効なキーと値のペアが定義されます。
グラフ構造 (@graph
)
@graphJSON-LD は
@context 下で管理されるラベル付き有向グラフと見なせます。
各ノードには以下の要素が含まれます:
: ノードが表す実体(例:@type
,WebSite
)。Person
: ノードの一意な識別子。ベストプラクティスは、末尾にハッシュ値を持つ URL の形式(例:@id
)です。#website- プロパティ: 実体の属性を記述するキー/値ペア。
※ クローラーは ID が共通すれば複数ページからプロパティを統合できますが、LLM などの単一ページ読み取り用スクリーパーは統合しないため注意が必要です。
各ページタイプごとの設定例
SEO やクローラーへの表示改善のために必要なノード(WebSite, Person など)を中心に解説します。
WebSite(サイト全体の識別子)
サイトのメタデータを示し、Google がドメインをどう表示すべきかを指示します。ルートページには詳細な設定を、他ページには簡易版を使用できます。
【推奨:詳細な設定】
{ "@type": "WebSite", "@id": "https://hawksley.dev/#website", "url": "https://hawksley.dev/", "name": "Ethan Hawksley", "alternateName": ["hawksley.dev", "Hawksley"], "description": "The personal site and technical blog of Ethan Hawksley...", "inLanguage": "en-GB", "publisher": { "@id": "https://hawksley.dev/#person" }, "image": { "@type": "ImageObject", "@id": "https://hawksley.dev/#website-image", "url": "https://hawksley.dev/logo-square.png", "caption": "Ethan Hawksley Logo" } }
【簡易版(子ページ用)】 ルートページの代わりに使っても十分です。
{ "@type": "WebSite", "@id": "https://hawksley.dev/#website", "url": "https://hawksley.dev/", "name": "Ethan Hawksley" }
WebPage(物理的なページ)
現在の HTML ページそのものを表します。他のタイプ(
BlogPosting など)とは区別してください。
※ ProfilePage や CollectionPage のようなサブタイプも存在します。
{ "@type": "WebPage", "@id": "https://hawksley.dev/blog/hack-club-campfire/#webpage", "url": "https://hawksley.dev/blog/hack-club-campfire/", "isPartOf": { "@id": "https://hawksley.dev/#website" }, "name": "Winning the Hack Club Campfire Hackathon", "inLanguage": "en-GB", "breadcrumb": { "@id": "https://hawksley.dev/blog/hack-club-campfire/#breadcrumb" } }
Person(人物プロフィール)
「あなたの是谁」を表す重要なノードです。Google はこれをコンテンツ品質の指標として使用し、LLM クローラーも人物参照に利用します。すべてのページ(特に自己紹介)で含めるのが望ましいです。
注意: プロパティは多数ありますが、重要度の高いものを中心に配置してください。
{ "@type": "Person", "@id": "https://hawksley.dev/#person", "url": "https://hawksley.dev/", "name": "Ethan Hawksley", "alternateName": "ethanhawksley", "givenName": "Ethan", "familyName": "Hawksley", "description": "Long Description", "disambiguatingDescription": "Shorter Description", "jobTitle": "Computer Science Student", "knowsLanguage": "en-GB", "knowsAbout": [ /* キーワード */ ], "nationality": { "@type": "Country", "name": "United Kingdom" }, "homeLocation": { "@type": "Place", "address": { "@type": "PostalAddress", "addressCountry": "GB" } }, "affiliation": [ /* 所属機関 */ ], "alumniOf": [ /* 卒業校 */ ], "image": { "@type": "ImageObject", "@id": "https://hawksley.dev/#person-image", "url": "https://hawksley.dev/ethan-hawksley.png", "caption": "Ethan Hawksley" }, "sameAs": [ "https://github.com/ethan-hawksley", "https://www.linkedin.com/in/ethanhawksley", // ... 他のプロフィールリンク ] }
特に重要なプロパティ:
: ルートページへのアンカー。url
,name
,givenName
: 氏名を明確に定義。familyName
: プロフィール画像(ロゴなど)を標準的に結びつける。image
: 分散したプロフィールリンクを統合し、知識グラフの構築を支援(重複解消に有効)。sameAs
ProfilePage / CollectionPage / Blog など(ページカテゴリ別)
ProfilePage(人物詳細ページ)
自分のプロフィールや「About」ページで使用します。より広い
WebSite と連結し、主題となる実体 (mainEntity) を明示する必要があります。
{ "@type": "ProfilePage", "@id": "https://hawksley.dev/#webpage", "url": "https://hawksley.dev/", "isPartOf": { "@id": "https://hawksley.dev/#website" }, "name": "About Ethan Hawksley", "mainEntity": { "@id": "https://hawksley.dev/#person" } }
SoftwareApplication(ソフトウェアアプリ)
公開したソフトウェアのメタデータです。プロジェクトページの URL とソースコードリンク(
sameAs)を記載し、カテゴリや価格(FOSS は 0 など)を設定します。
{ "@type": "SoftwareApplication", "@id": "https://hawksley.dev/#project-yt-play", "url": "https://crates.io/crates/yt-play", "name": "yt-play", "description": "A CLI utility written in Rust...", "applicationCategory": "MultimediaApplication", "offers": { "@type": "Offer", "price": 0, "priceCurrency": "GBP" }, "creator": { "@id": "https://hawksley.dev/#person" } }
BreadcrumbList(パンくずリスト)
ルートページを除く全てのページに含めるべきです。実際のパスとは限らず、検索結果での階層構造の表示を制御します。長すぎるパスを短く表示したい場合に有効です。
{ "@type": "BreadcrumbList", "@id": ".../#breadcrumb", "itemListElement": [ { "@type": "ListItem", "position": 1, "name": "Home" }, { "@type": "ListItem", "position": 2, "name": "Blog" }, { "@type": "ListItem", "position": 3, "name": "Article Title" } ] }
CollectionPage(リストページ)
ブログ一覧や他のプロフィール一覧など、複数の項目をまとめたページです。
WebPage のサブタイプとして機能し、含まれる内容 (about) やパンくずリストを指す必要があります。
{ "@type": "CollectionPage", "@id": ".../#webpage", "isPartOf": { "@id": "https://hawksley.dev/#website" }, "name": "Elsewhere", "about": { "@id": "https://hawksley.dev/#person" } }
Blog(ブログインデックス)
ブログトップページで使用します。
WebSite と個別の投稿 (BlogPosting) の中間となる架け橋役を果たします。ライセンス情報を含めることで再利用条件を明示できます。
{ "@type": "Blog", "@id": "https://hawksley.dev/blog/#blog", "isPartOf": { "@id": "https://hawksley.dev/#website" }, "mainEntityOfPage": { "@id": ".../#webpage" }, "name": "Ethan Hawksley's Blog", "license": "https://creativecommons.org/licenses/by/4.0/" }
BlogPosting(個別のブログ記事)
すべての公開記事に含めるべき最も詳細なノードです。検索結果での配置改善やリッチプレビュー表示に直接寄与します。
{ "@type": "BlogPosting", "@id": ".../#blogposting", "mainEntityOfPage": { "@id": ".../#webpage" }, "isPartOf": { "@id": ".../#blog" }, "headline": "Title of the Post", "description": "A concise summary...", "articleSection": "cybersecurity", "keywords": "cybersecurity, quantum", "inLanguage": "en-GB", "datePublished": "...", "dateModified": "...", "author": { "@id": "https://hawksley.dev/#person" }, "publisher": { "@id": "https://hawksley.dev/#person" }, "image": { "@type": "ImageObject", "url": "og-image-url.png", "width": 1200, "height": 630 }, "license": "..." }
注意点:
とauthor
: 個人サイトでは同じpublisher
ノードを指して問題ありません。Person
: リンクプレビューで使用されている OG 画像(Open Graph Image)と一致させてください。image
まとめ
上記の JSON-LD ノードを実装することで、個人のウェブサイトでも検索エンジンや AI クローラーに対して**「自分についての正確な情報」**を伝達できます。
- 最小限の実装: 静的サイトなどでビルドステップがない場合でも、ルートページに
、プロフィールページにWebSite
を含めるだけでも恩恵を受けます。Person - コピー&ペースト可: 各セクションのコードブロックは編集してそのまま使用可能です。
詳細な実装や疑問点がございましたら、お気軽にご連絡ください。