Como bien sabéis, o deberías de saber ya, WPML (The WP Multilingual Plugin) es un plugin para WordPress que nos permite transformar nuestra instalación de WordPress o WooCommerce en multilingüe.

Normalmente nos gusta elegir temas que sean totalmente compatibles con WPML para emprender nuevos proyectos, pero en ocasiones nos encontramos con que el tema que el cliente tiene instalado o ha elegido para realizar el proyecto no es compatible con WPML y no está dispuesto a utilizar otro distinto a la hora de afrontar la transformación del sitio web en multilingüe.

Caso concreto

Concretamente esto es lo que nos ha pasado a la hora de traducir un sitio web construido sobre Interface Pro, de Theme Horse.

Este tema no es compatible con WPML, tal y como ellos mismos nos lo indicaron, pero eso no quiere decir que no se pueda hacer totalmente compatible con WPML.

En el caso concreto de este tema hay tres textos que se añaden en las opciones del tema que nos interesaba poder traducir. Dos de ellos aparecen en la página de inicio y el otro en el pie del sitio web.

En el caso de la página de inicio se trata de dos títulos, que en la plantilla se llaman internamente home_slogan1 y home_slogan2, y que muestran el título y el subtítulo del sitio web que queríamos traducir.

En el caso del pie del sitio web, llamado footer_code en el código fuente de la plantilla, se muestra el texto del copyright del sitio web utilizando algunos shortcodes propuestos por los propios desarrolladores.

Añadiendo la compatibilidad

Una vez analizado el código fuente del tema y detectadas las necesidades, nos pusimos manos a la obra.

Para añadir la compatibilidad con WPML que necesitábamos sólo tuvimos que añadir cuatro funciones de código PHP en el archivo functions.php del tema hijo que creamos para afrontar el proyecto. Concretamente añadimos este código PHP:

/**
 * Añade soporte para WPML
 */
function apg_wpml() {	
	global $array_of_default_settings;
	
	$options = wp_parse_args( get_option( 'interface_theme_options', array() ), interface_get_option_defaults() );
	
	if ( function_exists( 'icl_object_id' ) ) { //Registramos los textos en WPML
		do_action( 'wpml_register_single_string', 'apg_interface', 'home_slogan1', $options['home_slogan1'] );
		do_action( 'wpml_register_single_string', 'apg_interface', 'home_slogan2', $options['home_slogan2'] );
		do_action( 'wpml_register_single_string', 'apg_interface', 'footer_code', $options['footer_code'] );
	}
}
add_action( 'init', 'apg_wpml', 15 );

if ( ! function_exists( 'interface_home_slogan' ) ) :

/**
 * Display Home Slogan.
 *
 * Function that enable/disable the home slogan1 and home slogan2.
 */
function interface_home_slogan() {	
	global $array_of_default_settings;
	
 	$options = wp_parse_args( get_option( 'interface_theme_options', array() ), interface_get_option_defaults() );
	
	$home_slogan1	= $options['home_slogan1'];
	$home_slogan2	= $options['home_slogan2'];
	if ( function_exists( 'icl_object_id' ) ) {
		$home_slogan1	= apply_filters( 'wpml_translate_single_string', $options['home_slogan1'], 'apg_interface', 'home_slogan1' );
		$home_slogan2	= apply_filters( 'wpml_translate_single_string', $options['home_slogan2'], 'apg_interface', 'home_slogan2' );
	}
	
	$interface_home_slogan = '';
	if( !empty( $home_slogan1 ) || !empty( $home_slogan2 ) ) {
      
		if ( 1 != $options[ 'disable_slogan' ] ) {
			$interface_home_slogan .= '<section class="slogan-wrap"><div class="container"><div class="slogan">';
			if ( !empty( $home_slogan1 ) ) {
				$interface_home_slogan .= esc_html( $home_slogan1 );
			}
			if ( !empty( $home_slogan2 ) ) {
				$interface_home_slogan .= '<span>'.esc_html( $home_slogan2 ).'</span>';
			}
			$interface_home_slogan .= '</div><!-- .slogan -->';
			$interface_home_slogan .= '</div><!-- .container --></section><!-- .slogan-wrap -->';
		}
		
	}	
	echo $interface_home_slogan;
}
endif;

/**
 * function to show the footer info, copyright information
 */
function apg_interface_footer_info() {         
	global $array_of_default_settings;
	
 	$options = wp_parse_args( get_option( 'interface_theme_options', array() ), interface_get_option_defaults() );

	$footer_code	= $options['footer_code'];
	if ( function_exists( 'icl_object_id' ) ) {
		$footer_code	= apply_filters( 'wpml_translate_single_string', $options['footer_code'], 'apg_interface', 'footer_code' );
	}

    $interface_footer_info = '<div class="copyright">' . $footer_code . '</div><!-- .copyright -->';
   	echo do_shortcode( $interface_footer_info );
}

function sobrescribiendo_ganchos() {
	remove_filter( 'interface_footer', 'interface_footer_info', 30 );
	add_filter( 'interface_footer', 'apg_interface_footer_info', 30 );
}
add_action( 'after_setup_theme', 'sobrescribiendo_ganchos' );

Paso a paso

Con la primera función, llamada apg_wpml, registramos en el init las tres opciones del tema a las que nos interesa añadir compatibilidad con WPML. Gracias a ella los valores que el tema almacena en la tabla wp_options de la base de datos serán legibles por WPML.

La segunda función, llamada interface_home_slogan, es una función nativa del tema Interface Pro que hemos sobrescrito para poder mostrar los textos traducidos previamente en WPML. Para conseguirlo cambiamos los valores estándar contenidos en $options

[‘home_slogan1’] y $options[‘home_slogan1’], por los valores traducidos en WPML que hemos almacenado en las variables $home_slogan1 y $home_slogan2. Estas variables toman los valores estándar en caso de que no exista ninguna traducción de WPML disponible, de esta forma evitamos cualquier tipo de error.

La tercera función, llamada apg_interface_footer_info, es la que usamos para mostrar el texto traducido del valor estándar contenido en $options[‘footer_code’]. En este caso concreto la variable que contiene el texto traducido se llama $footer_code, la cual, al igual que en la función PHP anterior, también toma el valor estándar en caso de no existir ninguna traducción de WPML. Ahora bien, esta función per se no sirve absolutamente para nada, ya que no se utiliza en ninguna acción o filtro.

Para hacer funcional a la función PHP apg_interface_footer_info hemos tenido que añadir una cuarta función llamada sobrescribiendo_ganchos, de la que ya os hablamos detenidamente en su momento en la entrada Sobrescribiendo filtros y acciones. Gracias a esta cuarta, y última función PHP, eliminamos el filtro original utilizado por el tema, y le añadimos uno nuevo que es el que se encargará de hacer funcionar a la función apg_interface_footer_info.

De esta forma, y gracias a la acción de estas cuatro funciones PHP, hemos conseguido hacer compatible el tema Interface Pro con WPML.

Esperamos que os resulte útil este ejemplo práctico que os hemos planteado en la entrada de hoy para futuros proyectos que tengáis que afrontar y que no tengan compatibilidad con WPML.