範囲を限定してタグ検索

(2024-04-02)

範囲を限定してタグ検索

範囲を限定してタグ検索したいことがあります。

pages/tag_nurse/index.astro を作成します。

/src/pages/tag_nurse/index.astro
---
import BaseLayout from '../../layouts/BaseLayout.astro';
const allPosts = await Astro.glob('../nrsposts/*.md');
const tags = [...new Set(allPosts.map((post) => post.frontmatter.tags).flat())];
const pageTitle = "看護学校講義のタグによる検索";
---
<BaseLayout pageTitle={pageTitle}>
<div class="tags">
{tags.map((tag) => (
<p class="tag"><a href={`/tags_nurse/${tag}`}>{tag}</a></p>
))}
</div>
</BaseLayout>

検索範囲を、’../nrsposts/*.md’ にしてあります。

pages/tag_nurse/[tag].astro

pages/tag_nurse/[tag].astro の作成。

/src/pages/tag_nurse/[tag].astro
---
import BaseLayout from '../../layouts/BaseLayout.astro';
import BlogPost from '../../components/BlogPost.astro';
export async function getStaticPaths() {
const allPosts = await Astro.glob('../nrsposts/*.md');
const uniqueTags = [...new Set(allPosts.map((post) => post.frontmatter.tags).flat())];
return uniqueTags.map((tag) => {
const filteredPosts = allPosts.filter((post) => post.frontmatter.tags.includes(tag));
return {
params: { tag },
props: { posts: filteredPosts },
};
});
}
const { tag } = Astro.params ;
const { posts } = Astro.props;
---
<BaseLayout pageTitle={tag}>
<ol class="list-decimal mx-3">
{posts.map((post) => <BlogPost url={post.url} title={post.frontmatter.title}/>)}
</ol>
</BaseLayout>

ここでも検索範囲を、’../nrsposts/*.md’ にしてあります。

pages/nurse.astro を作成して、講義一覧を表示させて、その一部にタグ一覧を表示しクリックにてリンクするようにしました。

/src/pages/nurse.astro
---
import BaseLayout from '../layouts/BaseLayout.astro'
import Search from "../components/Search.astro";
import '../styles/global.css';
const allPosts = await Astro.glob('../pages/nrsposts/*.md').then(posts => posts.reverse());
const tags = [...new Set(allPosts.map((post) => post.frontmatter.tags).flat())];
const nonDraftPosts = allPosts.filter((post) => !post.frontmatter.draft);
// ↓以下のコードに変更↓
const sortedPosts = nonDraftPosts.sort((a, b) => {
const aDate = new Date(a.frontmatter.pubDate);
const bDate = new Date(b.frontmatter.pubDate);
return bDate.getTime() - aDate.getTime();
});
const pageTitle = "看護学校講義";
---
<BaseLayout pageTitle={pageTitle}>
<ul>
{nonDraftPosts.map((post) =>
<li class="border-b border-gray-400 mb-2 pb-2 hover:text-orange-700 transition-all duration-300">
<span class="text-slate-500 text-sm">{post.frontmatter.pubDate.slice(0,10)}</span><br>
<span class="text-lg"><a href={post.url}>{post.frontmatter.title}</a></span>
</li>)}
</ul>
<h2>タグ検索</h2>
<div class="tags">
{tags.map((tag) => (
<p class="tag"><a href={`/tags_nurse/${tag}`}>{tag}</a></p>
))}
</div>
</BaseLayout>

これで、看護学校の授業に関するタグだけの検索をすることができます。