From b423c4502af72c24fe1b8e8342ea4f6e438fb9b0 Mon Sep 17 00:00:00 2001 From: knuthtimo-lab Date: Wed, 5 Aug 2026 20:17:01 +0200 Subject: [PATCH] SEO blogpost V2 --- app/ratgeber/[slug]/page.tsx | 51 ++++++++++++--- app/ratgeber/page.tsx | 20 ++++-- components/contextual-guide-link.tsx | 19 ++++++ components/related-guide-articles.tsx | 31 +++++++++ lib/guides.ts | 61 +++++++++++++++--- next.config.ts | 17 +++++ ...en-wenn-zwei-optionen-gleich-gut-sind.avif | Bin 0 -> 41930 bytes .../guides/entweder-oder-entscheiden.avif | Bin 0 -> 61501 bytes .../guides/faire-auslosung-namen-liste.avif | Bin 0 -> 59306 bytes .../guides/gluecksrad-online-drehen.avif | Bin 0 -> 56227 bytes .../guides/ja-oder-nein-entscheiden.avif | Bin 0 -> 42779 bytes .../kopf-oder-zahl-muenzwurf-online.avif | Bin 0 -> 76141 bytes public/images/guides/lose-ziehen-online.avif | Bin 0 -> 45551 bytes .../namen-fair-auslosen-teams-gewinner.avif | Bin 0 -> 104251 bytes ...fen-wenn-zwei-optionen-gleich-gut-sind.jpg | Bin 0 -> 61696 bytes .../social/entweder-oder-entscheiden.jpg | Bin 0 -> 96167 bytes .../social/faire-auslosung-namen-liste.jpg | Bin 0 -> 84880 bytes .../social/gluecksrad-online-drehen.jpg | Bin 0 -> 71394 bytes .../social/ja-oder-nein-entscheiden.jpg | Bin 0 -> 63645 bytes .../kopf-oder-zahl-muenzwurf-online.jpg | Bin 0 -> 90297 bytes .../guides/social/lose-ziehen-online.jpg | Bin 0 -> 69607 bytes .../namen-fair-auslosen-teams-gewinner.jpg | Bin 0 -> 129881 bytes .../zufallsgenerator-richtig-nutzen.jpg | Bin 0 -> 75301 bytes .../social/zufallszahl-zwischen-1-und-10.jpg | Bin 0 -> 121711 bytes .../zufallsgenerator-richtig-nutzen.avif | Bin 0 -> 50063 bytes .../guides/zufallszahl-zwischen-1-und-10.avif | Bin 0 -> 93556 bytes 26 files changed, 173 insertions(+), 26 deletions(-) create mode 100644 components/contextual-guide-link.tsx create mode 100644 components/related-guide-articles.tsx create mode 100644 public/images/guides/entscheidung-treffen-wenn-zwei-optionen-gleich-gut-sind.avif create mode 100644 public/images/guides/entweder-oder-entscheiden.avif create mode 100644 public/images/guides/faire-auslosung-namen-liste.avif create mode 100644 public/images/guides/gluecksrad-online-drehen.avif create mode 100644 public/images/guides/ja-oder-nein-entscheiden.avif create mode 100644 public/images/guides/kopf-oder-zahl-muenzwurf-online.avif create mode 100644 public/images/guides/lose-ziehen-online.avif create mode 100644 public/images/guides/namen-fair-auslosen-teams-gewinner.avif create mode 100644 public/images/guides/social/entscheidung-treffen-wenn-zwei-optionen-gleich-gut-sind.jpg create mode 100644 public/images/guides/social/entweder-oder-entscheiden.jpg create mode 100644 public/images/guides/social/faire-auslosung-namen-liste.jpg create mode 100644 public/images/guides/social/gluecksrad-online-drehen.jpg create mode 100644 public/images/guides/social/ja-oder-nein-entscheiden.jpg create mode 100644 public/images/guides/social/kopf-oder-zahl-muenzwurf-online.jpg create mode 100644 public/images/guides/social/lose-ziehen-online.jpg create mode 100644 public/images/guides/social/namen-fair-auslosen-teams-gewinner.jpg create mode 100644 public/images/guides/social/zufallsgenerator-richtig-nutzen.jpg create mode 100644 public/images/guides/social/zufallszahl-zwischen-1-und-10.jpg create mode 100644 public/images/guides/zufallsgenerator-richtig-nutzen.avif create mode 100644 public/images/guides/zufallszahl-zwischen-1-und-10.avif diff --git a/app/ratgeber/[slug]/page.tsx b/app/ratgeber/[slug]/page.tsx index e1f5f23..60d0ae0 100644 --- a/app/ratgeber/[slug]/page.tsx +++ b/app/ratgeber/[slug]/page.tsx @@ -1,8 +1,11 @@ import type { Metadata } from "next"; +import Image from "next/image"; import Link from "next/link"; import { notFound } from "next/navigation"; import Nav from "@/components/nav"; import Footer from "@/components/footer"; +import ContextualGuideLink from "@/components/contextual-guide-link"; +import RelatedGuideArticles from "@/components/related-guide-articles"; import { getGuide, GUIDES } from "@/lib/guides"; import { TOOL_PAGES } from "@/lib/tool-pages"; @@ -27,9 +30,16 @@ export async function generateMetadata({ params }: PageProps<"/ratgeber/[slug]"> url: `${SITE_URL}/ratgeber/${guide.slug}`, title: guide.title, description: guide.description, + images: [{ url: guide.image.socialSrc, alt: guide.image.alt, width: 1200, height: 630 }], publishedTime: "2026-08-03T08:00:00+02:00", modifiedTime: "2026-08-03T08:00:00+02:00", }, + twitter: { + card: "summary_large_image", + title: guide.title, + description: guide.description, + images: [{ url: guide.image.socialSrc, alt: guide.image.alt }], + }, }; } @@ -44,15 +54,33 @@ export default async function GuidePage({ params }: PageProps<"/ratgeber/[slug]" .filter((tool): tool is (typeof TOOL_PAGES)[number] => Boolean(tool)); const jsonLd = { "@context": "https://schema.org", - "@type": "Article", - headline: guide.title, - description: guide.description, - datePublished: "2026-08-03", - dateModified: "2026-08-03", - inLanguage: "de-DE", - mainEntityOfPage: url, - author: { "@type": "Person", name: "Timo Knuth" }, - publisher: { "@type": "Organization", name: "Entscheidomat", url: SITE_URL }, + "@graph": [ + { + "@type": "Article", + headline: guide.title, + description: guide.description, + datePublished: "2026-08-03", + dateModified: "2026-08-03", + inLanguage: "de-DE", + mainEntityOfPage: url, + author: { "@type": "Person", name: "Timo Knuth" }, + publisher: { + "@type": "Organization", + name: "Entscheidomat", + url: SITE_URL, + logo: { "@type": "ImageObject", url: `${SITE_URL}/icon.svg`, width: 512, height: 512 }, + }, + image: { "@type": "ImageObject", url: `${SITE_URL}${guide.image.src}`, width: 1536, height: 1024 }, + }, + { + "@type": "BreadcrumbList", + itemListElement: [ + { "@type": "ListItem", position: 1, name: "Entscheidomat", item: SITE_URL }, + { "@type": "ListItem", position: 2, name: "Ratgeber", item: `${SITE_URL}/ratgeber` }, + { "@type": "ListItem", position: 3, name: guide.title, item: url }, + ], + }, + ], }; return ( @@ -72,6 +100,9 @@ export default async function GuidePage({ params }: PageProps<"/ratgeber/[slug]"

{guide.description}

Von Timo Knuth · Veröffentlicht und aktualisiert am {guide.updated}

+
+ {guide.image.alt} +
{guide.sections.map((section) => (
@@ -84,9 +115,11 @@ export default async function GuidePage({ params }: PageProps<"/ratgeber/[slug]" {section.bullets.map((bullet) =>
  • {bullet}
  • )} )} +
    ))}
    +