astro ブログの記事を医学と一般の 2 つに分けているので、別々に検索したいことがあります。 また、日付でソートして新しい方から表示したいと思います。
こんな構造になっています。
---import BaseLayout from '/src/layouts/BaseLayout.astro';import BlogPost from '/src/components/BlogPost.astro';
export async function getStaticPaths() { const allPosts1 = await Astro.glob('/src/pages/posts/*/*.{md,mdx}'); const allPosts2 = await Astro.glob('/src/pages/medicine/*/*.{md,mdx}');
const uniqueTags1 = [...new Set(allPosts1.map((post) => post.frontmatter.tags).flat())]; const uniqueTags2 = [...new Set(allPosts2.map((post) => post.frontmatter.tags).flat())];
const paths1 = []; const paths2 = [];
uniqueTags1.forEach((tag) => { const filteredPosts = allPosts1.filter((post) => post.frontmatter.tags.includes(tag)); paths1.push({ params: { tag }, props: { posts: filteredPosts.sort((a, b) => new Date(b.frontmatter.pubDate) - new Date(a.frontmatter.pubDate)) }, }); });
uniqueTags2.forEach((tag) => { const filteredPosts = allPosts2.filter((post) => post.frontmatter.tags.includes(tag)); paths2.push({ params: { tag }, props: { posts: filteredPosts.sort((a, b) => new Date(b.frontmatter.pubDate) - new Date(a.frontmatter.pubDate)) }, }); });
return [...paths1, ...paths2]; // 配列を結合して返す}
const { tag } = Astro.params;const { posts } = Astro.props;---<BaseLayout pageTitle={tag}> <div> <h2>検索結果</h2> <ol class="list-decimal mx-3"> {posts.map((post) => <BlogPost key={post.url} url={post.url} title={post.frontmatter.title} pubDate={post.frontmatter.pubDate}/>)} </ol> </div></BaseLayout>
ポイントは、
props: { posts: filteredPosts.sort((a, b) => new Date(b.frontmatter.pubDate) - new Date(a.frontmatter.pubDate)) },