PS PrestaShop Débutant

Documentation du module Sitemap XML avancé PrestaShop (dfsitemap)

Installer et configurer dfsitemap : contenus, images et vidéos, hreflang, règles d'exclusion, génération par lots, cron, IndexNow et multiboutique.

Mis à jour Version du module 1.1.0

Le module Advanced XML Sitemap (dfsitemap) génère les sitemaps XML de PrestaShop 8 et 9 : un index par boutique, un fichier par langue et par type de contenu, avec images, vidéos et balises hreflang. Cette page couvre l’installation, les réglages, les règles d’exclusion, la planification et le dépannage.

Installation

  1. Téléchargez le ZIP depuis votre compte client DataFirefly.
  2. Dans le back-office, allez dans Modules > Gestionnaire de modules > Installer un module et envoyez le ZIP.
  3. Ouvrez Paramètres de la boutique > Trafic et SEO > Sitemap XML avancé. Trois onglets en haut de page donnent accès aux sitemaps et réglages, aux règles d’exclusion et aux vidéos produit.
  4. Si le module natif Google sitemap (gsitemap) est actif, désactivez-le et supprimez ses fichiers *_sitemap.xml à la racine de la boutique. Le module affiche un avertissement tant que gsitemap est actif.
  5. Cliquez sur Générer maintenant, puis sur Déclarer les sitemaps dans robots.txt.
  6. Soumettez l’URL d’index affichée dans Google Search Console et Bing Webmaster Tools.

Le module fonctionne de PrestaShop 8.0 à 9.x avec le même ZIP, en multiboutique et en multilingue. Il a besoin d’écrire dans le dossier racine de la boutique, où sont publiés les fichiers dfsitemap-*.xml, et dans modules/dfsitemap/var/tmp/. Une alerte s’affiche si l’un des deux n’est pas accessible en écriture.

Les fichiers produits

Pour chaque boutique, le module publie un index dfsitemap-{id boutique}-index.xml qui pointe vers des fichiers nommés par langue et par type, par exemple dfsitemap-1-fr-product-1.xml. Quand un fichier atteint le nombre d’URL fixé, ou avant 45 Mo, la suite part dans -2, -3, etc. Les URL personnalisées sans langue sont regroupées dans dfsitemap-1-all-custom-1.xml.

Si les URL simplifiées sont activées, l’index est aussi servi à l’adresse /sitemap.xml du domaine de chaque boutique. Un fichier physique sitemap.xml à la racine prend le pas sur cette adresse : le module le signale.

Les fichiers sont construits dans un dossier temporaire puis publiés boutique par boutique. Les anciens sitemaps restent en ligne pendant la génération, et les fichiers devenus inutiles sont supprimés à la publication.

Réglages

Les réglages suivent le contexte multiboutique : en contexte d’une boutique, les valeurs enregistrées ne concernent que cette boutique.

Contenu

  • Types de contenu : pages statiques, produits, catégories, pages CMS, catégories CMS, marques, fournisseurs, URL personnalisées. Seul le contenu actif est listé.
  • Pages statiques : accueil, meilleures ventes, nouveautés, promotions, listes des marques et des fournisseurs, magasins, contact, plan du site. Les listes des marques et des fournisseurs sont ignorées si leur page est désactivée dans les préférences de la boutique.
  • Langues : laissez tout coché pour suivre automatiquement les langues actives de chaque boutique.
  • Produits visibles en recherche seulement : par défaut, seuls les produits en visibilité Partout ou Catalogue uniquement sont listés.
  • URL personnalisées : une par ligne. Un chemin relatif comme /blog/ est ajouté à l’URL de la boutique.
  • Sitemaps supplémentaires : URL absolues de sitemaps produits ailleurs, par exemple par un module de blog ou un WordPress sur le même domaine. Elles sont ajoutées à l’index de la boutique.

Une page CMS dont l’option Indexation par les moteurs de recherche est désactivée est servie par PrestaShop avec une balise noindex. Le module ne la liste pas et affiche le nombre de pages concernées. Activez l’option sur les pages qui doivent être indexées.

Images et vidéos

  • Sitemap images et toutes les images produit (sinon la couverture seule), dans le format d’image choisi, large_default par défaut.
  • Images des catégories, marques et fournisseurs : l’image d’origine de chaque entité, si elle existe.
  • Sitemap vidéos et détection YouTube et Vimeo : le module repère les vidéos intégrées dans les descriptions produit et les pages CMS. Les titres et durées Vimeo sont lus une fois puis mis en cache.

Hreflang

  • Alternatives hreflang : chaque URL liste ses traductions. Utile dès que la boutique a plusieurs langues.
  • Code hreflang : langue et région (fr-FR, tiré du code de langue défini dans International > Langues) ou langue seule (fr).
  • Langue x-default : langue par défaut de la boutique, une langue précise, ou aucune.

Balises et affichage

  • lastmod : date de dernière modification des produits, catégories, catégories CMS, marques et fournisseurs.
  • changefreq et priority : désactivées par défaut, Google les ignore.
  • Affichage lisible : une feuille de style XSL affiche l’index et les fichiers sous forme de tableau dans le navigateur. Les moteurs l’ignorent.

Génération

  • Fréquence : de toutes les heures à une fois par semaine, utilisée par le cron.
  • Régénérer quand le contenu change : quand un produit, une catégorie, une page CMS, une marque ou un fournisseur est enregistré, le prochain appel cron régénère sans attendre la fréquence, au plus une fois par heure.
  • URL par fichier : 10 000 par défaut, entre 100 et 50 000.
  • Éléments par lot : 50 par défaut. Diminuez sur un serveur lent.
  • Budget de temps par requête : 20 secondes par défaut, à garder sous le max_execution_time du serveur. Depuis le back-office, chaque requête est limitée à 15 secondes.

Règles d’exclusion

L’onglet Règles d’exclusion liste les règles actives. Chaque règle s’applique à toutes les boutiques ou à une seule, et prend effet à la génération suivante.

  • Produits : par ID, dans une catégorie (toute association, sous-catégories comprises), d’une marque, d’un fournisseur par défaut, en rupture de stock, à prix zéro, sans image.
  • Catégories : par ID, ou une catégorie et toutes ses sous-catégories. Les produits restent listés sauf si une règle produit les retire.
  • Pages CMS : par ID, ou une catégorie CMS avec ses pages.
  • Marques et fournisseurs : par ID.
  • URL contient un texte : un texte par ligne, sans tenir compte de la casse, par exemple ?q=.
  • URL correspond à une expression régulière : une expression par ligne, sans délimiteurs, sans tenir compte de la casse, par exemple /fr/.*-test$. Une expression invalide est refusée à l’enregistrement.

Les ID se saisissent séparés par des virgules ou des retours à la ligne. Une URL exclue par une règle disparaît aussi des alternatives hreflang de ses traductions.

Vidéos produit

L’onglet Vidéos produit sert aux vidéos hébergées hors YouTube et Vimeo, ou quand vous voulez un titre et une description précis. Pour chaque vidéo : le produit (recherche par nom, référence ou ID), le titre et la description par langue, l’URL de la miniature, l’URL du fichier vidéo ou celle du lecteur, la durée en secondes et la boutique concernée. Un titre vide dans une langue reprend celui d’une autre langue, puis le nom du produit.

Lancer la génération

Depuis le back-office

Générer maintenant lance la génération pour les boutiques du contexte courant, avec une barre de progression. La page enchaîne les requêtes jusqu’à la fin. Si vous fermez la page, la tâche reste enregistrée : le bouton Reprendre dans cette fenêtre la poursuit, ou le cron s’en charge. Annuler arrête la tâche, les sitemaps en ligne restent inchangés.

Par le cron

Le tableau de bord affiche une URL de la forme https://votre-boutique.fr/module/dfsitemap/cron?token=.... Appelez-la toutes les 5 minutes depuis le gestionnaire cron de votre hébergement ou le module Tâches cron de PrestaShop. Chaque appel travaille pendant le budget de temps, puis l’appel suivant reprend la tâche. Une boutique est régénérée quand sa fréquence est atteinte, ou après une modification de contenu si l’option est activée. Paramètres facultatifs : force=1 pour régénérer tout de suite, id_shop=1,2 pour limiter les boutiques. Le bouton Générer un nouveau jeton invalide l’ancienne URL.

En ligne de commande

Avec un accès SSH, le script traite toute la tâche d’un seul coup, quelle que soit la taille du catalogue :

php /chemin/vers/prestashop/modules/dfsitemap/cron.php
php /chemin/vers/prestashop/modules/dfsitemap/cron.php --force --shop=1

Sans --force, seules les boutiques arrivées à échéance sont régénérées. Le script renvoie un code de sortie 1 en cas d’erreur.

Si une requête est coupée par le serveur en pleine génération, la tâche reprend à la dernière position enregistrée et les fichiers en cours sont réparés. Le verrou laissé par la requête coupée expire après le budget de temps plus 90 secondes : le back-office indique le délai restant.

IndexNow

IndexNow permet d’annoncer une page créée ou modifiée à Bing, Yandex, Seznam, Naver et aux autres moteurs du protocole, sans attendre leur prochain passage. Google n’utilise pas IndexNow et continue de lire le sitemap.

  1. Activez Envoyer les pages modifiées avec IndexNow dans le bloc Indexation instantanée. Le module écrit un fichier clé à la racine de la boutique.
  2. À chaque enregistrement d’un produit, d’une catégorie, d’une page CMS, d’une marque ou d’un fournisseur, l’objet est mis en file d’attente.
  3. Au prochain appel cron, le module calcule les URL de ces contenus dans toutes les langues et les envoie, domaine par domaine. Seul le contenu listé dans le sitemap part : un produit inactif ou exclu par une règle n’est pas envoyé.

Le bloc IndexNow du tableau de bord affiche la file d’attente, la présence du fichier clé et le dernier envoi avec son code HTTP (200 ou 202 en cas de succès). En cas de réponse 429 ou 5xx, la file est conservée pour l’appel suivant. Le bouton Envoyer maintenant déclenche un envoi immédiat.

robots.txt et Search Console

Le bouton Déclarer les sitemaps dans robots.txt ajoute une ligne Sitemap: par boutique entre les marqueurs # BEGIN dfsitemap et # END dfsitemap. Quand PrestaShop régénère le robots.txt depuis Trafic et SEO, le module réécrit ce bloc. La désinstallation le retire.

Dans Google Search Console, soumettez l’URL d’index de chaque boutique (ou /sitemap.xml) dans la propriété du domaine correspondant.

Multiboutique

Chaque boutique a son index sur son propre domaine, ses langues et ses réglages. Sélectionnez une boutique dans le menu multiboutique pour lui donner des valeurs propres ; en contexte Toutes les boutiques, les valeurs s’appliquent aux boutiques sans valeur spécifique. Le tableau de bord affiche, pour chaque boutique du contexte, l’URL d’index, la date de la dernière génération, le nombre d’URL par type, d’images, de vidéos et de fichiers.

Pour les développeurs : ajouter des URL

Un module peut ajouter ses pages au sitemap en s’accrochant au hook actionDfSitemapUrls, appelé pendant le traitement du type URL personnalisées. Le hook reçoit id_shop, languages (id_lang => code ISO) et link, et renvoie une liste d’entrées :

public function hookActionDfSitemapUrls($params)
{
    $loc = [];
    foreach ($params['languages'] as $idLang => $iso) {
        $loc[$idLang] = $params['link']->getBaseLink($params['id_shop']) . $iso . '/blog/mon-article';
    }

    return [
        ['loc' => $loc, 'lastmod' => '2026-09-01 10:00:00', 'images' => ['https://.../image.jpg']],
        ['loc' => 'https://votre-boutique.fr/page-unique'],
    ];
}

Une entrée dont loc est indexé par langue reçoit les balises hreflang comme une page native. Les entrées invalides sont ignorées sans interrompre la génération.

Questions fréquentes

Le sitemap ne contient aucune page CMS

Vérifiez l’option Indexation par les moteurs de recherche de chaque page CMS. Une page qui ne l’a pas est en noindex et n’est pas listée.

Les marques ou fournisseurs n’apparaissent pas

Le module suit les préférences de la boutique : si la page des marques ou des fournisseurs est désactivée, ce type est ignoré.

La génération reste sur « Un autre processus traite la tâche »

Une autre requête tient le verrou, souvent le cron. Si cette requête a été coupée, le verrou expire au bout du délai affiché et la génération reprend seule.

La génération s’arrête sur une erreur

Le message s’affiche en haut du tableau de bord et dans Paramètres avancés > Logs. La cause la plus fréquente est un dossier racine non accessible en écriture. Les sitemaps précédents restent en ligne.

IndexNow renvoie 403 ou 422

Le moteur ne trouve pas le fichier clé ou refuse l’hôte. Ouvrez l’URL du fichier clé affichée dans le bloc IndexNow : elle doit afficher la clé. Vérifiez aussi que le domaine de la boutique correspond à celui des URL envoyées.

Cette page vous a-t-elle été utile ?

Toujours bloqué ? Contactez le support