SEO/GEO-Feinschliff: og:image:alt, areaServed, WebSite-Knoten, Team-Descriptions

- og:image:alt (Seitentitel) in meta.php — Social-/AI-Cards + A11y
- areaServed (Kulmbach + Landkreis Kulmbach) am SportsClub-JSON-LD-Knoten
- WebSite-Knoten auf der Startseite via neuem Helper website_schema(), publisher -> #club
- Explizite, Kulmbach-haltige Team-Descriptions (<=155 Zeichen) statt roher Hero-Texte
  (zweite-mannschaft war 214 Zeichen und wurde im Snippet abgeschnitten)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-20 23:17:53 +02:00
parent 8437f00e06
commit 9722d8eccc
7 changed files with 27 additions and 3 deletions

View File

@@ -37,6 +37,10 @@ $clubNode = [
'latitude' => $club['geo']['lat'], 'latitude' => $club['geo']['lat'],
'longitude' => $club['geo']['lng'], 'longitude' => $club['geo']['lng'],
], ],
'areaServed' => [
['@type' => 'City', 'name' => $club['address']['city']],
['@type' => 'AdministrativeArea', 'name' => 'Landkreis ' . $club['address']['city']],
],
]; ];
$graph = [ $graph = [

View File

@@ -34,6 +34,7 @@ $scripts = array_merge(['nav.js', 'back-to-top.js'], $meta['scripts'] ?? []);
<meta property="og:description" content="<?= e($description) ?>"> <meta property="og:description" content="<?= e($description) ?>">
<meta property="og:url" content="<?= e($canonical) ?>"> <meta property="og:url" content="<?= e($canonical) ?>">
<meta property="og:image" content="<?= e($ogImage) ?>"> <meta property="og:image" content="<?= e($ogImage) ?>">
<meta property="og:image:alt" content="<?= e($title) ?>">
<meta property="og:locale" content="de_DE"> <meta property="og:locale" content="de_DE">
<meta name="twitter:card" content="summary_large_image"> <meta name="twitter:card" content="summary_large_image">
<link rel="icon" href="/favicon.ico" sizes="32x32"> <link rel="icon" href="/favicon.ico" sizes="32x32">

View File

@@ -267,6 +267,24 @@ function page_schema(array $breadcrumb, array $faq = []): array
return $nodes; return $nodes;
} }
/**
* WebSite-Knoten (für die Startseite): definiert die Site als Entität und
* verweist via publisher auf den Club (#club). Keine SearchAction — es gibt
* keine Site-Suche.
*/
function website_schema(): array
{
$club = json_load('club');
return [
'@type' => 'WebSite',
'@id' => abs_url() . '#website',
'url' => abs_url(),
'name' => $club['name'],
'inLanguage' => 'de-DE',
'publisher' => ['@id' => abs_url() . '#club'],
];
}
/** /**
* Schema-Knoten für eine Mannschafts-Seite: SportsTeam (verweist auf den Club * Schema-Knoten für eine Mannschafts-Seite: SportsTeam (verweist auf den Club
* via #club) + Breadcrump (Start → Fußball → Team) + optional FAQPage. * via #club) + Breadcrump (Start → Fußball → Team) + optional FAQPage.

View File

@@ -14,6 +14,7 @@ $meta = [
'title_absolute' => true, 'title_absolute' => true,
'description' => 'Dein Sportverein für Fußball und Turnen in Kulmbach: Jugend-, Herren- und Damenfußball, Turnen und Trampolin seit 1908 im Katzbachtal. Jetzt Mitglied werden!', 'description' => 'Dein Sportverein für Fußball und Turnen in Kulmbach: Jugend-, Herren- und Damenfußball, Turnen und Trampolin seit 1908 im Katzbachtal. Jetzt Mitglied werden!',
'scripts' => ['form.js', 'carousel.js'], 'scripts' => ['form.js', 'carousel.js'],
'schema' => [website_schema()],
]; ];
component('hero', ['hero' => $home['hero']]); component('hero', ['hero' => $home['hero']]);

View File

@@ -10,7 +10,7 @@ $team = json_load('teams')['damen'];
$meta = [ $meta = [
'title' => 'Damenmannschaft Damenfußball Kulmbach', 'title' => 'Damenmannschaft Damenfußball Kulmbach',
'description' => $team['hero']['text'], 'description' => 'Frauen- und Mädchenfußball beim TSV 08 Kulmbach: Ob erfahren oder Wiedereinsteigerin im Katzbachtal findest du dein Team. Komm zum Probetraining.',
'og_image' => $team['hero']['image']['base'] . '-1600.jpg', 'og_image' => $team['hero']['image']['base'] . '-1600.jpg',
'schema' => team_schema($team, $slug), 'schema' => team_schema($team, $slug),
]; ];

View File

@@ -10,7 +10,7 @@ $team = json_load('teams')['erste-mannschaft'];
$meta = [ $meta = [
'title' => '1. Mannschaft Herrenfußball Kreisklasse Kulmbach', 'title' => '1. Mannschaft Herrenfußball Kreisklasse Kulmbach',
'description' => $team['hero']['text'], 'description' => 'Die erste Herrenmannschaft des TSV 08 Kulmbach spielt auf Kreisklasse-Niveau ambitioniert und mit echtem Vereinsgeist. Komm vorbei und spiel mit.',
'og_image' => $team['hero']['image']['base'] . '-1600.jpg', 'og_image' => $team['hero']['image']['base'] . '-1600.jpg',
'schema' => team_schema($team, $slug), 'schema' => team_schema($team, $slug),
]; ];

View File

@@ -10,7 +10,7 @@ $team = json_load('teams')['zweite-mannschaft'];
$meta = [ $meta = [
'title' => '2. Mannschaft Herrenfußball Kulmbach', 'title' => '2. Mannschaft Herrenfußball Kulmbach',
'description' => $team['hero']['text'], 'description' => 'Die zweite Herrenmannschaft des TSV 08 Kulmbach spielt in Spielgemeinschaft mit dem TSV Melkendorf Fußball mit Spaß für alle, die gern kicken.',
'og_image' => $team['hero']['image']['base'] . '-1600.jpg', 'og_image' => $team['hero']['image']['base'] . '-1600.jpg',
'scripts' => (count($team['contact_names'] ?? []) > 1) ? ['contact-slider.js'] : [], 'scripts' => (count($team['contact_names'] ?? []) > 1) ? ['contact-slider.js'] : [],
'schema' => team_schema($team, $slug), 'schema' => team_schema($team, $slug),