fix: apply seo agent improvements to src/app/blog/[slug]/page.tsx
This commit is contained in:
parent
4b96de56d4
commit
cee7138b2f
|
|
@ -1,14 +1,59 @@
|
||||||
'use client'
|
import type { Metadata } from 'next'
|
||||||
import { useParams } from 'next/navigation'
|
import BlogPostPageClient from '@/components/public/BlogPostPageClient'
|
||||||
import PublicLayout from '@/components/public/PublicLayout'
|
|
||||||
import BlogPostPage from '@/components/public/BlogPostPage'
|
|
||||||
|
|
||||||
export default function PostPage() {
|
const SITE_URL = process.env.NEXT_PUBLIC_SITE_URL || 'https://example.com'
|
||||||
const params = useParams()
|
const SITE_NAME = process.env.NEXT_PUBLIC_SITE_NAME || 'My Personal Site'
|
||||||
const slug = params.slug as string
|
|
||||||
return (
|
interface Props {
|
||||||
<PublicLayout>
|
params: { slug: string }
|
||||||
<BlogPostPage slug={slug} />
|
}
|
||||||
</PublicLayout>
|
|
||||||
)
|
/**
|
||||||
|
* NOTE: For full dynamic metadata you would fetch the post here.
|
||||||
|
* Since this CMS appears to be client-side/localStorage based,
|
||||||
|
* we provide sensible per-slug defaults and let the client
|
||||||
|
* component inject JSON-LD after hydration.
|
||||||
|
*/
|
||||||
|
export async function generateMetadata({ params }: Props): Promise<Metadata> {
|
||||||
|
const slug = params.slug
|
||||||
|
const title = slug
|
||||||
|
.split('-')
|
||||||
|
.map((w: string) => w.charAt(0).toUpperCase() + w.slice(1))
|
||||||
|
.join(' ')
|
||||||
|
|
||||||
|
const description = `Read "${title}" on ${SITE_NAME}.`
|
||||||
|
const canonicalUrl = `${SITE_URL}/blog/${slug}`
|
||||||
|
const ogImageUrl = `/api/og?slug=${encodeURIComponent(slug)}`
|
||||||
|
|
||||||
|
return {
|
||||||
|
title,
|
||||||
|
description,
|
||||||
|
alternates: {
|
||||||
|
canonical: canonicalUrl,
|
||||||
|
},
|
||||||
|
openGraph: {
|
||||||
|
type: 'article',
|
||||||
|
url: canonicalUrl,
|
||||||
|
title: `${title} | ${SITE_NAME}`,
|
||||||
|
description,
|
||||||
|
images: [
|
||||||
|
{
|
||||||
|
url: ogImageUrl,
|
||||||
|
width: 1200,
|
||||||
|
height: 630,
|
||||||
|
alt: title,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
twitter: {
|
||||||
|
card: 'summary_large_image',
|
||||||
|
title: `${title} | ${SITE_NAME}`,
|
||||||
|
description,
|
||||||
|
images: [ogImageUrl],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function PostPage({ params }: Props) {
|
||||||
|
return <BlogPostPageClient slug={params.slug} />
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue