Si has montado una web multilenguaje con Weglot y luego revisas el mapa del sitio te llevas una sorpresa. Las URLs traducidas no están. Solo aparecen las del idioma original. Y eso, para alguien que viene de WPML o Polylang, choca bastante.
Lo que pasa es que Weglot maneja el SEO multilenguaje de una forma distinta a otros plugins de traducción, y los sitemaps son el ejemplo más claro de esa diferencia.
Antes de meterte a cambiar nada, conviene saber qué hace Weglot por defecto, qué no hace, y si de verdad necesitas tocar algo o no. Y si vas a tocarlo, hay que saber con qué plugin de SEO lo combinas, porque cada uno se comporta diferente.
Cómo gestiona Weglot el SEO multilenguaje en WordPress
Lo primero es entender la lógica, porque Weglot no guarda las traducciones en tu base de datos como hacen WPML, Polylang o TranslatePress, las guarda en sus propios servidores y las inyecta en el código fuente de cada página cuando alguien visita la versión traducida.
En lo que afecta al SEO, hace cuatro cosas:
- Crea una URL única para cada idioma con un subdirectorio del tipo
/es/,/fr/,/de/a partir del código de dos letras del idioma. - Añade automáticamente las etiquetas
hreflangen el<head>del HTML, declarando todas las versiones de cada página. - Traduce los meta tags (
title,meta description, atributosalt) en el código fuente, no por JavaScript, así que Google los ve perfectamente. - Marca las URLs traducidas con sus canonical correctos, apuntando a sí mismas.
Hasta aquí, todo bien, el problema viene con el mapa del sitio.
La realidad sobre los sitemaps multilenguaje de Weglot
Esto es lo que dice la documentación técnica oficial de Weglot, palabras textuales del centro de ayuda en su artículo sobre cómo editar el sitemap:
«Si quieres un sitemap multilenguaje igualmente, Weglot lo gestiona por ti. Sin embargo, esta funcionalidad solo está disponible bajo la integración por subdirectorios. Esta opción no está disponible para proyectos WordPress.»
O sea, que en WordPress, Weglot no genera un mapa del sitio multilenguaje propio ni añade las URLs traducidas a ningún sitemap existente. Su integración multilingüe de mapas del sitio existe, pero solo para webs con su proxy en subdirectorios, que es como funciona en otras plataformas, no la integración nativa de WordPress.
Llama la atención que el blog de marketing de Weglot diga lo contrario, hablando de que «genera sitemaps XML multilenguaje» como si fuera una característica más del plugin de WordPress. La documentación técnica desmiente esto, así que me lo explique, oiga.
La diferencia con WPML, Polylang y TranslatePress
La razón por la que Weglot tiene este problema y los demás no es importante para entenderlo antes de seguir.
WPML, Polylang y TranslatePress guardan las traducciones en la base de datos de tu WordPress como contenido real, y cada traducción es un post o un campo dentro del post, según el plugin. Eso significa que cualquier plugin de SEO que recorra los posts del sistema (que es como funcionan todos) las ve sin problema y las incluye en el mapa del sitio automáticamente.
Weglot guarda las traducciones en sus servidores remotos, y cuando un visitante pide la versión en francés Weglot intercepta la respuesta y traduce el HTML al vuelo. Las traducciones nunca tocan tu base de datos, por tanto, cuando Yoast o Rank Math generan el mapa del sitio recorriendo tus posts no encuentran las versiones traducidas porque, técnicamente, no existen como contenido propio.
Esto tiene una ventaja, que es la que te cuenta Weglot, y es que tu base de datos no engorda con las traducciones. Pero también un inconveniente, el que estamos viendo, que las herramientas de tu web, de WordPress, no saben que existen.
¿Necesitas un sitemap multilenguaje si ya tienes hreflang?
Aquí es donde Weglot tiene su argumento, y no es un locurón, tiene lógica, pues Google permite declarar las versiones de idioma de una página de tres formas, y con cualquiera basta:
- Etiquetas hreflang en el
<head>de cada página HTML. - Cabecera HTTP
hreflang. - Etiquetas
xhtml:linkdentro del sitemap XML.
Como Weglot ya inyecta los hreflang en el head, técnicamente con eso le vale a Google. Así que según eso tendrían razón en argumentar que el mapa del sitio multilenguaje es redundante, si tu objetivo es Google.
El problema es que no todo el mundo posiciona solo en Google, y aunque sea tu caso, hay matices que conviene tener en mente:
- Bing tira más de mapas del sitio que Google y le viene bien tener todas las URLs declaradas, traducidas incluidas.
- Baidu, si te interesa el mercado chino, prácticamente exige sitemap dedicado por idioma para indexar bien.
- Si algo tengo comprobado es que los bots de IA lo primero que miran y devoran es el mapa del sitio.
- En sitios grandes con muchas URLs, un mapa del sitio completo acelera el descubrimiento de páginas nuevas. Si dejas las traducciones fuera Google las encontrará por enlaces internos pero más lento.
- Search Console permite seguir métricas por mapa del sitio, así que tener uno por idioma facilita ver problemas de indexación específicos de un mercado. Esto se puede compensar dando de alta cada subcarpeta como propiedad, pero implica más trabajo.
Vamos, por no enrollarme más, que si solo te importa Google y la web no es enorme, los hreflang en el head te valen. Ahora bien, si vendes en mercados con buscadores diferentes, si la web es grande, si te importa el tráfico que te pueda llegar de IAs, o si quieres tener Search Console limpio por idioma, te conviene tener las URLs traducidas en el mapa del sitio.
Qué hace Weglot con cada plugin de SEO o de sitemaps XML
El comportamiento por defecto, sin tocar código, es siempre el mismo, el sitemap solo lleva URLs del idioma original. Pero hay diferencias importantes según el plugin que uses, sobre todo a la hora de poder añadir las traducidas, así que vamos uno a uno.
Sitemap nativo de WordPress (wp-sitemap.xml)
Desde WordPress 5.5 hay un mapa del sitio nativo por defecto en wp-sitemap.xml. Si no usas ningún plugin de SEO ni de sitemaps XML y dejas que WordPress lo genere solo Weglot no lo toca.
El mapa del sitio nativo te muestra esto:
<urlset>
<url>
<loc>https://midominio.com/articulo-ejemplo/</loc>
</url>
<url>
<loc>https://midominio.com/contacto/</loc>
</url>
</urlset>
Las versiones /fr/articulo-ejemplo/, /de/articulo-ejemplo/ y demás traducciones no aparecen y no hay forma sencilla de añadirlas sin código. Tendrías que pelearte con los filtros wp_sitemaps_posts_entry o wp_sitemaps_index_entry de WordPress, y Weglot no proporciona snippet oficial para esto.
Yoast SEO
Yoast desactiva el mapa del sitio nativo de WordPress y genera el suyo propio en /sitemap_index.xml. Por defecto, instalando Weglot encima, el sitemap de Yoast sigue mostrando solo las URLs del idioma original. Si no haces nada al respecto las traducidas no aparecen.
Existe un apaño validado por un usuario del propio plugin Weglot en el foro oficial, y es usando el filtro wpseo_sitemap_url. No es solución oficial de Weglot pero funciona. Te lo enseño más abajo.
Rank Math
Aquí es donde Weglot sí ha hecho los deberes. Tiene una página específica en developers.weglot.com con un código oficial usando el filtro rank_math/sitemap/index. La pega es que ese snippet obliga a listar a mano las URLs de los sub-mapas que quieres traducir y desactiva el caché del sitemap, lo que en webs grandes puede pesar en rendimiento.
All in One SEO (AIOSEO)
AIOSEO menciona compatibilidad con Weglot pero no hay tutorial específico ni código oficial. El comportamiento es el mismo que con Yoast, solo URLs del idioma original. La buena noticia es que tiene dos filtros bien documentados que sirven para añadir URLs traducidas:
aioseo_sitemap_additional_pagespermite añadir URLs personalizadas a un sub-sitemap dedicado enaddl-sitemap.xml. Para que funcione hay que activar la opción «Additional Pages» en los ajustes de AIOSEO.aioseo_sitemap_indexespermite añadir sub-mapas al índice general.
Hay que combinar uno de los dos con la API de Weglot para inyectar las traducciones. Enseguida lo vemos.
SEOPress
En octubre de 2025 Weglot y SEOPress anunciaron una colaboración comercial. A nivel de marketing está vendido como «la solución completa para SEO multilenguaje en WordPress»
Pero a nivel técnico, lo que SEOPress detecta automáticamente para sitemaps multilenguaje es WPML, Polylang, TranslatePress y Weglot, pero solo a efectos de NO duplicar URLs entre idiomas, no para incluir las traducidas que Weglot guarda en sus servidores.
El mapa del sitio de SEOPress (sitemaps.xml) sigue sin ver las URLs traducidas de Weglot.
SEOPress tiene varios filtros oficiales que se pueden aprovechar, sobre todo:
seopress_sitemaps_single_urlque filtra cada URL del sitemap de un post type concreto (existe desde SEOPress 5.3).seopress_sitemaps_urlsetque filtra el bloque urlset entero antes de imprimirse.
El primero es el equivalente al wpseo_sitemap_url de Yoast, así que la lógica del código del foro de Weglot se puede adaptar a SEOPress sin demasiado problema. De nuevo, lo vemos en un momentito.
Google XML Sitemaps
Este es uno de los plugins de maps del sitio más veteranos y aún muy instalado. Por defecto genera su sitemap en /sitemap.xml sin tocar el de WordPress, y como el resto, no ve las URLs traducidas de Weglot.
La buena noticia es que tiene una API oficial documentada para que otros plugins añadan URLs al sitemap. Se basa en el hook sm_buildmap y el método AddUrl de la clase GoogleSitemapGenerator. Esto es lo más limpio que vas a encontrar en cuanto a integración.
Además tiene una opción de «Páginas adicionales» para añadir URLs sueltas a mano, que puede ser inabarcable cuando tienes que meter cientos de URLs traducidas, pero tenerlo lo tienes.
XML Sitemap & Google News
Otro plugin muy popular, sobre todo entre quien quiere control fino del mapa del sitio sin la mochila de un plugin SEO completo. El plugin de RavanH tiene la peculiaridad de ser uno de los más completos para añadir URLs personalizadas sin código.
Desde la versión 5.4 incluye una opción nativa en sus ajustes para «URLs personalizadas en el mapa del sitio» (añadir URLs sueltas a mano) y otra para «mapas del sitio externos». Esto último es útil si Weglot generase un sitemap externo para WordPress, pero ya hemos visto que no lo hace, así que esa segunda opción no nos sirve directamente para Weglot.
El plugin tiene un filtro pensado exactamente para este uso, xmlsf_custom_urls, que filtra el array de URLs personalizadas antes de que el mapa del sitio las procese. Es la forma limpia de añadir URLs traducidas sin tocar la opción almacenada en la base de datos. Lo veremos abajo, porque tiene un par de detalles importantes.
Soluciones con código para añadir las URLs traducidas
Aquí tienes todos los snippets ordenados por plugin. Pruébalos en staging antes de meterlos en producción, sobre todo los que no son oficiales de Weglot. Donde el snippet venga de fuente oficial te lo indico claramente.
Para Yoast SEO
Este viene del foro oficial del plugin Weglot en WordPress.org, escrito por un usuario y bendecido por un desarrollador del plugin. Funciona en versiones recientes de Yoast y Weglot pero no es código oficial de Weglot, tenlo en cuenta.
Usa el filtro wpseo_sitemap_url de Yoast para inyectar las URLs traducidas dentro del sitemap original, en lugar de duplicar sitemaps. Es el enfoque correcto según las directrices de Google:
add_filter( 'wpseo_sitemap_url', 'weglot_sitemap', 10, 2 );
function weglot_sitemap( $output, $url ) {
$date = null;
if ( ! empty( $url['mod'] ) ) {
$date = date( 'c', strtotime( $url['mod'] ) );
}
$languages = weglot_get_destination_languages();
$language_services = weglot_get_service( 'Language_Service_Weglot' );
$request_url_services = weglot_get_service( 'Request_Url_Service_Weglot' );
foreach ( $languages as $language ) {
$wg_url = $request_url_services->create_url_object( $url['loc'] );
$lang = $language_services->get_language_from_internal( $language['language_to'] );
$output .= "\t<url>\n";
$output .= "\t\t<loc>" . $wg_url->getForLanguage( $lang ) . "</loc>\n";
$output .= empty( $date ) ? '' : "\t\t<lastmod>" . htmlspecialchars( $date ) . "</lastmod>\n";
$images = '';
if ( isset( $url['images'] ) && is_array( $url['images'] ) ) {
foreach ( $url['images'] as $image ) {
$images .= "<image:image><image:loc>{$image['src']}</image:loc></image:image>\n";
}
$output .= $images;
}
$output .= "\t</url>\n";
}
return $output;
}
Cómo queda el sitemap después de aplicar este snippet:
<urlset>
<url>
<loc>https://midominio.com/articulo-ejemplo/</loc>
<lastmod>2026-04-15T10:30:00+00:00</lastmod>
</url>
<url>
<loc>https://midominio.com/fr/articulo-ejemplo/</loc>
<lastmod>2026-04-15T10:30:00+00:00</lastmod>
</url>
<url>
<loc>https://midominio.com/de/articulo-ejemplo/</loc>
<lastmod>2026-04-15T10:30:00+00:00</lastmod>
</url>
</urlset>
Cada URL original aparece seguida de sus versiones traducidas, todo dentro del mismo sitemap. Si quieres excluir alguna URL de la traducción, el desarrollador de Weglot recomienda cambiar getForLanguage( $lang ) por getForLanguage( $lang, true ).
Para Rank Math
Sacado de la documentación para desarrolladores de Weglot. Dos códigos, uno para desactivar el caché del sitemap (necesario para que se actualice con tus cambios) y otro para añadir las URLs traducidas al índice del sitemap.
El primero, para desactivar el caché:
/** * Filter if XML sitemap transient cache is enabled. * * @param boolean $unsigned Enable cache or not, defaults to true */ add_filter( 'rank_math/sitemap/enable_caching', '__return_false' );
El segundo, para añadir las URLs traducidas. Tienes que editar el array $urls con las URLs reales de tus sub-sitemaps:
add_filter( 'rank_math/sitemap/index', function( $xml ) {
// Fetch Weglot services
$language_services = weglot_get_service( 'Language_Service_Weglot' );
$request_url_services = weglot_get_service( 'Request_Url_Service_Weglot' );
// List of URLs to be translated
$urls = [
"https://midominio.com/post-sitemap.xml",
"https://midominio.com/page-sitemap.xml",
"https://midominio.com/category-sitemap.xml",
];
$destination_languages = weglot_get_destination_languages();
foreach ( $urls as $url ) {
$wg_url = $request_url_services->create_url_object( $url );
// Iterate over each destination language
foreach ( $destination_languages as $language_code ) {
$language = $language_services->get_language_from_internal( $language_code['language_to'] );
$translated_url = $wg_url->getForLanguage( $language );
$xml .= '
<sitemap>
<loc>' . esc_url( $translated_url ) . '</loc>
<lastmod>' . esc_html( date( 'c' ) ) . '</lastmod>
</sitemap>';
}
}
return $xml;
}, 999 );
Cómo queda el índice de sitemaps de Rank Math después:
<sitemapindex>
<sitemap>
<loc>https://midominio.com/post-sitemap.xml</loc>
<lastmod>2026-04-15T10:30:00+00:00</lastmod>
</sitemap>
<sitemap>
<loc>https://midominio.com/page-sitemap.xml</loc>
<lastmod>2026-04-15T10:30:00+00:00</lastmod>
</sitemap>
<sitemap>
<loc>https://midominio.com/fr/post-sitemap.xml</loc>
<lastmod>2026-04-15T10:30:00+00:00</lastmod>
</sitemap>
<sitemap>
<loc>https://midominio.com/fr/page-sitemap.xml</loc>
<lastmod>2026-04-15T10:30:00+00:00</lastmod>
</sitemap>
<sitemap>
<loc>https://midominio.com/de/post-sitemap.xml</loc>
<lastmod>2026-04-15T10:30:00+00:00</lastmod>
</sitemap>
</sitemapindex>
Limitación importante: hay que listar las URLs a mano. Si añades un nuevo tipo de contenido o Rank Math empieza a generar otro sub-sitemap, tendrás que actualizar el array. No es automático del todo.
Para SEOPress
Este código no viene de Weglot ni de SEOPress, lo he montado yo mismo adaptando la lógica del código de Yoast al filtro seopress_sitemaps_single_url de SEOPress, que está documentado oficialmente. Pruébalo bien antes de pasarlo a producción:
add_filter( 'seopress_sitemaps_single_url', 'ayudawp_seopress_weglot_sitemap', 10, 2 );
function ayudawp_seopress_weglot_sitemap( $url_xml, $url_data ) {
if ( ! function_exists( 'weglot_get_destination_languages' ) ) {
return $url_xml;
}
$original_url = isset( $url_data['loc'] ) ? $url_data['loc'] : '';
$lastmod = isset( $url_data['lastmod'] ) ? $url_data['lastmod'] : '';
if ( empty( $original_url ) ) {
return $url_xml;
}
$languages = weglot_get_destination_languages();
$language_services = weglot_get_service( 'Language_Service_Weglot' );
$request_url_services = weglot_get_service( 'Request_Url_Service_Weglot' );
foreach ( $languages as $language ) {
$wg_url = $request_url_services->create_url_object( $original_url );
$lang = $language_services->get_language_from_internal( $language['language_to'] );
$translated_url = $wg_url->getForLanguage( $lang );
$url_xml .= "<url>\n";
$url_xml .= "\t<loc>" . esc_url( $translated_url ) . "</loc>\n";
if ( ! empty( $lastmod ) ) {
$url_xml .= "\t<lastmod>" . esc_html( $lastmod ) . "</lastmod>\n";
}
$url_xml .= "</url>\n";
}
return $url_xml;
}
El resultado es equivalente al de Yoast, las URLs traducidas se inyectan dentro del mismo sitemap, justo después de cada URL original. Si SEOPress te genera por ejemplo post-sitemap.xml, este filtro afecta a todas sus entradas.
Para AIOSEO
AIOSEO permite dos caminos, pero te dejo el más limpio, que usa el filtro aioseo_sitemap_additional_pages para crear un sub-mapa específico para las traducciones.
Primero, requisito imprescindible: ve a AIOSEO > Mapas del sitio > Páginas adicionales y activa la funcionalidad. Sin ese paso el filtro no se ejecuta, te pasa una página vacía con error si no lo activas.
Después añades este código usando tu método favorito:
add_filter( 'aioseo_sitemap_additional_pages', 'ayudawp_aioseo_weglot_additional_pages' );
function ayudawp_aioseo_weglot_additional_pages( $pages ) {
if ( ! function_exists( 'weglot_get_destination_languages' ) ) {
return $pages;
}
// URLs base que quieres traducir. Adáptalo a tus sub-sitemaps.
$base_urls = array(
home_url( '/' ),
// Añade aquí las URLs que quieras incluir
);
$languages = weglot_get_destination_languages();
$language_services = weglot_get_service( 'Language_Service_Weglot' );
$request_url_services = weglot_get_service( 'Request_Url_Service_Weglot' );
foreach ( $base_urls as $base_url ) {
$wg_url = $request_url_services->create_url_object( $base_url );
foreach ( $languages as $language ) {
$lang = $language_services->get_language_from_internal( $language['language_to'] );
$translated_url = $wg_url->getForLanguage( $lang );
$pages[] = (object) array(
'loc' => $translated_url,
'lastmod' => gmdate( 'c' ),
'changefreq' => 'weekly',
'priority' => 0.8,
);
}
}
return $pages;
}
Cómo queda el índice de AIOSEO:
<sitemapindex>
<sitemap>
<loc>https://midominio.com/post-sitemap.xml</loc>
</sitemap>
<sitemap>
<loc>https://midominio.com/page-sitemap.xml</loc>
</sitemap>
<sitemap>
<loc>https://midominio.com/addl-sitemap.xml</loc>
</sitemap>
</sitemapindex>
Y dentro de addl-sitemap.xml aparecen las URLs traducidas que has añadido con el filtro. La pega es que es un sub-mapa aparte, no se mezclan con las originales como en Yoast o SEOPress, pero a ojos de Google es perfectamente válido.
Para Google XML Sitemaps
El plugin tiene una API oficial documentada en el archivo de documentación que se incluye con el plugin, basada en el hook sm_buildmap.
Esta es la forma correcta de añadir URLs externas:
add_action( 'sm_buildmap', 'ayudawp_google_xml_sitemaps_weglot' );
function ayudawp_google_xml_sitemaps_weglot() {
if ( ! class_exists( 'GoogleSitemapGenerator' ) ) {
return;
}
if ( ! function_exists( 'weglot_get_destination_languages' ) ) {
return;
}
$generator = GoogleSitemapGenerator::GetInstance();
if ( $generator === null ) {
return;
}
// URLs originales que quieres traducir
$original_urls = array(
home_url( '/' ),
// Añade aquí las URLs que quieras incluir
);
$languages = weglot_get_destination_languages();
$language_services = weglot_get_service( 'Language_Service_Weglot' );
$request_url_services = weglot_get_service( 'Request_Url_Service_Weglot' );
foreach ( $original_urls as $original_url ) {
$wg_url = $request_url_services->create_url_object( $original_url );
foreach ( $languages as $language ) {
$lang = $language_services->get_language_from_internal( $language['language_to'] );
$translated_url = $wg_url->getForLanguage( $lang );
// Parámetros: URL, lastmod (timestamp), changefreq, priority
$generator->AddUrl( $translated_url, time(), 'weekly', 0.8 );
}
}
}
Cómo queda el sitemap, todo en un único archivo sitemap.xml mezclando originales y traducidas:
<urlset>
<url>
<loc>https://midominio.com/</loc>
<changefreq>daily</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://midominio.com/articulo-ejemplo/</loc>
<changefreq>weekly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://midominio.com/fr/</loc>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://midominio.com/de/</loc>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
</urlset>
Tiene una limitación parecida a la de Rank Math, y es que hay que listar las URLs originales que quieres traducir. Si tienes pocas URLs base de las que cuelga todo, esto te vale, si tienes cientos de entradas y quieres todos traducidos, vas a tener que iterar dinámicamente sobre tus posts publicados, cosa que requiere más código.
XML Sitemap & Google News
El plugin tiene un filtro específico para esto, xmlsf_custom_urls, que es la forma documentada de inyectar URLs personalizadas sin tocar la base de datos. He revisado el código actual del plugin (versión 5.7.4) y este es el filtro correcto.
Hay dos peculiaridades que conviene saber antes:
- El plugin tiene dos modos de servidor de sitemap:
- «WordPress core» (delega en el sitemap nativo de WP) y «Plugin» (genera el sitemap propio). Se elige en
Ajustes > XML Sitemap. - El filtro
xmlsf_custom_urlsfunciona en ambos, pero con un matiz que veremos.
- «WordPress core» (delega en el sitemap nativo de WP) y «Plugin» (genera el sitemap propio). Se elige en
- El formato del
arrayque espera el plugin no son claves asociativas tipo Yoast/AIOSEO. Cada entrada es unarrayindexado donde el primer elemento es la URL:array( $url )oarray( $url, $priority ). El plugin lee$data[0]directamente.
Aquí va el snippet:
add_filter( 'xmlsf_custom_urls', 'ayudawp_xmlsf_weglot_custom_urls' );
function ayudawp_xmlsf_weglot_custom_urls( $custom_urls ) {
if ( ! function_exists( 'weglot_get_destination_languages' ) ) {
return $custom_urls;
}
if ( ! is_array( $custom_urls ) ) {
$custom_urls = array();
}
// URLs originales que quieres traducir
$original_urls = array(
home_url( '/' ),
// Añadir aquí más URLs base
);
$languages = weglot_get_destination_languages();
$language_services = weglot_get_service( 'Language_Service_Weglot' );
$request_url_services = weglot_get_service( 'Request_Url_Service_Weglot' );
foreach ( $original_urls as $original_url ) {
$wg_url = $request_url_services->create_url_object( $original_url );
foreach ( $languages as $language ) {
$lang = $language_services->get_language_from_internal( $language['language_to'] );
$translated_url = $wg_url->getForLanguage( $lang );
// Formato: array indexado, no asociativo. El plugin lee $data[0].
$custom_urls[] = array( $translated_url );
}
}
return $custom_urls;
}
Ahora viene el matiz importante, porque en modo «Plugin» del servidor de mapa del sitio este filtro se ejecuta directamente. Pero en modo «WordPress core» el provider de URLs personalizadas solo se registra si la opción xmlsf_urls ya tiene algún valor guardado en la base de datos. Es una comprobación que hace el plugin internamente:
// Línea 193 de inc/class-sitemap-core.php (versión 5.7.4)
if ( get_option( 'xmlsf_urls' ) ) {
wp_register_sitemap_provider( 'custom', new Sitemaps_Provider_Custom() );
}
Dicho de otro modo, si nunca has añadido una URL manualmente desde el admin del plugin, en modo WordPress core el snippet de arriba no se va a ejecutar nunca, porque el provider ni siquiera está registrado.
Hay dos formas de solucionarlo:
- Manual: ve a
Ajustes > XML Sitemap, sección de URLs pesonalizadas, y añade cualquier URL comoplaceholder(la página de inicio, por ejemplo). Con eso la opción ya tiene valor en la base de datos, elproviderse registra y tu filtro empieza a funcionar. - Automática: añade también un filtro a
option_xmlsf_urlsque devuelva unarrayno vacío cuando la opción esté vacía, así forzamos el registro. Hay que tener cuidado con la pantalla de admin para que no se contamine con URLs falsas.
La forma manual es perfectamente razonable, porque con una sola URL real añadida una vez resuelves el problema sin código adicional.
Cómo queda el índice del sitemap después de aplicar el código:
<sitemapindex>
<sitemap>
<loc>https://midominio.com/wp-sitemap-posts-post-1.xml</loc>
</sitemap>
<sitemap>
<loc>https://midominio.com/wp-sitemap-posts-page-1.xml</loc>
</sitemap>
<sitemap>
<loc>https://midominio.com/wp-sitemap-custom-1.xml</loc>
</sitemap>
</sitemapindex>
Las URLs traducidas aparecen dentro del sub-mapa wp-sitemap-custom-1.xml (en modo WordPress core) o sitemap-custom.xml (en modo Plugin). Si prefieres que las traducidas se mezclen con las originales en su sub-mapa correspondiente no es viable con este plugin sin reescribir bastante de la lógica de generación.
Cuándo merece la pena este jaleo y cuándo no
Después de probarlo en varios sitios a las conclusiones que llego, por si te ahorra algún dolor de cabeza, son estas:
- Si tu web es pequeña, posicionas solo en Google y los
hreflangestán bien puestos, mejor no tocar nada. Weglot tiene razón en que es redundante. - Si tu web es grande, con cientos o miles de URLs traducidas, mete el código que se ajuste a tu instalación. La indexación de las versiones nuevas será más rápida y tendrás Search Console más limpio.
- Si te interesa Bing, cualquier buscador que no sea Google o posicionar en IAs, mete el código sin pensarlo. Estos bots leen menos los
hreflangy más los mapas del sitio. - Si vas a dar de alta cada subcarpeta como propiedad separada en Search Console (que es buena práctica para multilenguaje), mete el código también, porque cada propiedad querrá su mapa del sitio específico.
Antes de pelearte con código, dale unas semanas a Search Console y mira si las URLs traducidas se están indexando bien por sí solas. Si lo están haciendo gracias a los hreflang y los enlaces internos del cambiador de idioma, no necesitas hacer nada.
Si ves que Google ignora los idiomas secundarios o que tarda mucho en encontrarlos, ahí es donde el mapa del sitio traducido empieza a justificarse por sí solo.
¿Que no te llega, que usas plugins SEO distintos a los seis que he cubierto aquí?, abre un ticket directamente al soporte de Weglot pidiendo el código adaptado, hasta donde he comprobado, suelen responder bastante bien. Y, por supuesto, aquí me tienes, pregunta lo que quieras abajo en los comentarios, como siempre.
¿Te gustó este artículo? ¡Ni te imaginas lo que te estás perdiendo en YouTube!






