Caravanning in Morocco

Hace pocas semanas finalizamos el nuevo sitio web de Caravanning in Morocco en español. Posteriormente nos remitieron la traducción al francés y esta misma semana al inglés. Obviamente para realizar ambas traducciones utilizamos WPML (The WP Multilingual Plugin), dado que es el mejor plugin del mercado para realizar este tipo de trabajos.

Sitio web de Caravanning in MoroccoYa hace unos días os hablamos indirectamente de este proyecto en la entrada Añadiendo compatibilidad con WPML a un tema, ya que el problema descrito en ella lo detectamos y lo tuvimos que resolver justamente para el sitio web de Caravanning in Morocco.

Pues bien, tras las traduccione al francés y al inglés, y tras resolver los problemas de compatibilidad encontrados en el tema, nos encontramos con otro problema provocado en este caso por el propio WPML.

Aunque hemos remitido a WPML el problema detectado, y a la espera de que nos llegue una solución por su parte, en APG nos hemos puesto manos a la obra y hemos resuelto definitivamente el problema a nuestro cliente.

Problema

En Caravanning in Morocco utilizamos un dominio distinto para cada idioma, de forma que http://www.caravanninginmorocco.com/ apunta al idioma español, el nombre de dominio http://motorhomerentalinmorocco.com/ apunta al idioma inglés y el nombre de dominio http://locationdescampingcarsaumaroc.com/ apunta al idioma francés. Hasta ahí todo correcto y fácil de realizar bajo WPML.

El problema con que nos encontramos radica en los enlaces del menú de idiomas que genera WPML. Lo detectamos cuando al ir a cualquiera de los dos idiomas distintos al español, tanto en el inglés como en el francés, nos encontramos con que el nombre de dominio al que apunta el idioma español es el mismo que el nombre de dominio del idioma actual, es decir, que cuando estábamos en la página de inicio del sitio web en inglés nos encontrábamos con tres enlaces:

  1. Inglés: http://www.motorhomerentalinmorocco.com/#.
  2. Español: http://www.motorhomerentalinmorocco.com/.
  3. Francés: http://www.locationdescampingcarsaumaroc.com/.

Y en el caso de encontrarnos en la misma página de inicio, pero esta vez del sitio web en francés, nos encontrábamos con estos tres enlaces:

  1. Francés: http://www.locationdescampingcarsaumaroc.com/#.
  2. Español: http://www.locationdescampingcarsaumaroc.com/.
  3. Inglés: http://www.motorhomerentalinmorocco.com/.

Pero nunca aparecía el dominio al que tenía que apuntar el idioma español, esto es http://www.caravanninginmorocco.com/.

Lo mismo ocurría en el resto de páginas que componían el sitio web, aunque aquí el error era aún más raro, ya que si te encontrabas en la página de Tarifas y contacto en inglés, por ejemplo, te encontrabas con estos tres enlaces:

  1. Inglés: http://www.motorhomerentalinmorocco.com/tariffs-rates-contact
  2. Español: http://www.motorhomerentalinmorocco.com/tarifas-y-contacto
  3. Francés: http://www.locationdescampingcarsaumaroc.com/tarifs-et-contact

De forma que el enlace en español en las páginas web internas siempre tenía el nombre de dominio del idioma en curso, pero con el slug en español.

Un caso realmente curioso y del que no tenemos la más mínima idea del porqué se ha generado este error.

Solución

Dado que si usamos el menú de idiomas que genera WPML nos encontramos con el error descrito anteriormente, y si utilizamos el código contenido en ¿Cómo añadir un menú selector de idiomas multiplugin? nos encontramos con exactamente el mismo problema, lo que hemos hecho finalmente es personalizar ligeramente el código PHP publicado en esa entrada para que nos solucionase al 100% el problema detectado.

Concretamente la función PHP que hemos añadido al archivo functions.php del tema hijo de Caravanning in Morocco ha sido este:

/**
 * Añade el menú de WPML
 */
function apg_wpml_hack ( $enlaces, $argumentos ) {
	if ( function_exists( 'icl_get_languages' ) ) {
		global $sitepress;
		
		$idiomas = icl_get_languages( http_build_query( array( 'skip_missing' => 0, 'orderby' => 'custom' ) ) );
		foreach ( $idiomas as $idioma ) {
			$enlace = $idioma['url'];
			if ( $idioma['language_code']  == "es" ) {
				$dominios = array( "http://www.locationdescampingcarsaumaroc.com", "http://www.motorhomerentalinmorocco.com" );
				$enlace = str_replace( $dominios, "http://www.caravanninginmorocco.com", $enlace );
			}
			$enlaces .=  '<li class="menu-item menu-item-type-post_type menu-item-object-page bandera"><a href="' . $enlace . '" title="' . $idioma['translated_name'] . '" hreflang = "' . $idioma['language_code'] . '"><img src="' . $idioma['country_flag_url'] . '" alt="' . $idioma['translated_name'] . '" /></a></li>';
		}
    }

    return $enlaces;
}
add_filter( 'wp_nav_menu_items', 'apg_wpml_hack', 10, 2 );

Gracias a esta pequeña función lo que hacemos el reemplazar los nombres de dominio erróneos por el nombre de dominio al que queremos que apunte el idioma español.

Como podéis comprobar en el sitio web de Caravanning in Morocco, ahora todos los enlaces funcionan correctamente y no hay ningún tipo de error en ninguno de ellos.

Estamos seguros de que este error no es un caso aislado y que es más que probable que se haya dado en otras instalaciones, por eso lo compartimos para que os sirva de solución para vuestros sitios web.

Esperamos que os resulte útil y que nunca más tengamos que tirar de este tipo de apaños, lo que será señal de que WPML ha dado fin a este tipo de errores.