From f3088e996f16384285496d01c005a29325a0b085 Mon Sep 17 00:00:00 2001 From: "CoolChange.AI" Date: Fri, 31 Jul 2026 18:50:44 -0700 Subject: [PATCH] =?UTF-8?q?fix:=20P0=20SEO=20=E4=BF=AE=E5=A4=8D=EF=BC=88si?= =?UTF-8?q?temap=20=E5=8A=A8=E6=80=81=E5=8C=96=20/=20canonical=20/=20OG=20?= =?UTF-8?q?=E5=9B=BE=20/=20JSON-LD=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - sitemap 加入全部 published 工具详情页、分类页、博客文章(双语),每小时 revalidate - metadata.ts 新增 absoluteUrl 助手:canonical/hreflang 与 localePrefix 'as-needed' 对齐,英文页不再指向 301;x-default 修正为默认语言 en - 生成缺失的 public/og-image.png、icon-192.png、icon-512.png - 工具详情页、工具列表页、博客文章页补完整 metadata(canonical/hreflang/OG) - JSON-LD 从 next/script afterInteractive 改为原生 script 标签,进入初始 HTML Co-Authored-By: Claude Fable 5 --- public/icon-192.png | Bin 0 -> 3205 bytes public/icon-512.png | Bin 0 -> 11747 bytes public/og-image.png | Bin 0 -> 36691 bytes .../[locale]/(marketing)/blog/[slug]/page.tsx | 18 ++-- .../(marketing)/tools/[slug]/page.tsx | 8 +- src/app/[locale]/(marketing)/tools/page.tsx | 16 +++- src/app/sitemap.ts | 80 +++++++++++++----- src/components/json-ld.tsx | 17 +--- src/lib/metadata.ts | 40 ++++++--- 9 files changed, 114 insertions(+), 65 deletions(-) create mode 100644 public/icon-192.png create mode 100644 public/icon-512.png create mode 100644 public/og-image.png diff --git a/public/icon-192.png b/public/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..7c356468f41fd0f34e95b866ceb4c86874e9f510 GIT binary patch literal 3205 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 literal 0 HcmV?d00001 diff --git a/public/og-image.png b/public/og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..6962af57e25a5f47800db31d53b0a5f0d577157d GIT binary patch literal 36691 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 yNgzg}`(; } const { blog } = blogModule; - const metadata: Metadata = { + + return generatePageMetadata({ + locale, + path: `/blog/${slug}`, title: blog.title, description: blog.description, - }; - - if (blog.image) { - metadata.openGraph = { - images: [blog.image], - }; - } - - return metadata; + ogImage: blog.image, + ogType: "article", + }); } export default async function BlogPostPage({ params }: PageProps) { diff --git a/src/app/[locale]/(marketing)/tools/[slug]/page.tsx b/src/app/[locale]/(marketing)/tools/[slug]/page.tsx index 9f67fa9..21ef1ec 100644 --- a/src/app/[locale]/(marketing)/tools/[slug]/page.tsx +++ b/src/app/[locale]/(marketing)/tools/[slug]/page.tsx @@ -5,6 +5,7 @@ import { getLocale, getTranslations } from "next-intl/server"; import { ExternalLink, ArrowLeft, Tag } from "lucide-react"; import { Button } from "@/components/button"; import { SoftwareApplicationJsonLd } from "@/components/json-ld"; +import { generatePageMetadata } from "@/lib/metadata"; interface ToolDetailPageProps { params: Promise<{ @@ -30,10 +31,13 @@ export async function generateMetadata({ params }: ToolDetailPageProps) { ? tool.descriptionZh : tool.descriptionEn; - return { + return generatePageMetadata({ + locale, + path: `/tools/${slug}`, title: `${name} - ${t("title")}`, description: description || `${t("subtitle")} - ${name}`, - }; + ogImage: tool.coverImageUrl || tool.logoUrl || undefined, + }); } export default async function ToolDetailPage({ params }: ToolDetailPageProps) { diff --git a/src/app/[locale]/(marketing)/tools/page.tsx b/src/app/[locale]/(marketing)/tools/page.tsx index 8eb88d9..a0b9d34 100644 --- a/src/app/[locale]/(marketing)/tools/page.tsx +++ b/src/app/[locale]/(marketing)/tools/page.tsx @@ -2,13 +2,21 @@ import { getPublishedTools, getCategoriesWithCount } from "@/features/tools/acti import { ToolsList } from "@/features/tools/components/tools-list"; import { CollectionPageJsonLd } from "@/components/json-ld"; import { getLocale, getTranslations } from "next-intl/server"; +import { generatePageMetadata } from "@/lib/metadata"; -export async function generateMetadata() { - const t = await getTranslations("seo.tools"); - return { +export async function generateMetadata({ + params, +}: { + params: Promise<{ locale: string }>; +}) { + const { locale } = await params; + const t = await getTranslations({ locale, namespace: "seo.tools" }); + return generatePageMetadata({ + locale, + path: "/tools", title: t("title"), description: t("description"), - }; + }); } interface ToolsPageProps { diff --git a/src/app/sitemap.ts b/src/app/sitemap.ts index bbfce04..4a5512d 100644 --- a/src/app/sitemap.ts +++ b/src/app/sitemap.ts @@ -1,12 +1,19 @@ import { MetadataRoute } from 'next' +import { eq } from 'drizzle-orm' -export default function sitemap(): MetadataRoute.Sitemap { - const baseUrl = process.env.NEXT_PUBLIC_APP_URL || 'https://toolso.ai' +// 每小时重新生成,保证新收录的工具能进入 sitemap +export const revalidate = 3600 +import { db } from '@/lib/db' +import { tool, category } from '@/lib/db/schema' +import { getAllBlogs } from '@/lib/blog' +import { locales } from '@/i18n.config' +import { absoluteUrl } from '@/lib/metadata' +export default async function sitemap(): Promise { // Static routes with SEO priority for AI tools directory const staticRoutes = [ { path: '', changeFreq: 'daily' as const, priority: 1.0 }, - { path: '/tools', changeFreq: 'daily' as const, priority: 0.95 }, // AI tools directory - high priority + { path: '/tools', changeFreq: 'daily' as const, priority: 0.95 }, { path: '/blog', changeFreq: 'weekly' as const, priority: 0.8 }, { path: '/contact', changeFreq: 'monthly' as const, priority: 0.5 }, { path: '/privacy', changeFreq: 'monthly' as const, priority: 0.3 }, @@ -14,26 +21,53 @@ export default function sitemap(): MetadataRoute.Sitemap { { path: '/cookies', changeFreq: 'monthly' as const, priority: 0.3 }, ] - // Generate sitemap entries for both languages - const locales = ['zh', 'en'] - const sitemapEntries: MetadataRoute.Sitemap = [] + const [tools, categories, blogs] = await Promise.all([ + db + .select({ slug: tool.slug, updatedAt: tool.updatedAt }) + .from(tool) + .where(eq(tool.status, 'published')), + db.select({ slug: category.slug, updatedAt: category.updatedAt }).from(category), + getAllBlogs(), + ]) - locales.forEach((locale) => { - staticRoutes.forEach((route) => { - sitemapEntries.push({ - url: `${baseUrl}/${locale}${route.path}`, - lastModified: new Date(), - changeFrequency: route.changeFreq, - priority: route.priority, - alternates: { - languages: { - zh: `${baseUrl}/zh${route.path}`, - en: `${baseUrl}/en${route.path}`, - }, + const dynamicRoutes = [ + ...tools.map((t) => ({ + path: `/tools/${t.slug}`, + changeFreq: 'weekly' as const, + priority: 0.9, + lastModified: t.updatedAt, + })), + ...categories.map((c) => ({ + path: `/category/${c.slug}`, + changeFreq: 'daily' as const, + priority: 0.85, + lastModified: c.updatedAt, + })), + ...blogs.map((b) => ({ + path: `/blog/${b.slug}`, + changeFreq: 'monthly' as const, + priority: 0.7, + lastModified: b.date ? new Date(b.date) : undefined, + })), + ] + + const allRoutes = [ + ...staticRoutes.map((r) => ({ ...r, lastModified: undefined as Date | undefined })), + ...dynamicRoutes, + ] + + return locales.flatMap((locale) => + allRoutes.map((route) => ({ + url: absoluteUrl(locale, route.path), + lastModified: route.lastModified ?? new Date(), + changeFrequency: route.changeFreq, + priority: route.priority, + alternates: { + languages: { + en: absoluteUrl('en', route.path), + zh: absoluteUrl('zh', route.path), }, - }) - }) - }) - - return sitemapEntries + }, + })) + ) } diff --git a/src/components/json-ld.tsx b/src/components/json-ld.tsx index 8374372..c29cda7 100644 --- a/src/components/json-ld.tsx +++ b/src/components/json-ld.tsx @@ -1,4 +1,3 @@ -import Script from 'next/script' interface WebSiteJsonLdProps { name: string @@ -30,10 +29,8 @@ export function WebSiteJsonLd({ name, description, url, locale }: WebSiteJsonLdP } return ( -