From 6f782056adc925157eb2f49914d3f5aa6e003f56 Mon Sep 17 00:00:00 2001 From: Roo Code Date: Tue, 27 Jan 2026 19:48:21 +0000 Subject: [PATCH] feat(blog): add Schema.org JSON-LD structured data for SEO - Add structured-data.ts with Article, CollectionPage, and BreadcrumbList schemas - Integrate JSON-LD into /blog index page (Blog collection + breadcrumbs) - Integrate JSON-LD into /blog/[slug] page (Article + post breadcrumbs) - Export structured data utilities from blog module index MKT-70 --- .../web-roo-code/src/app/blog/[slug]/page.tsx | 202 ++++++++++-------- apps/web-roo-code/src/app/blog/page.tsx | 109 ++++++---- apps/web-roo-code/src/lib/blog/index.ts | 9 + .../src/lib/blog/structured-data.ts | 175 +++++++++++++++ 4 files changed, 357 insertions(+), 138 deletions(-) create mode 100644 apps/web-roo-code/src/lib/blog/structured-data.ts diff --git a/apps/web-roo-code/src/app/blog/[slug]/page.tsx b/apps/web-roo-code/src/app/blog/[slug]/page.tsx index 82645a5cc9..aee333bbee 100644 --- a/apps/web-roo-code/src/app/blog/[slug]/page.tsx +++ b/apps/web-roo-code/src/app/blog/[slug]/page.tsx @@ -6,7 +6,12 @@ import remarkGfm from "remark-gfm" import { ArrowLeft } from "lucide-react" import { SEO } from "@/lib/seo" import { ogImageUrl } from "@/lib/og" -import { getBlogPostBySlug, formatPostDatePt } from "@/lib/blog" +import { + getBlogPostBySlug, + formatPostDatePt, + getArticleStructuredData, + getBlogPostBreadcrumbStructuredData, +} from "@/lib/blog" // Force dynamic rendering to evaluate publish gating at request-time export const dynamic = "force-dynamic" @@ -72,102 +77,117 @@ export default async function BlogPostPage({ params }: BlogPostPageProps) { notFound() } + // Generate structured data for SEO + const articleSchema = getArticleStructuredData(post) + const breadcrumbSchema = getBlogPostBreadcrumbStructuredData(post) + return ( -
-
- {/* Back link */} - - - Back to Blog - + <> + {/* JSON-LD Structured Data */} +