fix: apply seo agent improvements to src/components/public/BlogPostPageClient.tsx
This commit is contained in:
parent
cee7138b2f
commit
8e1dd3df62
|
|
@ -0,0 +1,68 @@
|
|||
'use client'
|
||||
import { useEffect } from 'react'
|
||||
import PublicLayout from '@/components/public/PublicLayout'
|
||||
import BlogPostPage from '@/components/public/BlogPostPage'
|
||||
|
||||
const SITE_URL = process.env.NEXT_PUBLIC_SITE_URL || 'https://example.com'
|
||||
const SITE_NAME = process.env.NEXT_PUBLIC_SITE_NAME || 'My Personal Site'
|
||||
|
||||
interface Props {
|
||||
slug: string
|
||||
}
|
||||
|
||||
export default function BlogPostPageClient({ slug }: Props) {
|
||||
/**
|
||||
* Inject JSON-LD for BlogPosting after hydration.
|
||||
* In a real server-side CMS you would do this in generateMetadata
|
||||
* or in a server component. Here we gracefully degrade.
|
||||
*/
|
||||
useEffect(() => {
|
||||
const existingScript = document.getElementById('blog-post-jsonld')
|
||||
if (existingScript) existingScript.remove()
|
||||
|
||||
const title = slug
|
||||
.split('-')
|
||||
.map((w) => w.charAt(0).toUpperCase() + w.slice(1))
|
||||
.join(' ')
|
||||
|
||||
const jsonLd = {
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'BlogPosting',
|
||||
headline: title,
|
||||
url: `${SITE_URL}/blog/${slug}`,
|
||||
author: {
|
||||
'@type': 'Person',
|
||||
name: SITE_NAME,
|
||||
url: SITE_URL,
|
||||
},
|
||||
publisher: {
|
||||
'@type': 'Person',
|
||||
name: SITE_NAME,
|
||||
url: SITE_URL,
|
||||
},
|
||||
mainEntityOfPage: {
|
||||
'@type': 'WebPage',
|
||||
'@id': `${SITE_URL}/blog/${slug}`,
|
||||
},
|
||||
}
|
||||
|
||||
const script = document.createElement('script')
|
||||
script.id = 'blog-post-jsonld'
|
||||
script.type = 'application/ld+json'
|
||||
script.textContent = JSON.stringify(jsonLd)
|
||||
document.head.appendChild(script)
|
||||
|
||||
return () => {
|
||||
const s = document.getElementById('blog-post-jsonld')
|
||||
if (s) s.remove()
|
||||
}
|
||||
}, [slug])
|
||||
|
||||
return (
|
||||
<PublicLayout>
|
||||
<main id="main-content" aria-label="Blog post">
|
||||
<BlogPostPage slug={slug} />
|
||||
</main>
|
||||
</PublicLayout>
|
||||
)
|
||||
}
|
||||
Loading…
Reference in New Issue