Capítulo 163 de 456
Divide um sitemap grande em vários sitemaps menores, cada um servido em /.../sitemap/[id].xml, contornando o limite de 50.000 URLs do Google por arquivo.
sitemap.ts que retorna um array de objetos { id }, um por sub-sitemap a gerar.id é passado à função sitemap default como Promise<string>, não mais valor síncrono./product/sitemap/[id].xml (ex. /product/sitemap/1.xml).// app/product/sitemap.ts
import type { MetadataRoute } from 'next'
import { BASE_URL } from '@/app/lib/constants'
export async function generateSitemaps() {
return [{ id: 0 }, { id: 1 }, { id: 2 }, { id: 3 }]
}
export default async function sitemap(props: {
id: Promise<string>
}): Promise<MetadataRoute.Sitemap> {
const id = await props.id
const start = id * 50000
const end = start + 50000
const products = await getProducts(
`SELECT id, date FROM products WHERE id BETWEEN ${start} AND ${end}`
)
return products.map((product) => ({
url: `${BASE_URL}/product/${product.id}`,
lastModified: product.date,
}))
}
id retornado vira um arquivo XML separado.| Version | Changes |
|---|---|
| v16.0.0 | id passado como Promise<string> para a função sitemap |
| v15.0.0 | URLs consistentes entre dev e produção |
| v13.3.2 | generateSitemaps introduzido |
generateSitemaps só retorna os IDs; a lógica de busca de dados fica na função sitemap default, filtrada pelo id.await o id antes de usá-lo.sitemap.ts onde generateSitemaps é exportado.