Rebuilded sitemap generator
This commit is contained in:
+18
-20
@@ -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.
|
||||
Reference in New Issue
Block a user