
structured-content — semantische Metadaten, die vererbt werden.
AI-Context-Annotations (Audience, Tone, Channels) auf Seiten- und Content-Ebene, die durch die Page-Hierarchie cascaden — mit typed Content-Relationships, Confidence-Scoring und JSON-LD-Generation als Output. Das Fundament für semantisch saubere TYPO3-Plattformen.
Inhalte ohne Kontext sind für KI halb leer.
Mit structured-content
- AI-Context-Felder direkt im Seiten- und Content-Element-Backend
- Vererbung durch die Hierarchie — Setzen auf einer Parent-Seite cascadet nach unten
- Typisierte Content-Relationships mit Confidence-Score
- JSON-LD-Generation automatisch im Frontend
- Channel-aware Field-Restrictions
- CLI-Tools für Bulk-Annotation
Bisher
- Audience und Tone leben in Brand-Guidelines, nicht im CMS
- JSON-LD wird händisch in Templates eingestreut
- Channel-Awareness fehlt — derselbe Inhalt geht ungefiltert in alle Kanäle
- Content-Relationships nur über lose Verlinkung
Vier Bausteine
JSON-LD im Frontend
Schema.org-Markup wird automatisch aus den Annotationen generiert — ohne dass im Template etwas eingestreut werden muss.
Typed Content-Relationships
Beziehungen zwischen Content-Elementen sind typisiert (z.B. "erklärt", "erweitert", "widerspricht") mit Confidence-Score — KI-Systeme nutzen das für kohärentere Antworten.
Hierarchische Vererbung
Annotation auf einer Parent-Seite gilt automatisch für alle Kinder, sofern dort nicht überschrieben. Aufwand pro Inhalt sinkt drastisch.
AI-Context-Felder
Audience (Customer/Partner/Internal/Developer), Tone (Informational/Promotional/Technical/Legal), Channels (Web/AI-Agent/Voice/Social) — als TCA-Standardfelder.
Architektur
Classes/
├── Domain/ # Annotation-Modelle, Beziehungstypen, Contracts
├── Application/ # Context-Resolution, Relationship-Services
├── Infrastructure/ # Repositories, JSON-LD-Builder, Context-Resolver
└── Presentation/ # Controller, Event-Listener
Datenbank-Tabellen
| Tabelle | Zweck |
|---|---|
tx_structuredcontent_relation | Inhaltsbeziehungen |
pages (erweitert) | ai_context_*-Felder für Audience, Tone, Channels |
tt_content (erweitert) | ai_context_*-Felder für Element-Metadaten |
Schema.org-Generator-Stack
Alle Generatoren in Classes/Infrastructure/SchemaOrg/ implementieren SchemaGeneratorInterface, werden via Service-Tag structured_content.schema_generator registriert und nach priority gerendert (höher = früher im JSON-LD-Block).
| Generator | Priority | @type | Trigger |
|---|---|---|---|
BreadcrumbListSchemaGenerator | 90 | BreadcrumbList | Jede Page mit Rootline |
ProfilePageSchemaGenerator | 75 | ProfilePage + Person + hasPart | /autor/{slug}-Routing-Argument resolved |
ReviewSchemaGenerator | 68 | Review | Pages mit Testimonials-CB |
PodcastEpisodeSchemaGenerator | 65 | PodcastEpisode | Podcast-Plugin Detail-View (mit actor[] für Hosts + Guests) |
PodcastSeriesSchemaGenerator | 60 | PodcastSeries | Podcast-Plugin List-View |
SoftwareApplicationSchemaGenerator | 55 | SoftwareApplication | Pages mit is_software_application |
ArticleSchemaGenerator | 50 | Article / BlogPosting | Article-Pages (mit articleSection aus sys_category) |
FaqSchemaGenerator | 45 | FAQPage | Pages mit FAQ-CB |
HowToSchemaGenerator | 45 | HowTo | Pages mit Steps-CB |
WebPageSchemaGenerator | 40 | WebPage | Fallback für alle Pages |
WebSiteSchemaGenerator | 30 | WebSite | Site-Root + Sub-Sites |
OrganizationSchemaGenerator | 25 | Organization | Site-weit aus Settings |
ServiceSchemaGenerator | 20 | Service | Pages mit Service-CB (skipped wenn SoftwareApplication owned) |
ProfessionalServiceSchemaGenerator | 20 | ProfessionalService | Service-Pages mit Provider-Org |
PackagesGridEnterpriseServiceSchemaGenerator | 18 | Service-Varianten | Packages-Grid-CB |
PackagesGridProductSchemaGenerator | 18 | Product | Packages-Grid-CB |
ProductSchemaGenerator | 15 | Product | Pages mit Product-CB |
PersonSchemaGenerator | 10 | Person | Author-Embedding in Article |
AutoDetectSchemaGenerator | 5 | dynamic | TCA-driven Mapping |
Builder und Traits
Application/Service/PersonSchemaBuilder.buildFromRow($personRow) emittet Person mit worksFor[], sameAs[] (mit Label|URL-Pipe-Format), knowsAbout, knowsLanguage und image. PersonRoutingArgumentTrait resolved den person-Slug aus den _routingArguments der Person-Plugin-Detail-View. PodcastFeedCacheReaderTrait liest gecachte Feed-Items für Podcast-Schemata ohne Re-Fetch. SanitizesSchemaTrait filtert leere und nicht-JSON-konforme Werte. ContextAndRelationshipsTrait hängt AI-Context und Relationships an den Schema-Output.
Repositories
AuthoredPagesRepository.findByPersonUid findet Pages, die tx_structuredcontent_author_records mit der Person verknüpfen (für Person.hasPart). CategoryRepository.findByPageUid liest sys_category-Records via sys_category_record_mm (für Article.articleSection). EpisodeGuestsRepository liefert Bulk episode_slug → Person[] für PodcastEpisode.actor.
Article-Schema-Erweiterungen (AI Disclosure, Reading Time, Language Fallback)
AI Content Disclosure (v1.5.10+)
Article-Schema enthält bei AI-getaggten Hero-Bildern image: {creator: {SoftwareApplication, name}, creditText: "AI-generated"}. Damit ist die EU-AI-Act-Artikel-50-Disclosure direkt im JSON-LD verankert. Pflege über die TCA-Felder aus moselwal/content-provenance (tx_provenance_origin, tx_provenance_ai_system).
Reading Time (v1.5.9+)
Article-Schema enthält wordCount und timeRequired (ISO-8601 PT*M) — byte-identisch zur Frontend-Reading-Time-Badge (200 Wörter pro Minute). Vereinheitlicht die Reading-Time-Anzeige zwischen Markup und User-Sicht.
Language-Fallback in Schema-Generators (v1.5.7+)
Translation-aware: Default-Sprache-Records werden geladen und EN-Translations overlay'd. Der Schema-Output funktioniert auch unter fallbackType: fallback ohne Lücken — unvollständige Lokalisierungen führen nicht mehr zu fehlendem Schema-Markup.
Relationship-Type-Mappings (Schema.org)
replaces→isBasedOnbelongs_to→isPartOfrelated_to→relatedLinkexplains→about
Sys-Category-Mapping
Erweiterung von sys_category um ein slug-Feld (auto aus Titel) für Filter-URLs und um eine RTE-Description für Kategorie-Hero-Blöcke. Im Article-JSON-LD wird die Kategorie als articleSection emittiert.
CLI-Befehle
vendor/bin/typo3 structured-content:missing-context # Seiten ohne AI-Kontext finden
vendor/bin/typo3 structured-content:export-relations # Beziehungen als JSON exportieren
vendor/bin/typo3 structured-content:validate-channels # Channel-Konfiguration prüfen
Konfiguration
AI-Context-Felder werden in den TYPO3-Formularen für Seiten und Inhaltselemente ergänzt. Default-Werte und Vererbungsverhalten konfigurieren Sie über die Site Settings.
Voraussetzungen
- PHP 8.3+
- TYPO3 14.0
Optionale Abhängigkeiten
| Paket | Typ | Zweck |
|---|---|---|
moselwal/content-provenance | Optional | Integritätsprüfung für Inhalte |
moselwal/business-agent | Optional | Inhaltszugriff für KI-Agenten |
moselwal/dev | Dev | Geteiltes QA-Tooling |
Die Architektur folgt strikt der DDD-4-Layer-Trennung; Layer-Verstöße werden über deptrac in CI verhindert.
Quellcode & Doku
TYPO3 Extension Repository
Nicht im offiziellen TER — die öffentliche Distribution über Composer wird vorbereitet (coming soon).
Composer-Paket
Veröffentlichung als moselwal/structured-content in Vorbereitung. Coming soon.
Repository
Quellcode und Issue-Tracker werden mit der öffentlichen Veröffentlichung freigeschaltet. Coming soon.
Mirror
Öffentlicher Mirror und Pull-Request-Workflow folgen mit der Veröffentlichung. Coming soon.
Hilfe bei der Integration?
structured-content ist Open Source und für Selbst-Integratoren gedacht. Für AI-Readiness als Komplettpaket schauen Sie sich gerne unser AI-Ready CMS as a Service an.
Oder direkt schreiben: kontakt@moselwal.de
Setzen wir ein bei …
Dieses Paket ist Teil der Plattform-Linie zu AI-Ready CMS und AI-Ready Commerce — als semantischer Layer, der Inhalte für Retrieval-Systeme und Agenten lesbar macht. In der betreuten Variante: AI-Ready CMS as a Service.