diff --git a/src/app/news/[id]/page.tsx b/src/app/news/[id]/page.tsx index 461d35b..b2818ee 100644 --- a/src/app/news/[id]/page.tsx +++ b/src/app/news/[id]/page.tsx @@ -2,7 +2,7 @@ import { notFound } from "next/navigation"; import { getNewsById } from "@/lib/directus/news"; import type { NewsItem } from "@/types/news"; import NewsDetail from "@/components/news/NewsDetail"; - +export const dynamic = "force-dynamic"; export const revalidate = 3600; export default async function NewsDetailPage({ params }: { params: Promise<{ id: string }> }) { diff --git a/src/app/page.tsx b/src/app/page.tsx index 20e2530..e97cdbb 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -47,18 +47,27 @@ export default async function Home() { ); - // linkurl があればクリック可能に - return item.linkurl ? ( + // --- 事前にURL文字列を確定 --- + const url = item.linkurl?.trim() ?? ""; + const hasValidLink = url !== "" && url.toLowerCase() !== "none"; + + const href: string = hasValidLink + ? /^https?:\/\//.test(url) + ? url // 外部URL + : url.startsWith("/") + ? url // 内部スラッグ (/page 等) + : `/news/${url}` // 相対指定は /news/配下として扱う + : `/news/${item.id}`; // 「リンクなし」時は詳細へ + + return ( {content} - ) : ( -
{content}
); })} diff --git a/src/lib/directus/news.ts b/src/lib/directus/news.ts index 7d13605..a80937a 100644 --- a/src/lib/directus/news.ts +++ b/src/lib/directus/news.ts @@ -5,19 +5,45 @@ import { NewsItem } from "@/types/news"; * 最新ニュース5件取得 */ export async function getLatestNews(): Promise { - return await directusFetch( - `/items/news?sort[]=-published_at&limit=5&fields[]=id&fields[]=title&fields[]=slug&fields[]=published_at&fields[]=thumbnail.id&fields[]=thumbnail.filename_disk&fields[]=linkurl&fields[]=link_target&fields[]=tags` - ); -} + const query = [ + "filter[status][_eq]=1", // ✅ 公開=1 のみ取得 + "sort[]=-published_at", + "limit=5", + "fields[]=id", + "fields[]=title", + "fields[]=slug", + "fields[]=published_at", + "fields[]=thumbnail.id", + "fields[]=thumbnail.filename_disk", + "fields[]=linkurl", + "fields[]=link_target", + "fields[]=tags", + ].join("&"); + + return await directusFetch(`/items/news?${query}`); + } /** * 全ニュース一覧取得 */ export async function getAllNews(): Promise { - return await directusFetch( - `/items/news?sort[]=-published_at&fields[]=id&fields[]=title&fields[]=slug&fields[]=published_at&fields[]=thumbnail.id&fields[]=thumbnail.filename_disk&fields[]=linkurl&fields[]=link_target&fields[]=tags&fields[]=content` - ); -} + const query = [ + "filter[status][_eq]=1", // ✅ 公開=1 のみ取得 + "sort[]=-published_at", + "fields[]=id", + "fields[]=title", + "fields[]=slug", + "fields[]=published_at", + "fields[]=thumbnail.id", + "fields[]=thumbnail.filename_disk", + "fields[]=linkurl", + "fields[]=link_target", + "fields[]=tags", + "fields[]=content", + ].join("&"); + + return await directusFetch(`/items/news?${query}`); + } /** * ニュースID指定で詳細取得