Rebuilded sitemap generator

This commit is contained in:
2026-09-28 14:29:42 +02:00
parent b807fbe69a
commit de75d8374d
6 changed files with 70 additions and 169 deletions
+18 -20
View File
@@ -886,17 +886,17 @@ Generative Engine Optimization) i audytach „Agentic Browsing”.
Wymaga wypełnionego siteDescription i sensownych meta.description stron
(inaczej llms.txt będzie ubogi).
## Sitemap jako czytelna tabela (XSL stylesheet)
## Sitemap czytelny w przeglądarce (czysty XML)
Domyślny `/sitemap.xml` to surowy XML — Google go czyta, ale człowiek widzi
„ścianę tagów". Można ostylować przez XSL (przeglądarka renderuje tabelę),
zachowując poprawność dla crawlerów.
Domyślny `/sitemap.xml` (Next MetadataRoute) działa dla Google, ale w przeglądarce
bywa nieczytelny. Możesz serwować go jako **czysty, sformatowany XML** przez
`buildSitemapXml` — przeglądarka pokaże wbudowane drzewo XML (wcięcia, zwijanie,
kolorowanie składni), bez żadnej transformacji.
### Ograniczenie Next
Standardowy `app/sitemap.ts` (Next MetadataRoute) **nie pozwala** wstrzyknąć
`<?xml-stylesheet?>`. Żeby mieć styl, serwuj sitemap własnym route przez
`buildSitemapXml` (string XML z odwołaniem do XSL):
> **NIE używaj XSLT.** Przeglądarki (Chrome i in.) WYCOFUJĄ XSLT — arkusz
> `<?xml-stylesheet?>` pokazuje ostrzeżenie i wkrótce przestanie działać.
> Rozwiązanie: serwuj czysty XML z poprawnym Content-Type; przeglądarka
> renderuje swój natywny widok drzewa XML sama.
```ts
// app/sitemap.xml/route.ts (zamiast app/sitemap.ts)
@@ -907,24 +907,22 @@ export const dynamic = 'force-dynamic'
export async function GET() {
const entries = await sitemap()
const xml = buildSitemapXml(entries, { stylesheetUrl: '/sitemap.xsl' })
const xml = buildSitemapXml(entries)
return new Response(xml, {
headers: { 'Content-Type': 'application/xml; charset=utf-8' },
})
}
```
### Plik XSL w /public
Skopiuj `sitemap.xsl` (z pluginu: `node_modules/@intecion/ipal-kit/dist/modules/seo/assets/sitemap.xsl`)
do `public/sitemap.xsl` w projekcie. Zawiera responsywną tabelę (numer, URL,
data, języki) z dark mode. `stylesheetUrl: '/sitemap.xsl'` wskazuje na niego.
`buildSitemapXml` zwraca wcięty XML (czytelny w surowej postaci), a przeglądarka
dokłada widok drzewa. Zawiera hreflang jako `<xhtml:link>`. Crawlery czytają XML
normalnie.
### WAŻNE — jeden sitemap, nie dwa
Jeśli używasz route `app/sitemap.xml/route.ts` (styled), **USUŃ** `app/sitemap.ts`
(MetadataRoute). Dwa sitemapy pod różnymi ścieżkami mylą crawlery. Wybierz jeden:
- **styled** (`sitemap.xml/route.ts` + buildSitemapXml + XSL) — ładna tabela
- **prosty** (`sitemap.ts` + reeksport z lib/content) — bez stylu, mniej kodu
Jeśli używasz `app/sitemap.xml/route.ts`, USUŃ `app/sitemap.ts` (MetadataRoute).
Dwa sitemapy pod różnymi ścieżkami mylą crawlery. Wybierz jeden:
- **route.ts + buildSitemapXml** — czytelny XML w przeglądarce
- **sitemap.ts** (reeksport z lib/content) — mniej kodu, mniej czytelny w przeglądarce
Styl to kosmetyka (Google czyta oba tak samo) — rób, jeśli klient/audyt tego chce.
Oba tak samo dobre dla Google — to kwestia czytelności dla człowieka, nie SEO.