Añadir etiquetas hreflang en el <head> de cada página es manejable cuando tienes decenas de URLs. Pero si tienes un ecommerce con 10.000 productos en tres idiomas, o un portal de contenido con versiones para cinco países, mantener las etiquetas HTML actualizadas se convierte en una pesadilla de mantenimiento. El sitemap XML es la solución: centraliza toda la configuración hreflang en un único lugar, más fácil de generar automáticamente y de mantener.
¿Por qué el sitemap XML para hreflang?
- •Un solo archivo (o conjunto de archivos) concentra toda la configuración hreflang del sitio.
- •Se puede generar automáticamente desde la base de datos o el CMS sin tocar el HTML de cada página.
- •Google descubre las relaciones entre variantes de idioma sin tener que rastrear cada página individualmente.
- •Facilita las auditorías: puedes revisar toda la configuración hreflang del sitio en un único sitemap.
- •Es el método recomendado por Google para sitios con gran volumen de URLs.
Google acepta los tres métodos de implementación (HTML, HTTP header, sitemap XML) de forma equivalente. No hay ventaja de ranking entre ellos — la elección es puramente técnica y de mantenimiento.
Estructura correcta del sitemap XML con hreflang
El sitemap con hreflang usa el namespace xhtml de W3C para las etiquetas de alternativas. Cada URL del sitemap debe declarar todas sus variantes de idioma, incluida ella misma.
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<!-- Versión en español -->
<url>
<loc>https://ejemplo.com/es/producto/zapatillas/</loc>
<xhtml:link rel="alternate" hreflang="es"
href="https://ejemplo.com/es/producto/zapatillas/"/>
<xhtml:link rel="alternate" hreflang="en"
href="https://ejemplo.com/en/product/sneakers/"/>
<xhtml:link rel="alternate" hreflang="fr"
href="https://ejemplo.com/fr/produit/baskets/"/>
<xhtml:link rel="alternate" hreflang="x-default"
href="https://ejemplo.com/es/producto/zapatillas/"/>
</url>
<!-- Versión en inglés del mismo producto -->
<url>
<loc>https://ejemplo.com/en/product/sneakers/</loc>
<xhtml:link rel="alternate" hreflang="es"
href="https://ejemplo.com/es/producto/zapatillas/"/>
<xhtml:link rel="alternate" hreflang="en"
href="https://ejemplo.com/en/product/sneakers/"/>
<xhtml:link rel="alternate" hreflang="fr"
href="https://ejemplo.com/fr/produit/baskets/"/>
<xhtml:link rel="alternate" hreflang="x-default"
href="https://ejemplo.com/es/producto/zapatillas/"/>
</url>
<!-- Versión en francés del mismo producto -->
<url>
<loc>https://ejemplo.com/fr/produit/baskets/</loc>
<xhtml:link rel="alternate" hreflang="es"
href="https://ejemplo.com/es/producto/zapatillas/"/>
<xhtml:link rel="alternate" hreflang="en"
href="https://ejemplo.com/en/product/sneakers/"/>
<xhtml:link rel="alternate" hreflang="fr"
href="https://ejemplo.com/fr/produit/baskets/"/>
<xhtml:link rel="alternate" hreflang="x-default"
href="https://ejemplo.com/es/producto/zapatillas/"/>
</url>
</urlset>La bidireccionalidad es obligatoria también en el sitemap. Cada variante del cluster debe aparecer como entrada <url> en el sitemap e incluir xhtml:link hacia todas las demás variantes, incluida ella misma. Si solo declaras una dirección, Google puede ignorar las relaciones.
Errores específicos del hreflang en sitemap
Error 1: Olvidar declarar el namespace xhtml
Sin el atributo xmlns:xhtml en la etiqueta <urlset>, el validador XML rechazará el sitemap y Google no podrá procesar las etiquetas xhtml:link. Es el error más frecuente al construir el sitemap manualmente.
Error 2: Incluir solo las URLs de un idioma en el sitemap
Si tu sitemap solo lista las URLs en español y cada entrada incluye xhtml:link hacia las versiones en inglés y francés, Google tiene información parcial. Las versiones en inglés y francés deben aparecer también como entradas <url> con sus propios bloques de xhtml:link para confirmar la bidireccionalidad.
Error 3: Sitemap con hreflang y etiquetas HTML contradictorias
Si implementas hreflang en el sitemap Y en el HTML de las páginas, pero los valores no coinciden, Google recibe señales contradictorias. Elige un único método y aplícalo de forma consistente en todo el sitio.
Cómo organizar el sitemap para sitios muy grandes
Google limita los sitemaps a 50.000 URLs y 50 MB por archivo. Para sitios multilingüe grandes, esto se supera rápidamente. La solución es usar un sitemap índice que apunta a sitemaps secundarios organizados por idioma o sección.
<!-- sitemap-index.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>https://ejemplo.com/sitemap-es.xml</loc>
</sitemap>
<sitemap>
<loc>https://ejemplo.com/sitemap-en.xml</loc>
</sitemap>
<sitemap>
<loc>https://ejemplo.com/sitemap-fr.xml</loc>
</sitemap>
</sitemapindex>Cada sitemap secundario (sitemap-es.xml, sitemap-en.xml...) contiene las URLs de ese idioma con los xhtml:link hacia todas las variantes. Google procesa todos los sitemaps del índice y construye el mapa completo de relaciones hreflang.
Cómo generar el sitemap hreflang automáticamente
En WordPress con WPML
WPML genera automáticamente el sitemap con hreflang si activas la integración con el plugin de sitemap que uses (Yoast SEO, Rank Math o el sitemap nativo de WPML). No se requiere configuración adicional — WPML conoce las relaciones entre traducciones y las incluye en el sitemap.
En Next.js con next-sitemap
// next-sitemap.config.js
module.exports = {
siteUrl: 'https://ejemplo.com',
generateRobotsTxt: true,
alternateRefs: [
{ href: 'https://ejemplo.com/es', hreflang: 'es' },
{ href: 'https://ejemplo.com/en', hreflang: 'en' },
{ href: 'https://ejemplo.com/fr', hreflang: 'fr' },
],
}Verifica el hreflang del sitemap con el validador
Después de generar el sitemap, extrae una muestra de URLs de distintos idiomas e introdúcelas en el Validador Hreflang de iRankly. Confirma que la bidireccionalidad es correcta, que los códigos de idioma son válidos y que todas las URLs del cluster responden con 200 OK.
Prueba la herramienta gratis
Analiza tus URLs con Validador Hreflang de iRankly. Sin registro, sin tarjeta.
Si prefieres implementarlo en el HTML de cada página, o quieres el detalle conceptual: