構造化データ
すべてのページに含まれる schema.org JSON-LD — WebSite、ページ、パンくずリストのノード — に加えて、検索エンジンやエージェントにあなたが何者かを伝えるオプションの Organization および SoftwareApplication ブロックについて説明します。
Blume は、検索エンジンがコンテンツを理解できるように、すべてのページの <head> に schema.org JSON-LD を出力します。デフォルトで有効です:
seo: {
structuredData: true,
}
各ページには次のものが含まれます:
- サイトのアイデンティティを示す WebSite ノード
- ページ自体とその説明、言語、公開日 — ホームページでは WebPage、それ以外のすべてのページでは 記事 (ブログ記事には
BlogPosting、変更履歴とドキュメントにはTechArticle) - 記事では、ナビゲーションの経路から構築される BreadcrumbList
ホームページはナビゲーションのルートであるため、各ロケールのホーム (/fr) や basePath のルートも WebPage になります。
deployment.site が設定されている場合、URL は絶対 URL になります。設定されていない場合はルート相対 URL となり、絶対識別子を必要とする WebSite ノードは省略されます。seo.noindex が指定されたページはスキップされます。lastModified が有効な場合、各ページの日付は dateModified としても出力されます。また、表示される「最終更新日」は <time datetime> としてマークアップされるため、検索エンジンはページ上の他の日付ではなくその日付を読み取ります。
サイトのアイデンティティ
WebSite ノードはサイトが存在することを示すだけで、それが 何 であるか、誰 が運営しているかは示しません — AI エージェントがあなたを推薦したり引用したりする前に JSON-LD を読む目的は、まさにそこにあります。2 つのオプションブロックがそれを補います。どちらも deployment.site が必要です (これらのノードは絶対識別子を持つため):
seo: {
organization: {
name: "Acme", // defaults to the site title
email: "hello@acme.com",
telephone: "+1 555 0100",
address: { addressLocality: "Sydney", addressCountry: "AU" },
logo: "/logo.svg",
sameAs: ["https://github.com/acme", "https://x.com/acme"],
},
software: {
license: "MIT",
operatingSystem: "Node.js 22+",
price: 0, // emitted as an Offer; 0 marks it free
sameAs: ["https://www.npmjs.com/package/acme"],
},
}
organization は、すべてのページに Organization ノードを追加します — WebSite ノードとページノードはこれを publisher として参照します — メールアドレスと電話番号は ContactPoint として (contactType のデフォルトは "customer support")、住所は PostalAddress として出力され、この 2 つのフィールドはビジネス検証のチェックで参照されます。name と url はサイトの値がデフォルトになります。ルート相対の logo は、他のページ URL と同様に絶対 URL 化されます。
software は、ホームページに SoftwareApplication ノードを追加します: 製品の名前と説明 (デフォルトはサイトの値)、applicationCategory (デフォルトは "DeveloperApplication")、オペレーティングシステム、ライセンス、price が設定されている場合は Offer、そして sameAs にレジストリまたはリポジトリの URL が含まれます。すべてデフォルト値を使用するには software: true を指定してください。organization が設定されている場合は、その publisher として参照されます。
共有エンティティ識別子
ドキュメントが別のサイト内 (example.com/docs) に置かれている場合は、エンティティを再度定義する代わりに、そのサイトですでに定義されているエンティティを参照してください:
seo: {
jsonLd: {
websiteId: "https://example.com/#website",
organizationId: "https://example.com/#organization",
},
}
すべてのページは websiteId を自身の isPartOf として指定し、Blume は独自の WebSite ノードを出力しなくなります。そのノードの名前と URL は、サイトではなくドキュメントを表すものになってしまうためです。それでもその ID で出力するには website: true を、ID を共有せずにドキュメント独自の WebSite ノードを省略するには website: false を指定してください。organizationId はすべてのページの発行者になります。seo.organization も設定されている場合、Organization ノードはその ID を使用し、設定したフィールドのみを持ちます。ドキュメントのタイトルと URL が、その名前と URL の代わりに使われることはありません。デフォルトでは、Blume は WebSite ノードを出力し、サイト URL に #website と #organization を付けたものを使用します。識別子は絶対 URL でなければならないため、サイト URL がなくても機能します。
ページの著者と発行者
すべてのページで既存のエンティティを参照します:
seo: {
jsonLd: {
author: { "@id": "https://example.com/#author" },
publisher: { "@id": "https://example.com/#publisher" },
},
}
これらの参照は WebPage または記事ノードに適用され、publisher は organization に代わってその発行者になります。Blume は参照先のエンティティを定義しません。ページ自身のフロントマターの authors は author よりも優先され、それぞれが Person としてクレジットされます。
Git からの公開日
コンテンツファイルを追加したコミットに基づいてページの日付を設定します:
seo: {
datePublished: "git",
}
フロントマターの date または changelog.date が引き続き優先されます。それ以外のページには、lastModified と同じ git log を通じて Git が日付を設定します。リネームは内容が変更されていない場合にのみ追跡されるため、新しいページが、同じコミットで削除された類似ページの履歴を引き継ぐことはありません。ファイルシステム以外のソースから生成されたページや、コミットされていないファイルには、Git からの日付は付与されません。シャロークローンでは最も古いコミットがクローンの切り詰められた地点になるため、どのページにも日付を設定せず、代わりに警告を表示します。CI では完全な履歴を取得してください (Vercel では VERCEL_DEEP_CLONE=true、actions/checkout では fetch-depth: 0)。
解決された Open Graph 画像 も、フロントマター、サイトのデフォルト、生成されたカードのいずれに由来するものであっても、ページノードの image として含まれます。
カスタムページ
PageLayout を通してレンダリングされるカスタム .astro ページ も同じグラフを出力するため、マーケティング用のホームページだけが構造化データを持たない URL になることはありません。カスタムページには日付の基となるコンテンツファイルがないため、dateModified を付与するには lastModified を渡してください。この設定と同期させるには structuredDataEnabled={config.structuredData} を渡し、そのページだけ無効にするには structuredDataEnabled={false} を渡してください。