feat(katalog): şehre göre üniversiteler — /universiteler/[il] sayfaları ve şehir çipleri
- Veri: getAllIller/getIlBySlug (üniversite en çok programının olduğu ile sayılır; ili boş olan hiçbir şehre girmez; tireli yurt dışı adlar baş harfli). - /universiteler: "Şehre göre" çip satırı (2+ üniversiteli 28 şehir) + "Tüm şehirler" A–Z üç sütunlu liste (#tum-sehirler). - /universiteler/[il]: 92 statik şehir sayfası — katalog detay düzeni, il ve üniversite sayısı hapları, kompakt sıra satırı, devlet/vakıf/KKTC-yurt dışı öbekleri, diğer şehir çipleri, CTA bandı; metadata + breadcrumb JSON-LD. - SehirCipleri: sihirbaz il çipiyle aynı kalıp, aktif şehir mavi dolu. - Sitemap'e şehir sayfaları eklendi. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,10 @@
|
||||
import type { MetadataRoute } from "next";
|
||||
import { KATALOG_VERI_TARIHI, SITE_URL } from "@/lib/seo";
|
||||
import { getAllBolumSlugs, getAllUniversiteSlugs } from "@/lib/katalog";
|
||||
import {
|
||||
getAllBolumSlugs,
|
||||
getAllIlSlugs,
|
||||
getAllUniversiteSlugs,
|
||||
} from "@/lib/katalog";
|
||||
import { getAllRehberler } from "@/lib/rehber";
|
||||
|
||||
// Bilinçli olarak sitemap DIŞI: /sonuc (noindex), /giris, /listem,
|
||||
@@ -46,6 +50,12 @@ export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
|
||||
changeFrequency: "monthly",
|
||||
}),
|
||||
);
|
||||
const iller: MetadataRoute.Sitemap = getAllIlSlugs().map((slug) => ({
|
||||
url: `${SITE_URL}/universiteler/${slug}`,
|
||||
lastModified: KATALOG_VERI_TARIHI,
|
||||
priority: 0.6,
|
||||
changeFrequency: "monthly",
|
||||
}));
|
||||
const yazilar = getAllRehberler();
|
||||
const rehberler: MetadataRoute.Sitemap = yazilar.map((y) => ({
|
||||
url: `${SITE_URL}/rehber/${y.slug}`,
|
||||
@@ -72,6 +82,7 @@ export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
|
||||
rehberDizini,
|
||||
...bolumler,
|
||||
...universiteler,
|
||||
...iller,
|
||||
...rehberler,
|
||||
];
|
||||
}
|
||||
|
||||
33
src/app/universiteler/[il]/page.tsx
Normal file
33
src/app/universiteler/[il]/page.tsx
Normal file
@@ -0,0 +1,33 @@
|
||||
import { Suspense } from "react";
|
||||
import type { Metadata } from "next";
|
||||
import { SiteFooter } from "@/components/site-footer";
|
||||
import {
|
||||
IlIcerik,
|
||||
IlIcerikSkeleton,
|
||||
ilSayfaMetadata,
|
||||
ilStaticSlugs,
|
||||
} from "@/features/katalog/components/il-icerik";
|
||||
|
||||
export function generateStaticParams() {
|
||||
return ilStaticSlugs().map((il) => ({ il }));
|
||||
}
|
||||
|
||||
export async function generateMetadata({
|
||||
params,
|
||||
}: PageProps<"/universiteler/[il]">): Promise<Metadata> {
|
||||
const { il } = await params;
|
||||
return ilSayfaMetadata(il);
|
||||
}
|
||||
|
||||
export default function IlPage({ params }: PageProps<"/universiteler/[il]">) {
|
||||
return (
|
||||
<>
|
||||
<Suspense fallback={<IlIcerikSkeleton />}>
|
||||
{params.then(({ il }) => (
|
||||
<IlIcerik slug={il} />
|
||||
))}
|
||||
</Suspense>
|
||||
<SiteFooter />
|
||||
</>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user