termin_is_upcoming($v, $today))); // veranstaltungen_load() sortiert absteigend (fürs Archiv richtig) — was // ansteht, gehört aufsteigend sortiert: das Nächste zuerst. usort($kommend, static fn (array $a, array $b): int => (string) $a['date_start'] <=> (string) $b['date_start']); $vergangen = array_values(array_filter($alle, static fn (array $v): bool => !termin_is_upcoming($v, $today))); $meta = [ 'title' => 'Veranstaltungen', 'description' => 'Unsere Feste und Veranstaltungen: Sportfest, Frühschoppen und alles, was wir im Katzbachtal auf die Beine stellen.', 'schema' => array_merge( page_schema([ ['name' => 'Startseite', 'slug' => ''], ['name' => 'Der Verein', 'slug' => 'verein'], ['name' => 'Veranstaltungen', 'slug' => 'veranstaltungen'], ]), // Nur die anstehenden als Event-Knoten: ein vergangenes Fest ist für // Suchmaschinen kein Termin mehr, den man sich vormerken kann. Mit Slug, // damit es derselbe Knoten ist wie auf /termine und der Detailseite. array_values(array_filter(array_map( static fn (array $v): ?array => event_schema($v, 'veranstaltungen/' . (string) ($v['slug'] ?? '')), $kommend ))) ), ]; component('hero', ['hero' => [ 'compact' => true, 'align' => 'center', 'title' => 'Veranstaltungen', 'text' => 'Sportfest, Frühschoppen, Feiern: hier findest du alles zu unseren Festen, vorher das Programm und hinterher die Bilder.', 'image' => [ 'base' => 'img/pages/vereinsgelaende', 'widths' => [640, 1000, 1600], 'alt' => '', ], ]]); ?>

Was ansteht

$kommend, 'cta' => 'Zum Programm', 'empty_text' => 'Gerade ist kein Fest geplant. Sobald der nächste Termin steht, findest du ihn hier.', ]); ?>

Rückblick

$vergangen, 'cta' => 'Bilder ansehen', 'empty_text' => 'Noch kein Fest im Rückblick. Nach unserem nächsten Sportfest findest du hier die Bilder.', ]); ?>