Les liens placés en dur dans le contenu de votre site sont “traduits” manuellement dans les différentes langues de ce contenu. Par contre pour les urls dynamiques, c’est un peu plus compliqué.

Pour différentes raisons nous pouvons être amené à insérer des urls dynamiquement dans nos contenus multilingue. Ce peut être en utilisant un code court (shortcode) ou encore un filtre.

Le problème est que si vous insérez les liens dans la langue par défaut du site, elles ne se traduiront pas automatiquement dans les autres langues.

Pour résoudre ce problème nous allons utiliser une petite fonction qui va récupérer l’url dans la langue de son choix à partir de l’url dans la langue insérée dynamiquement dans notre contenu.

[pastacode lang=”php” message=”” highlight=”” provider=”manual”]
// Récupérer une url dans la langue de son choix
function get_url_for_language( $original_url, $language ) {
    $post = get_page_by_path( $original_url );
    $lang_post_id = icl_object_id( $post->ID , 'page', true, $language );     
    $url = "";
    if($lang_post_id != 0) {
        $url = get_permalink( $lang_post_id );
    } else {
        // No page found, it's most likely the homepage
        global $sitepress;
        $url = $sitepress->language_url( $language );
    }
    return $url;
}
[/pastacode]

source modifiée

Sur le principe, la fonction récupère le post du l’url transmise, à partir de l’id de ce post nous récupérons l’id du post dans la langue cible grâce à une fonction de WPML, puis enfin nous récupérons le permalien correspondant à cet id.

Exemple d’utilisation de cette fonction dans une page produit de WooCommerce :

[pastacode lang=”php” message=”” highlight=”” provider=”manual”]
add_action( 'woocommerce_single_product_summary', 'abw_woocommerce_template_single', 35 );
function abw_woocommerce_template_single() {
	// urls dans la langue par défaut
	$url_contact 	= '/contact/';
	$url_presse 	= '/presse/';
	// Si la langue en cours n'est pas le français
	// on récupère les urls dans la langue en cours
	if(ICL_LANGUAGE_CODE!='fr'):
		$url_contact	= get_url_for_language( $url_contact, ICL_LANGUAGE_CODE );
		$url_presse 	= get_url_for_language( $url_presse, ICL_LANGUAGE_CODE );
	endif;
	echo '<a href="'.$url_contact.'">'.__("Any questions?", 'domain_txt').'</a>';
	echo '<a href="'.$url_presse.'">'.__("Press", 'domain_txt').'</a>';
}
[/pastacode]

Ici on utilise un filtre pour insérer des liens dans la page produit sans avoir à modifier le modèle WooCommerce. Les urls par défaut correspondent à la version française du site, si la langue en cours (constante de WPML) n’est pas le français, on appelle la fonction pour récupérer la version de la langue en cours.