web: Jahresarchiv je Branche, Kategoriebeschreibungen, Portalname im Titel (Roadmap 2.3)

- /de/category/{slug}/archiv/{jahr} (CategoryArchivePageData,
  CategoryArchiveController, View kategorie-archiv): 30 Meldungen je
  Seite, neueste zuerst, Jahresleiste mit Zahlen; ohne Jahr das juengste
  Jahr mit Meldungen. Canonical mit ?page=N auf Folgeseiten, hreflang
  nur auf Seite 1, CollectionPage + BreadcrumbList. Gecacht bis Seite 3.
  Leere Jahre, unbekannte Kategorien, leere Folgeseiten: 404.
- Branchenseite: Jahresleiste unter dem Feed (archiveYears, eine
  gruppierte Query); Sitemap listet alle Jahresarchive.
- categories:seed-descriptions {--dry-run} {--force}: fuellt leere DE/EN
  Beschreibungen aus database/seeders/data/category-descriptions.php
  (14 Kategorien, sachlich, ohne Werbeaussagen), leert den Seiten-Cache.
- Branchenseite: Titel trug config('app.name') ("– pressekonto") statt
  des Portalnamens — jetzt presseecho/businessportal24.
- Protokoll Teil 5 (2.3 mit Befund: 0 von 14 Beschreibungen, Sonstiges =
  28 % des Bestands), Roadmap 2.3 abgehakt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-09-17 10:25:29 +00:00
parent b60a28dc9c
commit 4616bb7aad
15 changed files with 793 additions and 13 deletions

View file

@ -1616,6 +1616,50 @@ zwischen Meldung und Newsroom) ist der zweite Teil von 2.7.
Tests: `LlmsTxtTest` (2).
### 2.3 — Branchen-Landingpages aus dem Archivbestand (17.09.2026)
**Befund (Dev-DB = Live-Kopie):** 34.597 sichtbare Meldungen seit 2008
(presseecho 12.587, businessportal24 22.010), 14 Hauptkategorien ohne
Unterkategorien. Die Branchenseiten (`/de/category/{slug}`) existieren
seit Juli mit Lead/Top/Feed, Statistik, Newsrooms — zeigen aber nur die
jüngsten ~15 Meldungen. Der Bestand hing nur an der Sitemap, nicht an
internen Links. Dazu: **0 von 14 Kategorien haben eine Beschreibung**,
alle Branchenseiten zeigten denselben Standardsatz (14 gleich aussehende
Seiten); und der Seitentitel hieß auf beiden Spokes „– pressekonto"
(`config('app.name')` statt Portalname) — behoben.
„Sonstiges" trägt 9.607 Meldungen (28 %), ist also keine Branche, sondern
der Sammelposten; das ist ein Einlieferungs-Thema, kein Seitenthema.
**Umsetzung:**
1. **Jahresarchiv je Branche** — `/de/category/{slug}/archiv/{jahr}`
(`CategoryArchivePageData`, `CategoryArchiveController`, View
`kategorie-archiv`): 30 Meldungen je Seite, neueste zuerst, Datum mit
Jahr, Firma, Rubrik; Jahresleiste mit Zahlen; ohne Jahr das jüngste
Jahr mit Meldungen. Jahr statt fortlaufender Seitennummer, weil eine
Jahresseite ihren Inhalt behält, während `?page=2` bei jeder neuen
Meldung verrutscht. Canonical mit `?page=N` auf Folgeseiten (der
Layout-Default hätte auf Seite 1 kanonisiert), hreflang nur auf Seite 1,
CollectionPage + BreadcrumbList als JSON-LD. Gecacht bis Seite 3 je
Jahr (Schutz gegen Cache-Aufblähung wie bei den Newsrooms). Leere
Jahre, unbekannte Kategorien und leere Folgeseiten sind 404.
2. **Jahresleiste auf der Branchenseite** unter dem Feed
(`archiveYears`, eine gruppierte Query), und alle Jahresarchive in der
Sitemap (14 × ~18 Jahre ≈ 250 URLs).
3. **Beschreibungen:** `categories:seed-descriptions {--dry-run}
{--force}` füllt leere DE/EN-Beschreibungen aus
`database/seeders/data/category-descriptions.php` (je 2–3 Sätze:
Themenumfang und wer dort veröffentlicht, ohne Werbeaussagen). Nur
leere Felder, danach in Admin ▸ Kategorien änderbar. Dry-Run auf der
Dev-DB: alle 14 Kategorien gefunden.
Tests: `CategoryArchiveTest` (5), `SeedCategoryDescriptionsTest` (2);
`tests/Feature/Web` komplett grün (305).
**Live:** `php artisan categories:seed-descriptions --dry-run`, dann ohne
Flag. Bewusst nicht gebaut: Landingpages unterhalb der Kategorien
(„Branchen" im engeren Sinn) — dafür gibt es keine Unterkategorien und
keine Daten; die Meldungen tragen nur die 14 Hauptkategorien.
### Befund zu 2.5 / E5
Die alte Ratgeber-Strecke `/de/presse/*.html` leitet seit dem Rückbau
@ -1627,6 +1671,8 @@ 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.
**Deploy (2.1/2.2/2.3/2.7):** kein `migrate`, `view:cache`/`route:cache`
wie üblich, dann `categories:seed-descriptions`. Danach
`/sitemap-news.xml`, `/llms.txt`, `/de/category/handel/archiv/2019` und
eine Meldung im Rich-Results-Test (search.google.com/test/rich-results)
prüfen.