added auto generating for sitemap.

This commit is contained in:
2026-07-31 23:12:43 +02:00
parent 24a1fe0d60
commit f6b4b36df8
10 changed files with 428 additions and 12 deletions
+14
View File
@@ -453,6 +453,20 @@ rm -f *.db *.db-shm *.db-wal && pnpm generate:types && pnpm dev
Adres wpisów = slug strony-archiwum. Zmiana tytułu strony przenosi sekcję. Kolejny
typ treści (realizacje) = kolejna kolekcja + kolejna pozycja w content.config.
### Sitemapa i robots.txt
`createContentHelpers` oddaje gotowe handlery — dodaj `i18n` i `baseUrl` do jego
argumentów (patrz seo.md), potem dwa pliki po jednej linii:
```ts
// app/sitemap.ts
export { sitemap as default } from '@/lib/content'
// app/robots.ts
export { robots as default } from '@/lib/content'
```
Sitemapa z hreflangiem per URL, lastmod, wpisami bloga; pomija drafty i noindex.
### Analytics
**Site Integrations** → GA4 Measurement ID albo GTM Container ID. Tagi ładują
+52 -1
View File
@@ -196,4 +196,55 @@ const slugs = await slugsAcrossLocales({ payload, collection: 'pages', id, confi
`slugsAcrossLocales` robi osobne zapytanie z `locale: 'all'` — bo ten tryb
zamienia KAŻDE zlokalizowane pole w mapę, co jest dobre dla sluga i złe dla
reszty (mapa w title rozłożyłaby składanie tytułu). Dlatego czyta tylko slug,
depth 0.
depth 0.
## Sitemapa i robots.txt
Plugin składa sitemapę z hreflangiem per URL — te same buildery co metadane, więc
nie rozjedzie się z tym, co strony serwują. Handlery są gotowe w
`createContentHelpers`; klient re-eksportuje je jedną linią.
```ts
// src/lib/content.ts
export const { /* ... */, sitemap, robots } = createContentHelpers({
config,
content: contentConfig,
i18n: i18nConfig, // wymagane dla sitemap (hreflang)
baseUrl: process.env.NEXT_PUBLIC_SERVER_URL,
})
```
```ts
// app/sitemap.ts
export { sitemap as default } from '@/lib/content'
// app/robots.ts
export { robots as default } from '@/lib/content'
```
Next generuje z tego `/sitemap.xml` i `/robots.txt`. Nie da się tego schować
całkiem w pluginie — Next tworzy te trasy wyłącznie z plików w `app/`, skanuje
katalog projektu, nie node_modules. Ale re-eksport to maksimum redukcji: cała
logika jest w pluginie.
Co zawiera sitemapa:
- każdą stronę i wpis bloga, URL w domyślnym locale
- `alternates.languages` → Next renderuje `<xhtml:link rel="alternate" hreflang>`
per URL (to czyta Google przy wielu językach; zwykła sitemapa tego nie ma)
- `lastModified` z realnego `updatedAt` dokumentu
- wpisy bloga z prefiksem archiwum (`/pl/artykuly/moj-post`)
Pomija: drafty (`_status !== 'published'`) i dokumenty z `meta.noindex`.
Niskopoziomowo (własna trasa zamiast handlera z fabryki):
```ts
import { buildSitemapEntries, buildRobots } from 'ipal-kit'
const entries = await buildSitemapEntries({
payload, config: i18nConfig, baseUrl, content: contentConfig,
})
```
Przy dziesiątkach tysięcy URL-i Next ma `generateSitemaps` do dzielenia na
części — dodasz, gdyby realnie było ich tyle. Jedna sitemapa wystarcza do ~50k.