From 35408b059a02a8c32d6bbfd1cfa1960e35d32114 Mon Sep 17 00:00:00 2001 From: hamed <15238-genius.ha@users.noreply.drupalcode.org> Date: Fri, 5 Jun 2026 21:28:12 +0330 Subject: [PATCH] seo check --- app/about-us/page.js | 13 +++ app/blog/[slug]/page.js | 74 +++++++++++++++-- app/blogs/page.js | 13 +++ app/clinic/[slug]/page.js | 65 ++++++++++++--- app/clinics/page.js | 17 ++++ app/doctor/[slug]/page.js | 79 ++++++++++++++++-- app/doctors/page.js | 17 ++++ app/layout.js | 18 +++- app/sitemap.js | 171 ++++++++++++++++++-------------------- app/specialties/page.js | 16 ++++ 10 files changed, 368 insertions(+), 115 deletions(-) diff --git a/app/about-us/page.js b/app/about-us/page.js index 12cb522..89fa48a 100644 --- a/app/about-us/page.js +++ b/app/about-us/page.js @@ -1,5 +1,18 @@ import AboutUsPage from "@/components/aboutUs"; import Layout from "@/components/layout/StLayout"; +import { getStateInfo } from "@/lib/getStateInfo"; + +export async function generateMetadata() { + const { matchedCity } = await getStateInfo(); + const siteName = matchedCity?.site_name || "نوبت 724"; + const title = `درباره ما | ${siteName}`; + const description = `آشنایی با ${siteName}، سیستم آنلاین نوبت‌دهی پزشکی. هدف ما ارائه خدمات سریع و کارآمد رزرو نوبت پزشکی برای همه مردم است.`; + return { + title, + description, + openGraph: { title, description }, + }; +} function AboutUs() { return ( diff --git a/app/blog/[slug]/page.js b/app/blog/[slug]/page.js index fc27a13..12b84b3 100644 --- a/app/blog/[slug]/page.js +++ b/app/blog/[slug]/page.js @@ -1,24 +1,86 @@ import BlogPage from "@/components/blog"; import Layout from "@/components/layout/StLayout"; import { fetchReq } from "@/lib/req"; +import { getStateInfo } from "@/lib/getStateInfo"; -async function Blog({ params: { slug } }) { +export async function generateMetadata({ params }) { + const { slug } = await params; + const API_URL = process.env.NEXT_PUBLIC_API_URL; + const { matchedCity } = await getStateInfo(); + const siteName = matchedCity?.site_name || "نوبت 724"; + + try { + const blog = await fetchReq(`${API_URL}/api/v1/blog/${slug}`); + if (!blog) return {}; + + const title = `${blog.title} | ${siteName}`; + const rawText = blog.body ? blog.body.replace(/<[^>]*>/g, "").trim() : ""; + const description = rawText.slice(0, 160) || blog.title; + + return { + title, + description, + openGraph: { + title, + description, + type: "article", + ...(blog.created && { publishedTime: blog.created }), + images: blog.images?.[0] + ? [blog.images[0]] + : ["https://www.nobat724.com/assets/images/logo.png"], + }, + twitter: { + card: "summary_large_image", + title, + description, + images: blog.images?.[0] + ? [blog.images[0]] + : ["https://www.nobat724.com/assets/images/logo.png"], + }, + }; + } catch { + return {}; + } +} + +async function Blog({ params }) { + const { slug } = await params; const API_URL = process.env.NEXT_PUBLIC_API_URL; const blog = await fetchReq(`${API_URL}/api/v1/blog/${slug}`); - // Get related blogs based on first tag let relatedBlogs = []; if (blog?.tag?.[0]?.id) { const tagId = blog.tag[0].id; - const relatedResponse = await fetchReq(`${API_URL}/api/v1/blogs?page=1&limit=12&tag=${tagId}`); + const relatedResponse = await fetchReq( + `${API_URL}/api/v1/blogs?page=1&limit=12&tag=${tagId}` + ); relatedBlogs = relatedResponse?.blogs || []; } + const jsonLd = blog + ? { + "@context": "https://schema.org", + "@type": "Article", + headline: blog.title, + ...(blog.images?.[0] && { image: blog.images[0] }), + ...(blog.created && { datePublished: blog.created }), + ...(blog.author && { author: { "@type": "Person", name: blog.author } }), + } + : null; + return ( - - - + <> + {jsonLd && ( +