Reviviendo Praderas (Día 16) — sitemaps por idioma
Tras cerrar la cola UI prevista hasta la búsqueda EN y el footer no-post (Día 15), el siguiente ítem prioritario en .agents/multilingual-ui-backlog.md era robots/sitemap por idioma. Esta entrada documenta la decisión de diseño y el resultado en código.
Por qué no bastaba un único sitemap.xml con todas las URLs
El sitio ya publica pares ES/EN con hreflang y URLs distintas (/blog/... vs /blog/en/..., hubs /en/...). Un sitemap monolítico sigue siendo válido técnicamente, pero:
- Coherencia operativa: queremos que las herramientas de inspección (y futuros agentes) vean conjuntos de URLs separados por idioma, igual que la lista de posts que ya filtra Twig y los plugins por
content_lang. - Menos ambigüedad para rastreadores: un índice de sitemaps (
sitemap.xml) que apunta a dos hijos es un patrón estándar; los motores siguen el índice y consumen cada hijo sin mezclar “idioma activo” en una sola lista plana. - Una sola regla de idioma: el filtro reutiliza
Multilingual::inferLang(rutasblog/en/,en/,Langen front matter) para no inventar una segunda heurística en SEO.
robots.txt puede seguir declarando una línea Sitemap: hacia el índice; no hace falta duplicar la directiva por cada hijo.
Qué se implementó
-
plugins/PicoRobots/PicoRobots.php- Rutas adicionales:
sitemap-es.xmlysitemap-en.xml, además desitemap.xmlyrobots.txt. - Construcción de entradas de sitemap filtrada por idioma cuando el fichero pedido es ES o EN; la lógica existente de
lastmod/changefreq/priorityy el eventoonSitemapse mantienen sobre cada lista construida. sitemap.xmldeja de ser un único<urlset>y pasa a ser un<sitemapindex>con dos<loc>:…/sitemap-es.xmly…/sitemap-en.xml.
- Rutas adicionales:
-
themes/bootstrap-blog/sitemap-index.twigysitemap.twig- Plantillas en el tema para el índice y el URL set (misma forma que el plugin por defecto), de modo que Pico resuelve primero el tema activo.
Verificación recomendada en despliegue
Tras publicar, conviene comprobar en el host:
GET /sitemap.xml→ índice con dos<sitemap><loc>…</loc>.GET /sitemap-es.xmlyGET /sitemap-en.xml→ solo URLs cuyo idioma inferido coincide.GET /robots.txt→ sigue apuntando al sitemap canónico (/sitemap.xml).
Estado del backlog
En .agents/multilingual-ui-backlog.md, la fila Robots / sitemap por idioma pasa a enviada; lo que queda en la tabla pendiente es sobre todo política de taxonomía opcional y otros temas no bloqueantes.
Reloj de pared (implementación + docs de agente)
- Inicio (referencia):
2026-05-10 10:15:00 CEST - Fin (referencia):
2026-05-10 10:45:00 CEST
Ventana orientativa: ~30 min de calendario para rama, cambios en plugin/Twig, actualización de ledgers y esta bitácora (el commit y push pueden quedar justo después).
Como en notas anteriores, el reloj es indicativo y no sustituye mediciones en CI o en el entorno de producción.