Solution pour produits dédoublés affichant toutes les langues avec WooCommerce et WPML

Dans la stabilité de la Trinité WordPress-WooCommerce-WPML, il est parfois difficile de tout assembler gracieusement et sans heurt, qui plus est, quand le thème choisi tient parfois lieu de 4e contrainte.

Ayant frappé un mur à ce sujet aujourd’hui, et n’ayant rien trouvé sur le Web (malgré plus d’une vingtaine de sujets épluchés sur divers forums), j’ai dû créer une solution sur mesure. En souhaitant qu’elle puisse servir à d’autres, la voici:

CONTEXTE:
– plugin WooCommerce (2.0.20)
– plugin multilingue WPML (3.0.1)
– WordPress (3.6.1)
– Thème compatible WooCommerce (avec sous-templates WooCommerce)

PROBLÈME:
La page « archive-product.php » située dans les sous-templates /woocommerce/ du thème affichait les articles en double, dans toutes les langues confondues.

Le fameux « Loop » wordpress était donc initié dans cette page, bien que le sommaire individuel des produits eux-mêmes (thumbnails, liens et prix) se faisait dans un autre sous-template: « content-product.php ».

SOLUTION:
En l’absence d’une bonne collaboration préalable entre le développeur du thème et WPML, il faut parfois pouvoir soi-même colmater la brèche! La solution visée était donc, dans le contexte du have_posts() de WordPress, de pouvoir obtenir la langue de chaque produit et de ne l’afficher que si la langue active de WPML, via ICL_LANGUAGE_CODE, correspondait:

// code à mettre lorsqu'à l'intérieur d'une boucle WordPress "The Loop"
// du genre "<em>while ( have_posts() ) : the_post();</em>"
if(function_exists('wpml_get_language_information')) { 
  $lang_ce_post = wpml_get_language_information($product->id);
  // $product->id est peut-être différent dans votre cas
  // dans mon cas, $product était appelé en global, en haut du script.
}
if(!isset($lang_ce_post['locale']) || strpos($lang_ce_post['locale'], ICL_LANGUAGE_CODE)!==FALSE ) {
  // Bingo! Affichage ici des produits WooCommerce selon la langue WPML actuellement active!
}

Laissez un commentaire