Strukturierte Daten
Das schema.org-JSON-LD, das jede Seite mitbringt – WebSite-, Seiten- und Breadcrumb-Knoten – plus die optionalen Organization- und SoftwareApplication-Blöcke, die Suchmaschinen und Agents verraten, wer du bist.
Blume gibt in jedem <head> einer Seite schema.org-JSON-LD aus, damit Suchmaschinen deine Inhalte verstehen. Standardmäßig aktiviert:
seo: {
structuredData: true,
}
Jede Seite enthält:
- einen WebSite-Knoten für die Identität der Website,
- die Seite selbst mit Beschreibung, Sprache und Veröffentlichungsdatum: eine WebPage auf der Startseite und überall sonst einen Artikel –
BlogPostingfür Blogbeiträge,TechArticlefür Changelog und Dokumentation, - bei einem Artikel eine BreadcrumbList, die aus dem Navigationspfad aufgebaut wird.
Die Startseite ist die Wurzel der Navigation, deshalb sind auch die Startseite jeder Sprache (/fr) und die Wurzel eines basePath WebPages.
URLs sind absolut, wenn deployment.site gesetzt ist. Ohne diese Einstellung sind sie routenrelativ, und der WebSite-Knoten, der einen absoluten Identifier braucht, entfällt. Seiten, die mit seo.noindex markiert sind, werden übersprungen. Wenn lastModified aktiv ist, wird das Datum jeder Seite zusätzlich als dateModified ausgegeben, und das sichtbare „Zuletzt aktualisiert“-Datum wird als <time datetime> ausgezeichnet, damit Suchmaschinen genau dieses Datum lesen und nicht irgendein anderes Datum auf der Seite.
Identität der Website
Der WebSite-Knoten sagt, dass eine Website existiert; er sagt nicht, was sie ist oder wer sie betreibt – und genau dafür lesen KI-Agents JSON-LD, bevor sie dich empfehlen oder zitieren. Zwei optionale Blöcke füllen das auf, beide brauchen deployment.site (die Knoten tragen absolute Identifier):
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 fügt jeder Seite einen Organization-Knoten hinzu – die WebSite- und Seiten-Knoten verweisen als publisher darauf – mit E-Mail und Telefonnummer als ContactPoint (contactType ist standardmäßig "customer support") und der Adresse als PostalAddress, den beiden Feldern, nach denen Prüfungen zur Unternehmensverifizierung suchen. name und url übernehmen standardmäßig die Werte der Website; ein root-relatives logo wird wie jede Seiten-URL absolut gemacht.
software fügt der Startseite einen SoftwareApplication-Knoten hinzu: Name und Beschreibung des Produkts (standardmäßig die der Website), applicationCategory (Standard "DeveloperApplication"), Betriebssystem, Lizenz, ein Offer, wenn price gesetzt ist, sowie die Registry- oder Repository-URLs in sameAs. Übergib software: true, um alle Standardwerte zu übernehmen. Die Organisation wird, sofern konfiguriert, als deren publisher angegeben.
Gemeinsame Entitäts-Identifier
Wenn deine Dokumentation innerhalb einer anderen Website liegt (example.com/docs), verweise auf die Entitäten, die diese Website bereits definiert, statt sie noch einmal zu definieren:
seo: {
jsonLd: {
websiteId: "https://example.com/#website",
organizationId: "https://example.com/#organization",
},
}
Jede Seite nennt websiteId als ihr isPartOf, und Blume gibt keinen eigenen WebSite-Knoten mehr aus, dessen Name und URL die Dokumentation statt der Website beschreiben würden. Setze website: true, um ihn trotzdem unter dieser ID auszugeben, oder website: false, um den eigenen WebSite-Knoten der Dokumentation wegzulassen, ohne eine ID zu teilen. organizationId wird zum Herausgeber jeder Seite. Wenn zusätzlich seo.organization gesetzt ist, verwendet der Organization-Knoten diese ID und enthält nur die Felder, die du konfigurierst: Titel und URL der Dokumentation springen nicht für seinen Namen und seine URL ein. Standardmäßig gibt Blume den WebSite-Knoten aus und verwendet die URL der Website plus #website und #organization. Identifier müssen absolute URLs sein, deshalb funktionieren sie auch ohne Website-URL.
Autor und Herausgeber der Seite
Verweise auf jeder Seite auf bestehende Entitäten:
seo: {
jsonLd: {
author: { "@id": "https://example.com/#author" },
publisher: { "@id": "https://example.com/#publisher" },
},
}
Diese Verweise gelten für den WebPage- oder Artikel-Knoten, und publisher ersetzt die Organisation als dessen Herausgeber. Blume definiert die Entitäten, auf die sie verweisen, nicht selbst. Das eigene authors-Frontmatter einer Seite hat Vorrang vor author: Jeder Eintrag wird als Person genannt.
Veröffentlichungsdatum aus Git
Datiere Seiten anhand des Commits, der ihre Inhaltsdatei hinzugefügt hat:
seo: {
datePublished: "git",
}
date oder changelog.date im Frontmatter haben weiterhin Vorrang. Den Rest datiert Git, über dasselbe git log wie lastModified. Umbenennungen werden nur verfolgt, wenn der Inhalt unverändert ist, damit eine neue Seite nie die Historie einer ähnlichen Seite erbt, die im selben Commit gelöscht wurde. Seiten aus Quellen außerhalb des Dateisystems und nicht committete Dateien bekommen kein Datum aus Git. Ein Shallow Clone datiert keine Seite und gibt stattdessen eine Warnung aus, da sein ältester Commit nur die Stelle ist, an der der Clone abgeschnitten wurde. Hol dir in der CI die vollständige Historie (VERCEL_DEEP_CLONE=true auf Vercel, fetch-depth: 0 für actions/checkout).
Das aufgelöste Open-Graph-Bild wird außerdem als image des Seiten-Knotens aufgenommen – egal ob es aus dem Frontmatter, einem Standardwert der Website oder einer generierten Karte stammt.
Eigene Seiten
Eine eigene .astro-Seite, die über PageLayout gerendert wird, gibt denselben Graphen aus, damit eine Marketing-Startseite nicht die eine URL ohne strukturierte Daten ist. Eine eigene Seite hat keine Inhaltsdatei, aus der sich ein Datum ablesen ließe, also übergib lastModified, um ihr ein dateModified zu geben. Übergib structuredDataEnabled={config.structuredData}, um sie mit dieser Einstellung synchron zu halten, oder structuredDataEnabled={false}, um sie nur für diese Seite abzuschalten.