Ce site tente d’être bilingue, j’utilise pour cela le plugin Zdmultilang. Ce plugin gère la traduction de différents éléments de WordPress (articles, liens …) et couvre 90% des besoins en matière de traduction. Mais, comme la plupart des plugins de multilinguismes, il ne gère pas des besoins plus pointus, comme l’ajout dans le fichier sitemap.xml, des articles traduits, par exemple.
Le plugin de référence pour la génération de ce fichier étant Google XML Sitemaps, je vous propose une modification de ce plugin pour qu’il prenne en compte les informations gérées par ZdMultilang.
L’objectif étant d’avoir, au final, l’intégralité des articles, quelle que soit leur langue, dans le fichier
sitemap.xml
This post is available in english: A multilingual sitemap with Google XML sitemap and ZdMultiLang
Préambule
Il est préférable, voir obligatoire de tester ces modifications avant de les installer sur votre blog, d’une part, pour savoir si elles fonctionnent, et d’autre part, pour savoir si elles n’ont aucun impact sur le blog.
Les modifications proposées ont été testées avec
- ZdMultiLang 1.2.4
- Google XML SiteMaps 3.1.5
Tout bricolage de ce genre, comporte des inconvénients:
- Il faudra vérifier son fonctionnement, a chaque mise a jour de ZdMultiLang,
- Il faudra également modifier le plugin Google XML Sitemaps, a chacune de ses mises a jour.
Pour résumer, cette opération interdit toute mise à jour automatique pour ces deux plugins.
La bidouille
Tout se passe dans le fichier sitemap-core.php du plugin Google XML Sitemaps, en général installé dans le répertoire wp-content/plugins/google-sitemap-generator.
En bas de la boucle parcourant les articles, aux alentours de la ligne 1970, placez la ligne suivante:
global $ZdmlCache; if ( function_exists('zd_multilang_set_locale') && isset($ZdmlCache) ) zdmultilang_add_posts(&$this, $permalink, $post, $isPage, $cf_pages, $cf_posts, $prio);
Puis, en haut du fichier, avant la ligne if (!function_exists('file_get_contents')), placez le code suivant:
function zdmultilang_add_posts($object, $permalink, $post, $isPage, $cf_pages, $cf_posts,$prio) { global $wp_rewrite; global $ZdmlCache; foreach ($ZdmlCache['Languages'] as $lang_permalink => $lang_id) { if ($lang_id != $ZdmlCache['DefLang']) { // Get the list of translated posts $posts_list = explode(',', $ZdmlCache['TranslatedPosts'][$lang_id]); // Is the current post translated? if (array_search($post->ID, $posts_list) !== FALSE ) { // Add the language permalink according the rewriting rules if ( $lang_permalink != '' ) { if ($wp_rewrite->using_permalinks()) { $url = get_bloginfo('url'); $end = substr($permalink,strlen($url)); $permalink = $url.'/'.$lang_permalink.$end; } else { $permalink .= '&lang='.$lang_permalink; } } // Add translated post to the XML file $object->AddUrl($permalink,$object->GetTimestampFromMySql(($post->post_modified_gmt && $post->post_modified_gmt!='0000-00-00 00:00:00'?$object->post_modified_gmt:$post->post_date_gmt)),($isPage?$cf_pages:$cf_posts),$prio); } // End of post translated } // End of not default language } // End of foreach language } // End of zdmultilang_add_posts
Et voila !
La modification ne génère pas de requêtes supplémentaires, puisqu’elle s’appuie sur le « cache » de ZdMultiLang.
L’image ci-dessous montre le résultat:

Nous pouvons voir les articles en français, ainsi que leur traduction quand elle existe.
Grâce à ces modifications nous optimisons maintenant le référencement de nos articles traduits.
