nov
27
2013

Error WPML y WordPress SEO Plugin con idiomas RFC5646

Administro y gestiono una web multidioma con wordpress. Para ello utilizamos el WMPL, un plugin muy util para gestionar el contenido multidioma con wordpress. Además utilizamos el Worpress SEO Plugin de Yoast para gestionar el contenido SEO de la misma.

El plugin SEO que utilizamos también se encarga de generar los sitemap, y no se desde que versión es posible y transparente la integración entre el WPML y el Worpress SEO Plugin, de forma que el sitemap generado por el SEO Plugin genera un sitemap por cada uno de los idiomas gestionados por el WPML.

En principio todo es precioso, hasta que el cliente decidió “duplicar” la web con mercado objetivo Brasil. Añadimos el idioma en el WPML con su dominio correspondiente y cuando vamos a subir los sitemaps al Google Webmaster Tools nos damos cuenta de que los sitemaps para el nuevo sitio en Brasil no están funcionando y nos están sacando los sitemaps correspondientes al sitio italiano (que es el idioma base de la web).

Después de mucho trastear nos damos cuenta de que la “integración” entre el WMPL y el WordPress SEO Plugin consiste en un filtro desarrollado desde el WMPL que añade las condiciones necesarias a la query que busca el contenido en el WordPress SEO Plugin para que filtre por el idioma correspondiente al sitemap que se está cargando.

¿Y donde está el problema?

Pues que los sitemaps generados por el WordPress SEO Plugin tienen este formato:

  • post-en-sitemap.xml (sitemap para los posts en ingles)
  • post-it-sitemap.xml (sitemap para los posts en italiano)
  • page-en-sitemap.xml (sitemap para las paginas en ingles)
  • post-it-sitemap.xml (sitemap para los paginas en italiano)

Y el WPML utiliza un código para obtener el idioma del sitemap, y asi poder filtrar los resultados con el idioma correspondiente, que se basa en la suposicion de que el nombre del fichero siempre es: [TIPO_SITEMAP]-[IDOMA]-sitemap.xml. Para los ejemplos anteriores no hay problema:

  • post-en-sitemap.xml (=> Codigo en => ingles)
  • post-it-sitemap.xml (=> Codigo it => italiano)
  • page-en-sitemap.xml (=> Codigo en => ingles)
  • post-it-sitemap.xml (=> Codigo it => italiano)

Sin embargo, cuando llegamos a Brasil, la cosa cambia, ya que para brasil hemos utilizado el código pt-BR (Portugués de Brasil, para diferenciarlo del Portugués de Portugal). Y según esa suposicion:

  • post-pt-BR-sitemap.xml (=> Codigo pt => NO ENCONTRADO, ya que no tenemos la web en portugues)

Como no encuentra el idioma que supuestamente debería ser (pt) supone el idioma por defecto (it) y nos genera el sitemap para italiano en vez de para Brasil.

Solución

La solución que hemos aplicado es modificar el código del filtro de obtención del idioma a generar el sitemap e informaremos a los desarrolladores de WPML para que en proximas versiones del plugin tengan esto en cuenta ya que me temo que no solo afectará a idiomas en este formato si tambien a custom post types que en su slug tengan un guión (-).

Si teneis este problema la solución es modificar un archivo del plugin:

Fichero:/plugins/sitepress-multilingual-cms/inc/wpseo-sitemaps-filter.php

Sobre la linea 170, dentro de la función get_sitemap_language cambiaremos el código existente por:

/**** CHAINSDEV - HACK LANGUAGES WITH SUBDOMAIN */
$chainssitemap_language = "";
if(count($sitemap_language)>3){
     for($i=1;$i<count($sitemap_language)-1;$i++)
           if(empty($chainssitemap_language)) $chainssitemap_language=$sitemap_language[$i];
           else $chainssitemap_language.="-".$sitemap_language[$i];
     }
else $chainssitemap_language=$sitemap_language[1];

$sitemap_language=$chainssitemap_language;
/**** CHAINSDEV - HACK LANGUAGES WITH SUBDOMAIN */
/* CODIGO ORIGINAL
if(isset($sitemap_language[1])){
      $sitemap_language = $sitemap_language[1];
}
FIN CODIGO ORIGINAL */
/**** CHAINSDEV - HACK LANGUAGES WITH SUBDOMAIN */

Con esto lo parcheamos parcialmente.

Deja tu comentario

Publicidad