Editorial-Frontend: oeffentliche Unterseiten, Preise & Linkpflege

Oeffentliche Strecke durchgaengig auf das Editorial-Design umgestellt und
datengetrieben gemacht:

- Newsrooms-Verzeichnis + Newsroom-Detailseiten (Suche, Pagination)
- Preise-Seite neu (Abos via Plan, Einzel-PM via config/billing, Add-ons via
  config/credits); Texte ausgelagert nach lang/{de,en}/pricing.php
- Pricing-Teaser-Komponente auf den Startseiten + Preise-Link in Header/Footer
- Statische Seiten im Editorial-Design ueber neue Komponente x-web.static-page:
  impressum, datenschutz, agb, cookies, faq (Akkordeon), hilfe, kontakt,
  ueber-uns, api (altes Theme/gradient-hero entfernt)
- Header/Footer-Linkpflege: tote #-Anker raus, FAQ/Hilfe/Cookies verlinkt,
  "Anmelden" fuehrt in den Hub
- Legacy-URL-Redirects (.html, presskit->newsroom, Regionen)
- Datums-Bugfix in Feed-Komponenten

Tests: NewsroomPage, PreisePage, PricingTeaser, StaticPages, NavigationLinks,
LegacyRedirect. Doku in docs/frontend aktualisiert.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Kevin Adametz 2026-06-17 16:08:46 +00:00
parent 0618080e02
commit 326ff9b2a0
34 changed files with 2842 additions and 3102 deletions

View file

@ -0,0 +1,150 @@
## 1. Hauptnavigation (rechts oben)
| Seite | Link | Dahinter | Relaunch |
| ------------- | ----------------------- | ---------------------------------- | -------------------------------------------------------------------------------------------- |
| Home | `/` | Startseite | **Portal** |
| Registrierung | `/de/registration.html` | Account-Anlage | → **Hub** (pressekonto) |
| Login | `/de/login.html` | Anmeldung | → **Hub** (Sanctum, kein eigener Login am Portal) |
| Preisliste | `/de/pricelist.html` | Tarife | → **Hub** (neue Tarifstruktur Einzel/Starter/…/Agency) |
| Service | `/de/service.html` | Leistungsübersicht / Verkaufsseite | wird zu veroeffentlichen |
| Kontakt | `/de/contact.html` | Kontakt | **Portal** + Hub (auch hier muss deutlich werden, dass der Hub das ganze Backend System ist) |
## 2. Region/Sprache
| Variante | Link | Relaunch |
| ------------ | -------- | ---------- |
| Deutsch | `/` | **Portal** |
| Deutsch (CH) | `/de-ch` | raus |
| Deutsch (AT) | `/de-at` | raus |
| English | `/en` | Portal |
## 3. „Presse"-Dropdown — Ratgeber/SEO-Content (12 Seiten)
Das ist editorial wertvollster Teil: statische Ratgeber-Seiten, die wahrscheinlich organischen Long-Tail-Traffic ziehen.
|Seite|Link|
|---|---|
|Pressemitteilung schreiben|`/de/presse/pressemitteilung-schreiben.html`|
|Aufbau Pressemitteilung|`/de/presse/pressemitteilung-aufbau.html`|
|Pressemitteilung Nutzen & Einsatz|`/de/presse/pressemitteilung-nutzen.html`|
|Pressemappe|`/de/presse/pressemappe.html`|
|Redakteure & Journalisten|`/de/presse/redakteure-journalisten.html`|
|Pressemitteilung Beispiel|`/de/presse/pressemitteilung-beispiel.html`|
|Pressekonferenz|`/de/presse/pressekonferenz.html`|
|Deutsche Presse Agentur|`/de/presse/deutsche-presseagentur.html`|
|Redaktion|`/de/presse/redaktion.html`|
|Pressestelle|`/de/presse/pressestelle.html`|
|Pressesprecher|`/de/presse/pressesprecher.html`|
|Presseausweis|`/de/presse/presseausweis.html`|
**Relaunch:** Diese URLs unbedingt 1:1 erhalten oder sauber 301-redirecten — hier steckt der SEO-Wert. Editorial passen sie zu beiden Portalen, ggf. sogar besser zu presseecho (Kontexttiefe). Entscheidung offen, wo sie inhaltlich angesiedelt werden.
Hier würde ich eine FAQ Seite machen, die alle Themen beinhaltet und sauber 301-redirectet
## 4. Kategorien (14 Stück)
`/de/category/{slug}.html` — Listenseiten je Themenrubrik:
Handel · IT · Finanzen · Reisen · Kultur · Politik · Medizin · Sport · Motor/Verkehr · Haus · Mode · Sonstiges · Wissenschaft/Forschung · Recht
**Relaunch:** Diese Kategoriestruktur ist die Backbone für Migration + Boost-Logik (Kategorieseiten sind Teil deiner Boost-Platzierung). Beim Relaunch zu prüfen: Übernimmst du alle 14 unverändert, oder konsolidierst du? „Sonstiges" als Auffangbecken ist für deine Content-Score-/Trust-Logik suboptimal.
## 5. Content-/Detailseiten (die eigentlichen Templates)
|Typ|URL-Muster|Funktion|Relaunch|
|---|---|---|---|
|PM-Detailseite|`/de/{slug}.html`|Einzelne Pressemitteilung|**Portal** — Kern-Template|
|Kategorie-Liste|`/de/category/{slug}.html`|PMs je Rubrik, paginiert|**Portal**|
|Pressemappe (Presskit)|`/de/presskit/{id}/{slug}.html`|Firmenprofil + alle PMs der Firma|**Portal** = deine „Firmen-Detailseite"|
|Stream + Paginierung|`/de?page=N`|732 Seiten Archiv|**Portal** — aber Paginierungs-/Indexierungsstrategie überdenken|
Die Presskit-Seite entspricht funktional exakt deiner geplanten **Firmen-Detailseite** (Header, Stammdaten, Boilerplate, Kontakt, gefilterte PM-Liste). Gutes Mapping — du baust das also nicht neu, sondern modernisierst ein bestehendes Konstrukt.
## 6. Footer / Legal
| Seite | Link | Relaunch |
| ----------- | ------------------------ | -------------------------------------------------- |
| Impressum | `/de/imprint.html` | **Portal** + Hub (pflicht, pro Domain) |
| AGB | `/de/terms.html` | **Hub** (Vertragsbeziehung läuft über pressekonto) |
| Datenschutz | `/de/privacypolicy.html` | **Portal** + Hub |
---
## Einordnung für den Relaunch
Wenn ich das gegen deine Hub-and-Spoke-Architektur lege, fällt die Seitenmenge in drei klare Eimer:
**Bleibt am Portal (businessportal24.com & presseecho.de = öffentlicher Spoke):** Home/Stream, PM-Detail, Kategorie-Listen, Pressemappe/Firmen-Detail, Ratgeber-Seiten, Impressum, Datenschutz, Kontakt.
**Wandert in den Hub (pressekonto):** Registrierung, Login, Preisliste/Tarife, AGB, und alles dahinter (PM erstellen, Pressemappe anlegen, Account). Das deckt sich mit deinem Prinzip „Portale haben keine eigenen Login-Systeme".
---
## Relaunch-Mapping der Bestands-URLs (IST 17.06.2026)
Alle Alt-URLs werden per **301** auf die neue Struktur geleitet (Implementierung
in `routes/web.php`, Closure `$htmlRedirect` + Regions-Routen; Test:
`tests/Feature/Web/LegacyRedirectTest.php`). Die neue Struktur liegt unter dem
Ausgaben-Präfix `/{de|en}/…`.
| Alt-URL (Altsystem) | Ziel (301) | Status |
| ------------------------------------ | ---------------------------------- | ------ |
| `/` | `/de` (Default-Ausgabe) | ✅ |
| `/de/{slug}.html` (PM) | `/de/press-release/{slug}` | ✅ |
| `/de/category/{slug}.html` | `/de/category/{slug}` | ✅ |
| `/de/presskit/{id}/{slug}.html` | `/de/newsroom/{slug}` *(Lookup über `companies.legacy_id`; Fallback `/newsrooms`)* | ✅ |
| `/de/presse/*.html` (12 Ratgeber) | `/de/faq` (konsolidiert) | ✅ |
| `/de/pricelist.html` | `/de/preise` | ✅ |
| `/de/service.html` | `/de/veroeffentlichen` | ✅ |
| `/de/contact.html` | `/de/kontakt` | ✅ |
| `/de/imprint.html` | `/de/impressum` | ✅ |
| `/de/terms.html` | `/de/agb` | ✅ |
| `/de/privacypolicy.html` | `/de/datenschutz` | ✅ |
| `/de/registration.html` | Hub `pressekonto/register` | ✅ |
| `/de/login.html` | Hub `pressekonto/login` | ✅ |
| `/de/kategorien.html` (Übersicht) | `/de` (Übersicht entfällt) | ✅ |
| `/de-ch`, `/de-at` (+ Subpfade) | `/de` | ✅ |
**Bewusst auf später verschoben (eigene Slice):**
- **Regionen-Übersichten** `/region/{slug}` (Punkt 3 der öffentlichen Strecke) –
aktuell leiten nur die entfallenen Sprachvarianten `de-ch`/`de-at` auf `/de`.
- **Tarife/AGB im Hub**: `pricelist` zeigt vorerst auf die öffentliche
SEO-Seite `/preise`; die buchbare Tarifstruktur (Checkout) lebt im Hub.
**Erledigtes Feinmapping:**
- **Presskit→Newsroom**: `presskit/{id}/{slug}` löst über den Unique-Index
`companies.(legacy_portal, legacy_id)` den heutigen Newsroom auf und leitet
301 direkt auf `/newsroom/{slug}` (nur bei aktiver Firma mit ≥1 veröffentlichter
Meldung; sonst Fallback `/newsrooms`).
- **Preise datengetrieben & überall sichtbar**: Tarif-Teaser auf der Startseite
aus `Plan::active()` (`x-web.pricing-teaser`); Preise-Link in Header-Utility-Bar
und Footer. Test: `tests/Feature/Web/PricingTeaserTest.php`.
- **Statische Seiten im Editorial-Design** (Rebuild abgeschlossen): Pflicht-
seiten `impressum`, `datenschutz`, `agb`, `cookies` (Prosa über `.pm-body`)
sowie `faq` (natives `<details>`-Akkordeon), `hilfe` (Support-Landing),
`kontakt` (Kontaktwege; Formular wartet auf POST-Handler — als TODO markiert),
`ueber-uns` (Kennzahlen/Mission/Werte/Team/Timeline) und `api`
(Features/Code-Beispiel/Integrationen). Tote Doku-/Anker-Links durch echte
Ziele bzw. Hinweise ersetzt. Gemeinsames Gerüst: `x-web.static-page`.
- **Header/Footer-Linkpflege**: `site-header`/`site-footer` ohne tote `#`-Links —
FAQ/Hilfe/Cookies verlinkt, „Anmelden" führt in den Hub
(`{domain_portal_url}/login`), nicht verlinkte Platzhalter entfernt.
Test: `tests/Feature/Web/NavigationLinksTest.php`.
Gemeinsames Gerüst: wiederverwendbare Komponente `x-web.static-page`
(site-header, Breadcrumb, Masthead, site-footer). Altes Theme
(`livewire:web.header`, `gradient-hero`) entfernt. Rechtstexte sind weiterhin
Platzhalter (vor Go-Live ersetzen). Test: `tests/Feature/Web/StaticPagesTest.php`.
- **`/preise`-Seite im Editorial-Design** (Rebuild abgeschlossen): Reihenfolge
Abo-Tarife → Einzel-PM → Add-ons. Datengetrieben über `Plan::active()`,
`config('billing.single_pm_price_cents')` und `config('credits.*')`; Route
`$preisePage`-Closure. Texte ausgelagert in `lang/{de,en}/pricing.php`
(Schlüssel `pricing.*`), damit Portal/Hub einheitlich ziehen können. Add-on-
Lineup (Magic-Link-Pfade) ist mit TODO-Kommentaren als „noch im Rework"
markiert. Test: `tests/Feature/Web/PreisePageTest.php`.