vendredi 25 septembre 2026

À propos

Contact

Multilingue

Articles liés multilingues : afficher le bon contenu associé dans chaque langue

Un bloc d'articles similaires affichait des contenus dans la mauvaise langue. Voici la requête à corriger pour filtrer par langue courante.

Par Clément Hadrot • 24 octobre 2020 • 5 min de lecture • Aucun commentaire
Articles liés multilingues : afficher le bon contenu associé dans chaque langue

Un client m’a signalé qu’en bas de ses pages produit, le bloc « Produits similaires » affichait parfois trois références en français, parfois un mélange de français et d’anglais, sans logique apparente pour un visiteur naviguant sur la version française du site. Le développeur précédent avait codé ce bloc avec une requête WP_Query personnalisée basée sur la taxonomie de catégorie produit, sans jamais penser à y ajouter un filtre de langue.

Ce cas est extrêmement courant sur les sites multilingues : toute requête WP_Query écrite à la main, en dehors de la boucle principale de WordPress, échappe par défaut au filtre de langue appliqué automatiquement par Polylang ou WPML sur la requête principale de la page. Il faut l’ajouter explicitement.

Pourquoi la requête principale est filtrée mais pas les requêtes secondaires

Polylang et WPML interceptent la requête principale de WordPress (celle qui détermine le contenu affiché sur la page en cours) via le hook pre_get_posts, et y ajoutent automatiquement une condition sur la langue. Mais une requête personnalisée créée dans un template avec new WP_Query( $args ) n’est pas automatiquement une requête « principale » au sens de WordPress : selon la configuration de l’extension multilingue, elle peut ou non hériter du même filtre, et il vaut toujours mieux ne pas compter sur ce comportement implicite.

La correction avec Polylang

Polylang expose la fonction pll_current_language(), qui renvoie le code de la langue actuellement affichée. Ce code s’ajoute directement dans les arguments de la requête, via le paramètre lang reconnu nativement par Polylang :

<?php
$args = array(
    'post_type'      => 'product',
    'posts_per_page' => 3,
    'post__not_in'   => array( get_the_ID() ),
    'tax_query'      => array(
        array(
            'taxonomy' => 'product_cat',
            'field'    => 'term_id',
            'terms'    => $categories,
        ),
    ),
    'lang'           => pll_current_language(),
);
$produits_similaires = new WP_Query( $args );
?>

L’ajout de la clé 'lang' => pll_current_language() suffit : Polylang reconnaît ce paramètre dans n’importe quelle requête WP_Query et filtre les résultats en conséquence, sans nécessiter de modification supplémentaire.

La correction avec WPML

WPML fonctionne différemment : il ne reconnaît pas de paramètre lang natif dans WP_Query. Le filtrage passe par un réglage global activable dans WPML > Réglages, section « Langue du contenu affiché par les requêtes personnalisées », avec trois options possibles : langue courante, toutes les langues, ou une langue spécifique. Une fois ce réglage sur « Langue actuellement affichée », toute requête WP_Query du thème est automatiquement filtrée sans modification de code, ce qui simplifie l’intégration pour un thème déjà écrit sans considération multilingue.

L'essentiel à retenir : Une requête personnalisée n'hérite jamais automatiquement du filtre de langue ; Polylang et WPML exposent chacun une fonction pour récupérer la langue courante ; Le filtre doit s'appliquer à la fois sur les articles et sur les taxonomies utilisées pour le rapprochement

Le cas des taxonomies partagées entre langues

Le rapprochement par taxonomie, comme dans l’exemple ci-dessus avec product_cat, suppose que chaque terme de taxonomie existe dans chaque langue et que l’article traduit est bien rattaché au terme traduit correspondant, et non au terme de la langue source. Ce point mérite une vérification distincte, propre à la configuration des taxonomies elles-mêmes, qui ne sera pas traitée ici puisqu’elle dépend de réglages différents de ceux d’une simple requête.

Vérifier le résultat sur plusieurs cas de figure

Une correction de requête doit être testée sur plusieurs scénarios, pas seulement sur la page qui a signalé le problème initialement. Je vérifie systématiquement quatre cas : une page dont tous les articles associés existent dans la langue courante, une page où un seul article associé existe encore dans la langue par défaut faute de traduction, une page sans aucun article associé disponible dans la langue courante, et enfin le comportement sur une langue tierce si le site en compte plus de deux.

  • Le cas « zéro résultat » doit afficher un message ou masquer le bloc proprement, jamais une erreur PHP silencieuse.
  • Un test avec WP_DEBUG activé permet de repérer une requête mal formée avant la mise en production.
  • Un cache de fragment de page doit être invalidé par langue, sinon le résultat filtré d’une langue peut rester affiché sur une autre après un changement de cache.

Documenter la règle pour l’équipe

Après cette correction, j’ai ajouté une note dans la documentation technique interne du projet : toute nouvelle requête WP_Query écrite dans ce thème doit inclure le filtre de langue approprié selon l’extension installée, avec un exemple de code type comme référence. Cette règle simple évite qu’un futur développeur reproduise l’erreur sur un autre bloc du même site.

Je considère qu’une requête personnalisée sans filtre de langue explicite sur un site multilingue est un bug latent, même si elle fonctionne correctement au moment où elle est écrite : le jour où une deuxième langue reçoit du contenu réel, l’erreur devient visible.

En résumé

Une requête WP_Query personnalisée n’hérite jamais automatiquement du filtre de langue appliqué à la requête principale d’une page. Avec Polylang, l’argument lang ajouté directement à la requête suffit. Avec WPML, le réglage global des requêtes personnalisées couvre l’ensemble du thème sans modification de code. Dans les deux cas, tester sur plusieurs scénarios de disponibilité de traduction reste indispensable avant de considérer le correctif terminé.

Partager :

À propos de l'auteur

Clément Hadrot

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi