From 8c934213eb9ba694aa153b37c8ac31244b7cb7eb Mon Sep 17 00:00:00 2001 From: Thuan Bui <9248622+10h30@users.noreply.github.com> Date: Sun, 22 Mar 2026 09:51:26 +0700 Subject: [PATCH] feat: add getDescendantSlugs function and update category/destination filtering logic --- src/pages/category/[...rest].astro | 6 +++++- src/pages/destination/[...rest].astro | 10 +++++++--- src/utils/taxonomy.ts | 23 +++++++++++++++++++++++ 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/pages/category/[...rest].astro b/src/pages/category/[...rest].astro index dbcd661..d1cb15c 100644 --- a/src/pages/category/[...rest].astro +++ b/src/pages/category/[...rest].astro @@ -8,6 +8,7 @@ import Pagination from "@/components/ui/Pagination.astro"; import { getTaxonomyMap, getTaxonomyPath, + getDescendantSlugs, type TaxonomyItem, } from "@/utils/taxonomy"; import { buildPaginatedPaths } from "@/utils/paginate"; @@ -32,8 +33,11 @@ export async function getStaticPaths() { ); return Array.from(catSlugs).flatMap((slug) => { + const descendants = getDescendantSlugs("category", slug); + const allSlugs = [slug, ...descendants]; + const catPosts = posts - .filter((post) => post.data.categories?.includes(slug)) + .filter((post) => post.data.categories?.some((d) => allSlugs.includes(d))) .sort((a, b) => b.data.pubDate.valueOf() - a.data.pubDate.valueOf()); const fullPath = getTaxonomyPath("category", slug); diff --git a/src/pages/destination/[...rest].astro b/src/pages/destination/[...rest].astro index 0fcfc27..4ec9600 100644 --- a/src/pages/destination/[...rest].astro +++ b/src/pages/destination/[...rest].astro @@ -8,6 +8,7 @@ import Pagination from "@/components/ui/Pagination.astro"; import { getTaxonomyMap, getTaxonomyPath, + getDescendantSlugs, type TaxonomyItem, } from "@/utils/taxonomy"; import { buildPaginatedPaths } from "@/utils/paginate"; @@ -32,8 +33,13 @@ export async function getStaticPaths() { ); return Array.from(destSlugs).flatMap((slug) => { + const descendants = getDescendantSlugs("destination", slug); + const allSlugs = [slug, ...descendants]; + const destPosts = posts - .filter((post) => post.data.destination?.includes(slug)) + .filter((post) => + post.data.destination?.some((d) => allSlugs.includes(d)), + ) .sort((a, b) => b.data.pubDate.valueOf() - a.data.pubDate.valueOf()); const fullPath = getTaxonomyPath("destination", slug); @@ -88,11 +94,9 @@ const metadata = { subtitle: "mx-auto max-w-3xl text-xl text-muted-foreground", }} /> -
← Quay lại blog
-
{posts.map((post) => )}
diff --git a/src/utils/taxonomy.ts b/src/utils/taxonomy.ts index 9c80861..9d41b8e 100644 --- a/src/utils/taxonomy.ts +++ b/src/utils/taxonomy.ts @@ -77,3 +77,26 @@ export function getTaxonomyItem( ): TaxonomyItem | undefined { return getTaxonomyMap(type).get(slug); } + +export function getDescendantSlugs( + taxonomyType: string, + slug: string, +): string[] { + const map = getTaxonomyMap(taxonomyType); + const result: string[] = []; + + for (const [key, item] of map.entries()) { + if (key === slug) continue; + // Đi ngược từ node này lên root, kiểm tra xem có qua slug không + let current: TaxonomyItem | undefined = item; + while (current?.parent) { + if (current.parent === slug) { + result.push(key); + break; + } + current = map.get(current.parent); + } + } + + return result; +}