web: Entitaeten im JSON-LD verknuepft, News-Sitemap und llms.txt (Roadmap 2.1, 2.2, 2.7)

- App\Support\StructuredData: Portal-Organization als Publisher mit @id
  und Logo (ImageObject), Newsroom-@id; NewsArticle.author auf der
  Meldung und Organization auf der Newsroom-Seite beschreiben jetzt
  dieselbe Entitaet. Startseiten nutzen denselben Publisher.
- /sitemap-news.xml je Spoke (NewsSitemapController): im Archiv
  sichtbare Meldungen der letzten 48 h, max. 1.000, news:publication
  mit Portalname und Sprache; 15 min gecacht, mit den anderen Sitemaps
  geleert; in robots.txt der Spokes. Hub liefert leere Liste.
- /llms.txt je Host (LlmsTxtController): sachliche Beschreibung,
  URL-Aufbau, aktive Kategorien, Seiten fuer Unternehmen, Rechtliches;
  Hub verweist auf beide Portale. Keine Aussagen ueber KI-Nennungen.
- Protokoll Teil 5 (Block 2) inkl. Betreiber-Schritten fuer das
  Publisher Center und Befund zu 2.5/E5; Roadmap 2.1/2.7 abgehakt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-09-17 10:15:28 +00:00
parent 8cd76df0bb
commit b60a28dc9c
15 changed files with 521 additions and 23 deletions

View file

@ -1537,3 +1537,96 @@ Die 1.302 davon mit Meldungen haben nur `rejected` (bis 2019) und
`archived` (bis 2022), nichts Öffentliches. Die 44 Besitzerkonten bleiben
unangetastet — 24 führen auch saubere Firmen. Dry-Run Dev-DB: 4.391.
Test: `RetireLinkSpamCompaniesTest`.
---
## Teil 5 — Block 2: Organische Sichtbarkeit (ab 17.09.2026)
Block 1 ist komplett und live (17.09.2026). Block 2 beginnt mit dem
technischen Teil (2.1, 2.2, 2.7); die Inhalts- und Marketing-Pakete (2.3,
2.4, 2.6) folgen, 2.5 hängt an E5.
### 2.1 — NewsArticle und Organization (17.09.2026)
**Stand vorher:** Das Grundgerüst gab es seit Juli (Commit 379688f):
NewsArticle + BreadcrumbList auf jeder öffentlichen Meldung, Organization
auf dem Newsroom, WebSite + Organization auf den Portal-Startseiten,
BreadcrumbList auf Kategorien; Ausgabe über `x-web.structured-data`
(JSON_HEX_TAG gegen `</script>`-Ausbruch). Die Vorschau bleibt ohne Markup.
**Was fehlte:** Die Entitäten hingen nicht zusammen. `NewsArticle.author`
und die Organization der Newsroom-Seite waren zwei namensgleiche Objekte
ohne gemeinsame `@id`; der Publisher hatte kein Logo (Google empfiehlt es
für Article-Rich-Results) und ebenfalls keine `@id`.
**Umsetzung:** `App\Support\StructuredData` bündelt die Entitäten:
- `publisher($portalBase)` — Organization des Portals mit
`@id = {portal}/#organization`, Name aus `config/domains.php`, Logo als
ImageObject (`/images/presseecho-logo.svg` bzw.
`businessportal-logo.svg`, 600×200). Verwendet auf Meldung (publisher)
und Startseite.
- `newsroomUrl()` / `newsroomId()` — `@id = {newsroom-url}#organization`.
Die Newsroom-Seite trägt sie, `NewsArticle.author` verweist darauf.
- Bewusst nicht ins Organization-Markup: Adresse, E-Mail, Telefon. Die
Newsroom-Seite zeigt sie nicht, und Markup ohne sichtbares Gegenstück
ist gegen Googles Richtlinien.
Tests: `StructuredDataTest` erweitert (Publisher-`@id`, Logo,
Author-`@id`, Newsroom-`@id`).
### 2.2 — Google News, technischer Teil (17.09.2026)
**Umsetzung:** News-Sitemap je Spoke: `/sitemap-news.xml`
(`NewsSitemapController`) — nur im Archiv sichtbare Meldungen der letzten
48 Stunden, höchstens 1.000, `news:publication` mit Portalname und
Sprache (`language` der Meldung, Fallback `de`), `news:publication_date`,
`news:title`. 15 Minuten gecacht je Host, wird mit den anderen Sitemaps
über `WebCaches::forgetSitemaps()` geleert. `robots.txt` der Spokes nennt
sie; der Hub liefert eine leere Liste und nennt sie nicht.
**Was jetzt beim Betreiber liegt (nicht im Code):**
1. Search Console: beide Spokes als Property bestätigt haben.
2. Publisher Center (publishercenter.google.com): je Portal eine
Publikation anlegen — Name exakt wie in `news:name` („presseecho",
„businessportal24"), Sprache Deutsch, Standort DE, Website-URL des
Portals; Logo (quadratisch und rechteckig) hochladen.
3. In der Publikation den Bereich „Google News" einrichten: Abschnitte
(z. B. die Kategorien) als Feed oder Web-Bereich anlegen; die
News-Sitemap wird nicht dort, sondern in der Search Console
eingereicht (Sitemaps → `/sitemap-news.xml`).
4. Erwartung ehrlich halten: Google News nimmt Presseportale nicht
verlässlich auf („Pressemitteilungen" sind laut Inhaltsrichtlinien
zulässig, aber kein bevorzugter Inhalt). Die Sitemap ist die
Voraussetzung, keine Zusage. Ergebnis nach 4–6 Wochen in der Search
Console unter „Leistung → Google News" ablesen.
Tests: `NewsSitemapTest` (3).
### 2.7 — Auffindbarkeit für KI-Systeme (17.09.2026)
**Umsetzung:** `/llms.txt` je Host (`LlmsTxtController`, 1 h gecacht):
Titel, Kurzbeschreibung (Tagline aus `config/domains.php`), sachlicher
Absatz zu Urheberschaft (Unternehmen = Urheber, Portal = Herausgeber) und
zu den strukturierten Daten, URL-Aufbau (Meldung, Newsroom, Kategorie,
Sitemaps), aktive Kategorien mit Links, Seiten für Unternehmen,
Rechtliches. Der Hub verweist auf beide Portale und die OpenAPI-Datei.
Formulierungsgrenze eingehalten: keine Aussage darüber, ob oder wie
KI-Systeme die Inhalte verwenden. Die Entitätszuordnung aus 2.1 (`@id`
zwischen Meldung und Newsroom) ist der zweite Teil von 2.7.
Tests: `LlmsTxtTest` (2).
### Befund zu 2.5 / E5
Die alte Ratgeber-Strecke `/de/presse/*.html` leitet seit dem Rückbau
(R3.2) per 301 auf `/de/faq`. Es gibt also keine Ratgeberseiten mehr, die
zu konsolidieren wären — die Frage E5 reduziert sich darauf, ob die
Alt-URLs zum Schreiben von Pressemitteilungen künftig auf die Hilfeseite
`/de/gute-pressemitteilung` (1d.1) statt auf die FAQ zeigen sollen.
Empfehlung: ja für Slugs, die erkennbar das Schreiben betreffen, sonst
FAQ. Braucht die Liste der Alt-Slugs aus dem Webserver-Log oder der
Search Console; ohne die bleibt es bei FAQ.
**Deploy:** kein `migrate`, nur `view:cache`/`route:cache` wie üblich.
Danach `/sitemap-news.xml`, `/llms.txt` und eine Meldung im
Rich-Results-Test (search.google.com/test/rich-results) prüfen.