From b064367fd7e6da0cfcf419ef78f1ae21a84e1133 Mon Sep 17 00:00:00 2001 From: RizqiSyahrendra Date: Fri, 7 Mar 2025 23:17:40 +0700 Subject: [PATCH] fix: meta tags and jsonld --- src/app/(main)/[slug]/page.tsx | 7 +++ src/app/(main)/page.tsx | 32 +++++--------- src/components/Blogs/BlogDetail.tsx | 67 +++++++++++++++++++++++++++++ src/middleware.ts | 4 +- src/services/payload/blog.ts | 2 + src/utils/metadata.ts | 16 ++++++- 6 files changed, 104 insertions(+), 24 deletions(-) diff --git a/src/app/(main)/[slug]/page.tsx b/src/app/(main)/[slug]/page.tsx index 37e8955..7de1f14 100644 --- a/src/app/(main)/[slug]/page.tsx +++ b/src/app/(main)/[slug]/page.tsx @@ -16,6 +16,7 @@ export async function generateMetadata({ params }: { params: Promise<{ slug: str let updatedAt = ""; let imgUrl = ""; let createdByName = ""; + let canonicalUrl = ""; const slug = (await params).slug; const blog = await fetchBlogDetail(slug); @@ -39,6 +40,9 @@ export async function generateMetadata({ params }: { params: Promise<{ slug: str imgUrl = page.heroImg?.url; publishedAt = page.createdAt; updatedAt = page.updatedAt; + if (!!page.meta?.cannonical_url) { + canonicalUrl = page.meta.cannonical_url; + } if (!!page?.createdBy && typeof page.createdBy !== "number") { createdByName = page?.createdBy?.name ?? ""; @@ -55,6 +59,9 @@ export async function generateMetadata({ params }: { params: Promise<{ slug: str defaultMetadata.openGraph.description = description; defaultMetadata.openGraph.images = !!imgUrl ? [imgUrl] : undefined; } + if (!!defaultMetadata.alternates && !!canonicalUrl) { + defaultMetadata.alternates.canonical = canonicalUrl; + } defaultMetadata.twitter = { card: "summary_large_image", title: title, diff --git a/src/app/(main)/page.tsx b/src/app/(main)/page.tsx index d0dd674..7158c7d 100644 --- a/src/app/(main)/page.tsx +++ b/src/app/(main)/page.tsx @@ -1,30 +1,18 @@ import Parallax from "./home-bg-video/page"; import Homepage from "@/components/Homepage"; import { BeforeFooterBlock } from "@/components/Blocks/BeforeFooter"; +import { Metadata, Viewport } from "next"; +import { getDefaultMetadata } from "@/utils/metadata"; -export const metadata = { - title: "HomePage - Cochise Oncology", - description: "Cochise Oncology", - keywords: "Cochise Oncology, Oncology, Healthcare, Medical Services, Cancer Treatment", - author: "Cochise Oncology", - robots: "index, follow", - og: { - title: "HomePage - Cochise Oncology", - description: "Cochise Oncology", - type: "website", - url: "https://www.cochiseoncology.com", - image: "https://www.cochiseoncology.com/og-image.jpg", - }, - twitter: { - card: "summary_large_image", - site: "@CochiseOncology", - title: "HomePage - Cochise Oncology", - description: "Cochise Oncology", - image: "https://www.cochiseoncology.com/twitter-image.jpg", - }, -}; +export async function generateMetadata(): Promise { + const defaultMetadata = await getDefaultMetadata(); + defaultMetadata.title = `Homepage - ${defaultMetadata.openGraph?.siteName}`; + defaultMetadata.description = + "Get compassionate care and excellent medical services from COCHISE ONCOLOGY in Sierra Vista, Arizona. We are the largest full-service cancer treatment center between Albuquerque, New Mexico and Tucson, Arizona."; + return defaultMetadata; +} -export const viewport = { +export const viewport: Viewport = { width: "device-width", initialScale: 1, }; diff --git a/src/components/Blogs/BlogDetail.tsx b/src/components/Blogs/BlogDetail.tsx index bf05b87..a946ea8 100644 --- a/src/components/Blogs/BlogDetail.tsx +++ b/src/components/Blogs/BlogDetail.tsx @@ -13,6 +13,7 @@ export interface BlogDetailProps { export default async function BlogDetail({ slug }: BlogDetailProps) { const data = await fetchBlogDetail(slug); const headersList = await headers(); + const mainUrl = headersList.get("x-main-url"); const fullUrl = headersList.get("x-full-url"); const shareUrl = { @@ -25,8 +26,74 @@ export default async function BlogDetail({ slug }: BlogDetailProps) { notFound(); } + let author = {}; + console.log("data?.data?.createdBy", data?.data?.createdBy); + if (!!data?.data?.createdBy && typeof data?.data?.createdBy !== "number") { + author = { + author: { + name: data?.data?.createdBy?.name, + "@id": `${mainUrl}/#/schema/person/${data?.data?.createdBy?.id}`, + }, + }; + } + + const jsonLd = { + "@context": "https://schema.org", + "@graph": [ + { + "@type": "Article", + "@id": `${fullUrl}#article`, + isPartOf: { + "@id": fullUrl, + }, + ...author, + headline: data?.data?.title ?? "", + datePublished: data?.createdAt, + dateModified: data?.updatedAt, + mainEntityOfPage: { + "@id": fullUrl, + }, + publisher: { "@id": `${mainUrl}/#organization` }, + image: { + "@id": `${fullUrl}#primaryimage`, + }, + thumbnailUrl: data?.imgUrl ?? "", + inLanguage: "en-US", + }, + { + "@type": "WebPage", + "@id": fullUrl, + url: fullUrl, + name: `${data?.data?.title ?? ""} - Cochise Oncology`, + isPartOf: { "@id": `${mainUrl}/#website` }, + primaryImageOfPage: { + "@id": `${fullUrl}#primaryimage`, + }, + image: { + "@id": `${fullUrl}#primaryimage`, + }, + thumbnailUrl: data?.imgUrl ?? "", + datePublished: data?.createdAt, + dateModified: data?.updatedAt, + description: data?.data?.meta?.description, + breadcrumb: { + "@id": `${fullUrl}#breadcrumb`, + }, + inLanguage: "en-US", + potentialAction: [ + { + "@type": "ReadAction", + target: [fullUrl], + }, + ], + }, + ], + }; + return ( <> +