Un sitemap multilingue avec Google XML Sitemap et ZdMultiLang

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 !

Le code source des modifications
Titre : Le code source des modifications
Légende : Le code source des modifications
Nom du fichier : xml_sitemap_zdmultilang.txt
Taille : 2 Ko

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:

Résultats
Résultats

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.