feat: SEO altyapısı + admin editör/favicon/menü düzeltmeleri
Admin & site: - @tailwindcss/typography ekle → editör ve yayın içeriği prose stilleriyle düzgün render - Favicon: logo.png'den kare app/icon.png + apple-icon.png, varsayılan favicon.ico kaldırıldı - SEO keyword: seo_settings.default_keywords + seo_pages.keywords + buildMetadata birleştirme - Menü düzeni admin'den yönetilebilir (site_settings.nav_items, /admin/menu, header & mobile-menu refactor) SEO: - app/sitemap.ts (statik + blog/hizmet/çözüm/proje/sektör dinamik) - app/robots.ts (sitemap ref + /admin,/api disallow) - app/llms.txt/route.ts (AI/LLM rehberi) - BlogPosting/Service/FAQ/Article JSON-LD wire (json-ld bileşenleri bağlandı) - buildMetadata: blog/proje OG görseli + type article + keywords birleştirme düzeltmesi - blog tags → keyword
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
import type { MetadataRoute } from "next";
|
||||
import { siteConfig } from "@/lib/site-config";
|
||||
import {
|
||||
listIndustries,
|
||||
listProjects,
|
||||
listPublishedPosts,
|
||||
listServices,
|
||||
listSolutions,
|
||||
} from "@/lib/data";
|
||||
|
||||
const BASE = siteConfig.url;
|
||||
|
||||
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
|
||||
const [posts, services, solutions, projects, industries] = await Promise.all([
|
||||
listPublishedPosts({ limit: 200 }),
|
||||
listServices(),
|
||||
listSolutions(),
|
||||
listProjects({ limit: 200 }),
|
||||
listIndustries(),
|
||||
]);
|
||||
|
||||
const staticRoutes: MetadataRoute.Sitemap = [
|
||||
{ url: `${BASE}/`, changeFrequency: "weekly", priority: 1 },
|
||||
{ url: `${BASE}/hizmetler`, changeFrequency: "monthly", priority: 0.9 },
|
||||
{ url: `${BASE}/cozumler`, changeFrequency: "monthly", priority: 0.9 },
|
||||
{ url: `${BASE}/projeler`, changeFrequency: "monthly", priority: 0.8 },
|
||||
{ url: `${BASE}/blog`, changeFrequency: "daily", priority: 0.8 },
|
||||
{ url: `${BASE}/hakkimizda`, changeFrequency: "yearly", priority: 0.6 },
|
||||
{ url: `${BASE}/iletisim`, changeFrequency: "yearly", priority: 0.7 },
|
||||
{ url: `${BASE}/site-analizi`, changeFrequency: "yearly", priority: 0.6 },
|
||||
{ url: `${BASE}/cerez-politikasi`, changeFrequency: "yearly", priority: 0.2 },
|
||||
];
|
||||
|
||||
const toEntry = (
|
||||
path: string,
|
||||
updatedAt?: string,
|
||||
priority = 0.7,
|
||||
): MetadataRoute.Sitemap[number] => ({
|
||||
url: `${BASE}${path}`,
|
||||
lastModified: updatedAt ? new Date(updatedAt) : undefined,
|
||||
changeFrequency: "weekly",
|
||||
priority,
|
||||
});
|
||||
|
||||
return [
|
||||
...staticRoutes,
|
||||
...posts.map((p) => toEntry(`/blog/${p.slug}`, p.$updatedAt, 0.7)),
|
||||
...services.map((s) => toEntry(`/hizmetler/${s.slug}`, s.$updatedAt, 0.8)),
|
||||
...solutions.map((s) => toEntry(`/cozumler/${s.slug}`, s.$updatedAt, 0.8)),
|
||||
...projects.map((p) => toEntry(`/projeler/${p.slug}`, p.$updatedAt, 0.7)),
|
||||
...industries.map((i) => toEntry(`/sektor/${i.slug}`, i.$updatedAt, 0.6)),
|
||||
];
|
||||
}
|
||||
Reference in New Issue
Block a user