Ergänzt die bislang fehlenden strukturierten Daten auf den Presse-Seiten: - PM-Detailseite: NewsArticle + BreadcrumbList als JSON-LD sowie article:published_time/-section/-tag-Metas und og:image:alt — nur auf der öffentlichen Seite, die noindex-Vorschau bleibt ohne Markup. - Kategorie-Seiten: BreadcrumbList plus hreflang de/en über die lokalisierten Slugs (CategoryPageData liefert dafür neu categoryAlternateSlugs, mit View-Fallback für gecachte Alt-Daten). - Newsroom: Organization-Markup (Logo, Website als sameAs, Boilerplate). - Portal-Homepages: WebSite mit SearchAction (Sitelinks-Searchbox) und Organization. - Layout: og:locale und twitter:image ergänzt; neue Sections meta_extra und structured_data. Neue Komponente x-web.structured-data rendert JSON-LD mit JSON_HEX_TAG, damit "</script>" in Titeln/Teasern das Script-Tag nicht aufbrechen kann. JSON-LD-URLs werden wie der Canonical aus der Portal-Basis gebaut (unabhängig von forceRootUrl), damit Host und Canonical übereinstimmen. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
92 lines
3.5 KiB
PHP
92 lines
3.5 KiB
PHP
@extends('web.layouts.web-master')
|
||
|
||
@php
|
||
$brand = config('domains.domains.presseecho.brand', []);
|
||
|
||
// SEO: WebSite-Markup mit Sitelinks-Searchbox (SearchAction auf /suche).
|
||
$portalBase = rtrim($domainUrl ?? config('app.url'), '/');
|
||
$brandFullName = ($brand['name'] ?? 'presse').($brand['accent'] ?? 'echo');
|
||
|
||
$jsonLd = [
|
||
'@context' => 'https://schema.org',
|
||
'@graph' => [
|
||
[
|
||
'@type' => 'WebSite',
|
||
'name' => $brandFullName,
|
||
'url' => $portalBase.'/',
|
||
'inLanguage' => app()->getLocale(),
|
||
'potentialAction' => [
|
||
'@type' => 'SearchAction',
|
||
'target' => [
|
||
'@type' => 'EntryPoint',
|
||
'urlTemplate' => $portalBase.'/'.app()->getLocale().'/suche?q={search_term_string}',
|
||
],
|
||
'query-input' => 'required name=search_term_string',
|
||
],
|
||
],
|
||
[
|
||
'@type' => 'Organization',
|
||
'name' => $brandFullName,
|
||
'url' => $portalBase.'/',
|
||
],
|
||
],
|
||
];
|
||
@endphp
|
||
|
||
@section('structured_data')
|
||
<x-web.structured-data :data="$jsonLd" />
|
||
@endsection
|
||
|
||
{{-- DE-Meta kommt brand-spezifisch aus config/domains.php, EN aus den Übersetzungsdateien. --}}
|
||
@section('title', app()->getLocale() === 'de'
|
||
? ($brand['meta_title'] ?? 'Aktuelle Pressemitteilungen aus Wirtschaft & Industrie – presseecho')
|
||
: __('web.meta.home_title', ['brand' => ($brand['name'] ?? 'presseecho').($brand['accent'] ?? '')]))
|
||
@section('meta_description', app()->getLocale() === 'de'
|
||
? ($brand['meta_description'] ?? 'Qualitätsgeprüfte Pressemitteilungen aus Wirtschaft und Industrie im DACH-Raum.')
|
||
: __('web.meta.home_description'))
|
||
|
||
@section('hreflang')
|
||
<link rel="alternate" hreflang="de" href="{{ url('/de') }}">
|
||
<link rel="alternate" hreflang="en" href="{{ url('/en') }}">
|
||
<link rel="alternate" hreflang="x-default" href="{{ url('/de') }}">
|
||
@endsection
|
||
|
||
@section('content')
|
||
<x-web.site-header />
|
||
|
||
<main class="bg-bg text-ink">
|
||
<x-web.focus-hero
|
||
:lead-release="$leadRelease ?? null"
|
||
:side-releases="$sideReleases ?? []"
|
||
:boosted-ids="$boostedIds ?? []" />
|
||
|
||
<section class="max-w-layout mx-auto px-4 sm:px-6 lg:px-8 mt-16">
|
||
<div class="grid gap-9 grid-cols-1 lg:grid-cols-[1.7fr_1fr]">
|
||
<livewire:web.press-release-feed :portal="\App\Enums\Portal::Presseecho->value" :language="app()->getLocale()" />
|
||
|
||
<aside class="flex flex-col gap-9">
|
||
<x-web.most-read :releases="$mostReadReleases ?? []" />
|
||
<x-web.publisher-cta />
|
||
<x-web.active-newsrooms :companies="$activeNewsrooms ?? []" />
|
||
</aside>
|
||
</div>
|
||
</section>
|
||
|
||
<x-web.industry-spotlight
|
||
:industry="$spotlight['industry'] ?? null"
|
||
:stats="$spotlight['stats'] ?? null"
|
||
:releases="$spotlight['releases'] ?? []" />
|
||
|
||
<x-web.industry-index :industries="($industryIndex ?? collect())->isNotEmpty() ? $industryIndex->toArray() : null" />
|
||
|
||
<x-web.pricing-teaser />
|
||
|
||
{{-- Newsletter-Sektion bewusst entfernt (Double-Opt-in nachgelagert,
|
||
siehe dev/release/entwicklungsplan-release.md) — stattdessen Veröffentlichen-CTA. --}}
|
||
<x-web.publish-band />
|
||
|
||
<x-web.quality-summary :stats="$homeStats ?? []" />
|
||
</main>
|
||
|
||
<x-web.site-footer />
|
||
@endsection
|