astro ブログで tag 検索する - 分野別に日付でソート

(2024-05-26)

astro ブログの記事を医学と一般の 2 つに分けているので、別々に検索したいことがあります。 また、日付でソートして新しい方から表示したいと思います。

構造

こんな構造になっています。

コード

src/pages/tags/[tag].astro
---
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)) },