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

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 (209 clics)
Légende: Le code source des modifications
Nom du fichier: xml_sitemap_zdmultilang.txt
Taille: 2 KB

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.

11 thoughts on “Un sitemap multilingue avec Google XML Sitemap et ZdMultiLang”

  1. J’avoue que ce message là « m’agace »: Je le rencontre regulierement, sans savoir pourquoi. Je fais des tests en PHP4 et PHP5, et je n’ai pas ce message.
    Je vais potasser la doc PHP pour comprendre de quoi il s’agit.
    Bon finalement, le probleme n’est pas très compliqué.
    A la ligne indiquee, tu remplaces & $this, par $this. Le & est en trop.

  2. Merci Emmanuel pour le fichier, effectivement, je n’ai plus d’erreur. Enfin… je n’ai plus l’erreur que j’avais 😀

    Maintenant, quand je vais sur la page de XML-Sitemap, j’ai ce message d’erreur :

    Warning: Call-time pass-by-reference has been deprecated; If you would like to pass it by reference, modify the declaration of zdmultilang_add_posts(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file in /****/sitemap-core.php on line 2005

    C’est grave docteur ? 🙂

    Sinon, je profite de ce commentaire pour vous remercier car ce post m’a enfin poussé à tester le plugin d’Anthony qui est tout simplement génial ! Donc merci à tous les deux pour votre boulot.

  3. Tu peux, je m’adapterai …
    L’ideal serait d’en discuter avec l’auteur du plugin Google Sitemap, mais quelle que soit la solution, il y aura forcement une personne impactee par les changements sur les deux plugins …

  4. Emmanuel, une nouvelle version de ZdMultilang devrait bientot sortir, et je tacherais de ne pas casser tes modifs de google sitmap 😉

    Je ne peux encore te dire quand sortiras la prochaine version sachant que je n’ai pas encore inclus toutes les nouveautes que je souhaiterais.

  5. L’éditeur de WordPress maltraite beaucoup les lignes de code inclusent dans les articles. Il est possible qu’il manque un caractère quelque part avant cette ligne qui semble tout à fait correcte.
    Le plus sain est que je rajoute le code dans un fichier en pièce jointe. Je le ferai ce soir.

  6. Merci pour ce tuto !
    Malheureusement, il ne fonctionne pas chez moi. Quand je mets les modifications, j’obtiens cette erreur :

    Parse error: syntax error, unexpected ‘=’, expecting ‘)’ in /home/juliengautier/testdegeek/wp-content/plugins/google-sitemap-generator/sitemap-core.php on line 18

    Sachant que la ligne 18 est celle-ci :
    foreach ($ZdmlCache[‘Languages’] as $lang_permalink => $lang_id) {

    J’ai essayé quelques trucs mais en vain…

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *