De nombreux thèmes présentent des publications, des pages et des catégories spéciales étroitement liées à des identifiants. Par exemple, une rubrique « Publication à la une » sur la page d’accueil, ou des catégories mises en avant.

Dans certains cas, ces identifiants sont codés dans le PHP du thème et, dans d’autres cas, l’utilisateur les sélectionne dans l’écran de configuration du thème.

Pour un bon affichage, le thème doit sélectionner les identifiants selon la langue. Dans WPML, les identifiants relatifs aux communications, pages, catégories et balises changent lorsque la langue change, de sorte que le thème doit s’assurer d’utiliser les identifiants de la langue active.

WPML propose deux options pour atteindre cet objectif.

Vous pouvez activer l’adaptation automatique des identifiants ou utiliser manuellement wpml_object_id dans votre thème.

Quelle option utiliser ?

L’adaptation automatique des identifiants ne requiert de faire aucun changement dans le code. Vous pouvez l’utiliser avec n’importe quel thème et tout « fonctionnera bien ». L’inconvénient : un temps de traitement et d’accès à la base de données légèrement supérieur car WPML s’accroche à de nombreuses fonctions et vérifie que le rendu, pour la langue active, est adéquat.

L’adaptation manuelle des identifiants via la fonction wpml_object_id donnera les mêmes résultats, toutefois avec une efficacité supérieure en termes de traitement. Malheureusement, elle requiert de gros efforts en matière de modification de code dans le thème.

Si vous créez un tout nouveau thème, nous vous conseillons d’envisager d’utiliser wpml_object_id pour le faire manuellement. Si vous commencez avec un thème existant, pirater le code du thème et le modifier n’est pas réaliste. Choisissez plutôt l’adaptation automatique des identifiants.

En tout cas, utilisez n’importe quel plug-in de mise en cache, afin de réduire drastiquement l’impact de cette opération sur les performances de votre thème. La mise en cache est toujours recommandée quelle que soit la taille du site. WPML est totalement compatible avec WP Super Cache et W3 Total Cache (que nous utilisons également sur différents sites).

1) Adaptation automatique des identifiants

WPML peut se connecter aux fonctions de l’API WordPress, détecter quand des éléments spécifiques sont chargés et adapter les identifiants afin d’optimiser les résultats pour la langue active.

Cette fonctionnalité est activée par défaut ; accédez-y via WPML-> Langues :

Adaptation des identifiants pour la fonctionnalité multilingue

Tous les identifiants seront ainsi adaptés. La fonction peut être utilisée dans n’importe quel thème WordPress qui utilise l’API de manière adéquate (la grande majorité des thèmes disponibles).

2) Adaptation manuelle via la fonction wpml_object_id

Si l’adaptation automatique des identifiants est désactivée, vous pouvez utiliser la fonction wpml_object_id pour obtenir manuellement le même résultat.

apply_filters( ‘wpml_object_id’, int $element_id, string $element_type, bool $return_original_if_missing, mixed $ulanguage_code )

Remarque : Pour les versions WPML postérieure à 3.2, merci d’utiliser le crochet de filtrage wpml_object_id. Dès la WPML 3.3, la fonction icl_object_id a été marquée comme obsolète et supprimée entièrement.

Exemple d’utilisation

echo apply_filters( 'wpml_object_id', 4, 'category', TRUE  );

Renvoie l’identifiant de catégorie dans la langue actuelle pour la catégorie ID 4. En l’absence de traduction, elle renverra l’original (ici, l’identifiant de la catégorie 4).

Consultez la page dédiée à l’API pour voir d’autres exemples et trouver plus informations sur son utilisation.

Traduire toute un tableau d’identifiants

Il n’est pas rare que vous deviez convertir un tableau entier d’identifiants d’objet (le plus souvent des identifiants de catégorie). Pour ce faire, vous pouvez utiliser la fonction suivante :

function lang_object_ids($object_id, $type) {

    if( is_array( $object_id ) ){

        $translated_object_ids = array();

        foreach ( $object_id as $id ) {

            $translated_object_ids[] = apply_filters( 'wpml_object_id', $id, $type, true, $current_language );

        }

        return $translated_object_ids;

    } else {

  return apply_filters( 'wpml_object_id', $object_id, $type, true, $current_language );

 }

}

Cette fonction accepte également le type d’objet comme argument.

Par exemple, pour obtenir un tableau d’identifiants de catégorie pour les catégories 1,3 et 6, nous allons appeler :

lang_object_ids(array(1,3,6),'category')

Affichage des éléments de la page dans différentes langues

Le paramètre optionnel ulanguage_code permet de mélanger les éléments de la page dans différentes langues.

Par exemple, si vous avez une galerie d’images et ne souhaitez pas dupliquer les images par langue, faites comme suit :

  1. Obtenez l’identifiant de la page dans la langue dans laquelle la galerie existe.
  2. Créez une boucle avec ces images sur la page afin de les afficher.