PS PrestaShop Beginner

Documentatie van de module Geavanceerde XML-sitemap voor PrestaShop (dfsitemap)

dfsitemap installeren en instellen: inhoud, afbeeldingen en video's, hreflang, uitsluitingsregels, generatie in batches, cron, IndexNow en multistore.

Bijgewerkt Moduleversie 1.1.0

De module Advanced XML Sitemap (dfsitemap) maakt de XML-sitemaps van PrestaShop 8 en 9: één index per winkel, één bestand per taal en per inhoudstype, met afbeeldingen, video’s en hreflang-tags. Deze pagina behandelt installatie, instellingen, uitsluitingsregels, planning en probleemoplossing.

Installatie

  1. Download de ZIP vanuit uw DataFirefly-klantaccount.
  2. Ga in de back-office naar Modules > Modulebeheer > Een module uploaden en upload de ZIP.
  3. Open Winkelinstellingen > Verkeer & SEO > Geavanceerde XML-sitemap. Drie tabbladen bovenaan de pagina leiden naar sitemaps en instellingen, uitsluitingsregels en productvideo’s.
  4. Is de standaardmodule Google sitemap (gsitemap) actief, schakel haar dan uit en verwijder haar bestanden *_sitemap.xml in de hoofdmap van de winkel. Zolang gsitemap actief is, toont de module een waarschuwing.
  5. Klik op Nu genereren en daarna op Sitemaps vermelden in robots.txt.
  6. Dien de getoonde index-URL in bij Google Search Console en Bing Webmaster Tools.

De module werkt van PrestaShop 8.0 tot 9.x met dezelfde ZIP, in multistore en meertalig. Ze moet kunnen schrijven in de hoofdmap van de winkel, waar de bestanden dfsitemap-*.xml worden gepubliceerd, en in modules/dfsitemap/var/tmp/. Er verschijnt een melding als een van beide niet beschrijfbaar is.

De gegenereerde bestanden

Voor elke winkel publiceert de module een index dfsitemap-{winkel-id}-index.xml die verwijst naar bestanden per taal en type, bijvoorbeeld dfsitemap-1-nl-product-1.xml. Bereikt een bestand het ingestelde aantal URL’s, of 45 MB, dan gaat de rest naar -2, -3 enzovoort. Eigen URL’s zonder taal komen samen in dfsitemap-1-all-custom-1.xml.

Als vriendelijke URL’s aan staan, wordt de index ook geleverd op /sitemap.xml op het domein van elke winkel. Een fysiek bestand sitemap.xml in de hoofdmap gaat voor op dat adres: de module meldt dat.

De bestanden worden in een tijdelijke map opgebouwd en daarna winkel per winkel gepubliceerd. De oude sitemaps blijven online tijdens de generatie, en bestanden die niet meer nodig zijn worden bij de publicatie verwijderd.

Instellingen

De instellingen volgen de multistore-context: in de context van één winkel gelden de opgeslagen waarden alleen voor die winkel.

Inhoud

  • Inhoudstypen: statische pagina’s, producten, categorieën, CMS-pagina’s, CMS-categorieën, merken, leveranciers, eigen URL’s. Alleen actieve inhoud wordt vermeld.
  • Statische pagina’s: home, bestsellers, nieuwe producten, aanbiedingen, merken- en leverancierslijst, winkels, contact, sitemappagina. De merken- en leverancierslijst worden overgeslagen als hun pagina in de winkelvoorkeuren uit staat.
  • Talen: laat alles aangevinkt om automatisch de actieve talen van elke winkel te volgen.
  • Producten die alleen in de zoekfunctie zichtbaar zijn: standaard worden alleen producten met zichtbaarheid Overal of Alleen catalogus vermeld.
  • Eigen URL’s: één per regel. Een relatief pad zoals /blog/ wordt aan de winkel-URL toegevoegd.
  • Extra sitemaps: absolute URL’s van sitemaps die elders gemaakt worden, bijvoorbeeld door een blogmodule of een WordPress-site op hetzelfde domein. Ze worden aan de index van de winkel toegevoegd.

Een CMS-pagina waarvan de optie Indexering door zoekmachines uit staat, levert PrestaShop met een noindex-tag. De module vermeldt haar niet en toont hoeveel pagina’s het betreft. Zet de optie aan op de pagina’s die geïndexeerd moeten worden.

Afbeeldingen en video’s

  • Afbeeldingensitemap en alle productafbeeldingen (anders alleen de hoofdafbeelding), in het gekozen afbeeldingsformaat, standaard large_default.
  • Afbeeldingen van categorieën, merken en leveranciers: de originele afbeelding van elk item, als die bestaat.
  • Videositemap en YouTube- en Vimeo-herkenning: de module vindt ingesloten video’s in productbeschrijvingen en CMS-pagina’s. Titels en duur van Vimeo-video’s worden één keer opgehaald en daarna in de cache bewaard.

Hreflang

  • Hreflang-alternatieven: elke URL vermeldt haar vertalingen. Nuttig zodra de winkel meerdere talen heeft.
  • Hreflang-code: taal en regio (nl-NL, uit de taalcode ingesteld in Internationaal > Talen) of alleen taal (nl).
  • x-default-taal: standaardtaal van de winkel, een bepaalde taal of geen.

Tags en weergave

  • lastmod: datum van laatste wijziging van producten, categorieën, CMS-categorieën, merken en leveranciers.
  • changefreq en priority: standaard uit, Google negeert ze.
  • Leesbare weergave: een XSL-stijlblad toont de index en de bestanden als tabel in de browser. Zoekmachines negeren het.

Generatie

  • Frequentie: van elk uur tot één keer per week, gebruikt door de cron.
  • Opnieuw genereren bij gewijzigde inhoud: wordt een product, categorie, CMS-pagina, merk of leverancier opgeslagen, dan genereert de volgende cron-aanroep opnieuw zonder op de frequentie te wachten, maximaal één keer per uur.
  • URL’s per bestand: standaard 10.000, tussen 100 en 50.000.
  • Items per batch: standaard 50. Verlaag dit op een trage server.
  • Tijdsbudget per verzoek: standaard 20 seconden, onder de max_execution_time van de server houden. Vanuit de back-office is elk verzoek beperkt tot 15 seconden.

Uitsluitingsregels

Het tabblad Uitsluitingsregels toont de actieve regels. Elke regel geldt voor alle winkels of voor één winkel en werkt vanaf de volgende generatie.

  • Producten: op ID, in een categorie (elke koppeling, subcategorieën inbegrepen), van een merk, van een standaardleverancier, niet op voorraad, met prijs nul, zonder afbeelding.
  • Categorieën: op ID, of een categorie met al haar subcategorieën. De producten blijven vermeld tenzij een productregel ze weghaalt.
  • CMS-pagina’s: op ID, of een CMS-categorie met haar pagina’s.
  • Merken en leveranciers: op ID.
  • URL bevat tekst: één tekst per regel, niet hoofdlettergevoelig, bijvoorbeeld ?q=.
  • URL komt overeen met een reguliere expressie: één expressie per regel, zonder scheidingstekens, niet hoofdlettergevoelig, bijvoorbeeld /nl/.*-test$. Een ongeldige expressie wordt bij het opslaan geweigerd.

ID’s worden ingevoerd gescheiden door komma’s of regeleinden. Een URL die door een regel is uitgesloten, verdwijnt ook uit de hreflang-alternatieven van haar vertalingen.

Productvideo’s

Het tabblad Productvideo’s is bedoeld voor video’s die buiten YouTube en Vimeo gehost worden, of als u een eigen titel en beschrijving wilt. Per video: het product (zoeken op naam, referentie of ID), titel en beschrijving per taal, de URL van de miniatuur, de URL van het videobestand of van de speler, de duur in seconden en de betrokken winkel. Een lege titel in een taal neemt die van een andere taal over, anders de productnaam.

De generatie starten

Vanuit de back-office

Nu genereren start de generatie voor de winkels in de huidige context, met een voortgangsbalk. De pagina schakelt de verzoeken aan elkaar tot het einde. Sluit u de pagina, dan blijft de taak bewaard: de knop Hervatten in dit venster gaat verder, of de cron neemt het over. Annuleren stopt de taak, de online sitemaps blijven ongewijzigd.

Met de cron

Het dashboard toont een URL zoals https://uw-winkel.nl/module/dfsitemap/cron?token=.... Roep die elke 5 minuten aan vanuit de cronbeheerder van uw hosting of de PrestaShop-module voor crontaken. Elke aanroep werkt gedurende het tijdsbudget, de volgende hervat de taak. Een winkel wordt opnieuw gegenereerd als zijn frequentie bereikt is, of na een inhoudswijziging als die optie aan staat. Optionele parameters: force=1 om meteen opnieuw te genereren, id_shop=1,2 om de winkels te beperken. De knop Nieuw token genereren maakt de oude URL ongeldig.

Via de opdrachtregel

Met SSH-toegang voert het script de hele taak in één keer uit, ongeacht de grootte van de catalogus:

php /pad/naar/prestashop/modules/dfsitemap/cron.php
php /pad/naar/prestashop/modules/dfsitemap/cron.php --force --shop=1

Zonder --force worden alleen de winkels die aan de beurt zijn opnieuw gegenereerd. Bij een fout stopt het script met exitcode 1.

Breekt de server een verzoek af tijdens de generatie, dan wordt de taak hervat vanaf de laatst opgeslagen positie en worden de bestanden in aanmaak hersteld. De vergrendeling van het afgebroken verzoek vervalt na het tijdsbudget plus 90 seconden: de back-office toont de resterende tijd.

IndexNow

IndexNow meldt een nieuwe of gewijzigde pagina bij Bing, Yandex, Seznam, Naver en de andere zoekmachines van het protocol, zonder te wachten op hun volgende bezoek. Google gebruikt IndexNow niet en blijft de sitemap lezen.

  1. Zet Gewijzigde pagina’s versturen met IndexNow aan in het blok Directe indexering. De module schrijft een sleutelbestand in de hoofdmap van de winkel.
  2. Telkens als een product, categorie, CMS-pagina, merk of leverancier wordt opgeslagen, komt het object in de wachtrij.
  3. Bij de volgende cron-aanroep berekent de module de URL’s van die inhoud in alle talen en verstuurt ze per domein. Alleen inhoud uit de sitemap wordt verstuurd: een inactief of door een regel uitgesloten product niet.

Het IndexNow-blok op het dashboard toont de wachtrij, of het sleutelbestand aanwezig is en de laatste verzending met de HTTP-code (200 of 202 bij succes). Bij een antwoord 429 of 5xx blijft de wachtrij bewaard voor de volgende aanroep. De knop Nu versturen start een directe verzending.

robots.txt en Search Console

De knop Sitemaps vermelden in robots.txt voegt per winkel een regel Sitemap: toe tussen de markeringen # BEGIN dfsitemap en # END dfsitemap. Als PrestaShop robots.txt opnieuw genereert via Verkeer & SEO, schrijft de module het blok opnieuw. Bij het verwijderen van de module verdwijnt het.

Dien in Google Search Console de index-URL van elke winkel (of /sitemap.xml) in bij de property van het bijbehorende domein.

Multistore

Elke winkel heeft een eigen index op het eigen domein, eigen talen en eigen instellingen. Kies een winkel in het multistore-menu om hem eigen waarden te geven; in de context Alle winkels gelden de waarden voor winkels zonder eigen waarde. Voor elke winkel in de context toont het dashboard de index-URL, de datum van de laatste generatie en het aantal URL’s per type, afbeeldingen, video’s en bestanden.

Voor ontwikkelaars: URL’s toevoegen

Een module kan haar pagina’s aan de sitemap toevoegen via de hook actionDfSitemapUrls, die wordt aangeroepen tijdens de verwerking van het type Eigen URL’s. De hook krijgt id_shop, languages (id_lang => ISO-code) en link, en geeft een lijst met items terug:

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

    return [
        ['loc' => $loc, 'lastmod' => '2026-09-01 10:00:00', 'images' => ['https://.../afbeelding.jpg']],
        ['loc' => 'https://uw-winkel.nl/losse-pagina'],
    ];
}

Een item waarvan loc per taal geïndexeerd is, krijgt hreflang-tags zoals een eigen pagina van PrestaShop. Ongeldige items worden overgeslagen zonder de generatie te stoppen.

Veelgestelde vragen

De sitemap bevat geen enkele CMS-pagina

Controleer bij elke CMS-pagina de optie Indexering door zoekmachines. Een pagina zonder die optie is noindex en wordt niet vermeld.

Merken of leveranciers verschijnen niet

De module volgt de winkelvoorkeuren: staat de merken- of leverancierspagina uit, dan wordt dat type overgeslagen.

De generatie blijft hangen op “Een ander proces werkt aan de taak”

Een ander verzoek houdt de vergrendeling vast, vaak de cron. Is dat verzoek afgebroken, dan vervalt de vergrendeling na de getoonde tijd en gaat de generatie vanzelf verder.

De generatie stopt met een fout

De melding verschijnt bovenaan het dashboard en in Geavanceerde instellingen > Logs. De meest voorkomende oorzaak is een hoofdmap die niet beschrijfbaar is. De vorige sitemaps blijven online.

IndexNow antwoordt 403 of 422

De zoekmachine vindt het sleutelbestand niet of weigert de host. Open de URL van het sleutelbestand in het IndexNow-blok: die moet de sleutel tonen. Controleer ook of het domein van de winkel overeenkomt met dat van de verstuurde URL’s.

Was deze pagina nuttig?

Loopt u nog vast? Neem contact op met support