Editorial-Frontend: oeffentliche Unterseiten, Preise & Linkpflege
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled

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 82abdf6bd6
commit 028b059975
34 changed files with 2842 additions and 3102 deletions

View file

@ -2,6 +2,23 @@
> der oeffentlichen Strecke. Welcher Punkt bereits umgesetzt ist, ist
> jeweils mit einer kurzen IST-Notiz markiert.
> **Update 17.06.2026 — Bestands-URL-Mapping (Launch-Vorbereitung).** Die
> komplette URL-Struktur der Altseite (siehe `docs/frontend/Struktur Frontend.md`)
> ist jetzt per 301 auf die neue Struktur abgebildet: englische Alt-Slugs
> (`login`, `contact`, `imprint`, `terms`, `privacypolicy`, `pricelist`,
> `service`) → neue deutsche Pfade bzw. Hub, `/presse/*`-Ratgeber → `/faq`,
> `presskit/{id}/{slug}``/newsroom/{slug}` (Feinmapping über
> `companies.legacy_id`, Fallback `/newsrooms`), entfallene Sprachvarianten
> `de-ch`/`de-at``/de`. Region-Übersichten (`/region/{slug}`) sind bewusst
> ein späterer Schritt. Implementierung in `routes/web.php`; Test:
> `tests/Feature/Web/LegacyRedirectTest.php`.
> **Update 17.06.2026 — Newsrooms.** Newsroom-Markenseiten pro Unternehmen
> (`/{edition}/newsroom/{slug}`) und das Newsrooms-Verzeichnis
> (`/{edition}/newsrooms`) sind im Editorial-Design mit echten Daten
> umgesetzt (siehe Punkt 4). Neue server-seitige Pagination-Komponente
> `x-web.pagination`. Test: `tests/Feature/Web/NewsroomPageTest.php`.
> **Update 16.06.2026 — Editorial-Relaunch & Ausgaben-Routing.**
> Die oeffentliche Strecke wurde auf ein gemeinsames Editorial-Design
> (Komponenten `x-web.site-header` / `x-web.site-footer`, Design-Tokens in
@ -45,6 +62,7 @@ _IST 21.05.2026_: noch nicht umgesetzt.
**4. Newsroom-Seite eines Unternehmens** `/newsroom/[slug]` Markenseite eines Premium-Publishers mit eigener URL, Logo, allen PMs des Unternehmens. Ist gleichzeitig Verkaufsargument für Pro-/Agency-Tarif und SEO-Vorteil für die Unternehmen.
_IST 21.05.2026_: Layout vorhanden (`web/newsrooms.blade.php`), Daten-Anbindung pro Firma noch offen.
_IST 17.06.2026_: umgesetzt im Editorial-Design mit echten Daten. **Markenseite** `web/newsroom.blade.php` (Route `newsroom`, URL `/{edition}/newsroom/{slug}`): Logo/Initiale, Boilerplate, Website, Branchen der Firma, Kennzahlen (gesamt/30 Tage/heute/Aufrufe/seit Jahr), Top-Meldung und paginierte Meldungsliste (`x-web.pagination`), Sidebar (Meistgelesen, Publisher-CTA). 404 bei unbekanntem Slug oder Firma ohne veröffentlichte Meldung. Zusätzlich **Verzeichnis** `web/newsrooms.blade.php` (Route `newsrooms`, URL `/{edition}/newsrooms`): Karten-Grid aller aktiven Newsrooms mit Meldungs-/Aktivitätszahlen, Namens-Suche (`?q=`) und Pagination. `x-web.active-newsrooms` verlinkt jetzt über `route('newsroom', …)`. Legacy-`.html`-URLs (`/newsrooms.html`, `/newsroom/{slug}.html`) per 301. Test: `tests/Feature/Web/NewsroomPageTest.php`.
**5. Such-Ergebnisseite** `/suche?q=...` Volltextsuche mit Filtern (Erweiterte Suche schreibt in URL-Parameter, dadurch teilbar/bookmarkbar).
_IST 21.05.2026_: Layout vorhanden (`web/suche.blade.php`), Volltextsuche noch nicht aktiv.
@ -61,6 +79,7 @@ _IST 16.06.2026_: Landing-Seite im Editorial-Design neu aufgebaut, echte Kennzah
**8. Tarife & Preise** `/preise` _(oder als Modal aus mehreren Stellen aufrufbar)_ Da Tarife auch im Modal aus dem CTA aufgerufen werden, ist die Frage: brauchen wir die Seite? Antwort ja, weil SEO ("Pressemitteilung veröffentlichen Preise" ist eine wichtige Suche) und weil sie verlinkbar sein muss aus AGB, Footer, Mediadaten.
_IST 21.05.2026_: Layout vorhanden (`web/preise.blade.php`), echte Tarife noch nicht hinterlegt (Tarif-Modul siehe `Presseportal Konzept für Relaunch.md` Abschnitt 8).
_IST 17.06.2026_: Tarife sind jetzt **datengetrieben** aus dem System (`Plan::active()`) auf der **Startseite** als Tarif-Teaser sichtbar (neue Komponente `x-web.pricing-teaser`, Preis/Quota/Tageslimit/Jahrespreis je Tarif, „Beliebt"-Hervorhebung). Der **Preise-Link** ist auf jeder Portalseite präsent: in der Header-Utility-Bar (neu) und im Footer („Tarife & Pakete", bestand bereits). Test: `tests/Feature/Web/PricingTeaserTest.php`. **Offen**: Die eigentliche `/preise`-Seite (`web/preise.blade.php`) ist noch im alten Theme mit Platzhalter-Tarifen — Editorial-Rebuild mit `x-web.pricing-teaser`/echten Plänen ist der nächste Schritt.
**9. Mediadaten / Werbung** `/mediadaten` oder `/werben` Für Mediaplaner und potentielle Werbekunden: alle buchbaren Slot-Typen (Top-Slot, Highlights, Newsletter, Branchen-Sponsoring), Reichweiten-Daten, Preise, Booking-Kontakt. Pflicht-Seite für jede Plattform mit Anzeigeninventar.
_IST 21.05.2026_: nicht umgesetzt.

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`.