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:
parent
82abdf6bd6
commit
028b059975
34 changed files with 2842 additions and 3102 deletions
|
|
@ -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.
|
||||
|
|
|
|||
150
docs/frontend/Struktur Frontend.md
Normal file
150
docs/frontend/Struktur Frontend.md
Normal 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`.
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue