DF Faceted SEO: facetzoeken en SEO voor PrestaShop
Slimme indexering van facet-URL's, SEO-landingspagina's en een snelle filtermotor voor PrestaShop 8 en 9.
DF Faceted SEO maakt van het facetzoeken in PrestaShop een duurzame SEO-hefboom en versnelt uw categoriepagina’s 10 tot 30 keer dankzij een gedenormaliseerde index. Deze documentatie behandelt de installatie, het instellen van de indexeringsregels, het maken van SEO-landingspagina’s en het benutten van de statistieken over populaire combinaties.
Overzicht
De native module ps_facetedsearch genereert werktuiglijk een URL voor elke mogelijke filtercombinatie. Bij een catalogus van enkele duizenden producten met vijf facetten gaat dat over miljoenen URL’s die Google doorzoekt, waardoor uw crawlbudget en uw PageRank over vrijwel identieke pagina’s worden versnipperd.
DF Faceted SEO lost dat op twee sporen tegelijk op:
- Slimme indexering: bedrijfsregels bepalen welke combinaties indexeerbaar zijn, welke
noindex followkrijgen en waar de canonical naar wijst. - Eigen SEO-landingspagina’s: maak voor uw commercieel sterke combinaties (bijvoorbeeld « rode schoenen maat 42 ») landingspagina’s met een schone URL, H1, meta en per taal aangepaste inhoud.
Als extra vervangt de zoekmotor van de module de native motor door een veel sneller systeem, gebaseerd op een gedenormaliseerde index en een cache met twee niveaus.
Vereisten
- PrestaShop 8.0 tot 9.x
- PHP 8.1 of hoger
- MySQL 5.7 of MariaDB 10.3 minimaal
- Vereenvoudigde URL’s ingeschakeld (Voorkeuren → SEO en URL’s)
- Standaardrechten om MySQL-tabellen aan te maken
Installatie
- Upload het ZIP-archief via Modules → Modulebeheer → Een module uploaden.
- Klik op Installeren. De module maakt automatisch 10 tabellen
ps_dffacetedseo_*en 5 tabbladen onder Verbeteren aan. - Ga naar Verbeteren → DF Faceted SEO → Dashboard.
- Klik op De index opnieuw opbouwen. Deze stap is de eerste keer verplicht: zonder index heeft de zoekmotor van de module geen enkele gegevensbron.
- Leeg de PrestaShop-cache: Geavanceerde parameters → Prestaties → Cache legen.
Op een catalogus van 50 000 producten duurt het opnieuw opbouwen van de index doorgaans 2 tot 5 minuten. De module voegt de regels in batches van 500 in.
Eerste stappen: het dashboard
Het dashboard (Verbeteren → DF Faceted SEO) toont zes statistiektegels:
- Actieve regels: aantal ingeschakelde indexeringsregels
- Landingspagina’s: aantal aangemaakte SEO-landingspagina’s
- Producten in de index: aantal geïndexeerde producten (moet dicht bij het cataloguscijfer liggen)
- Regels in de index: aantal koppels (product, filterwaarde), dat is de gedenormaliseerde tabel
- Vermeldingen in cache: aantal queries in cache
- Populaire combinaties: aantal waargenomen filtercombinaties
Onder de tegels staan twee blokken met bewerkingen:
- De index opnieuw opbouwen: nuttig na een grote catalogusaanpassing (massale import, wijziging van de attribuutstructuur)
- De cache legen: nuttig na een wijziging van regels of parameters
Indexeringsregels
De regels bepalen voor elke bezochte filtercombinatie welke robots-tag en welke canonical naar de browser en naar Google gaan. Een regel heeft een bereik (toepassingsgebied) en een beleid (beslissing).
Beschikbare bereiken
- Globaal: geldt voor alle facetpagina’s van de catalogus
- Specifieke categorie: geldt alleen voor de pagina’s van een bepaalde categorie
- Attribuutgroep: geldt voor combinaties die een bepaalde groep bevatten (bijvoorbeeld alle pagina’s waar op Kleur wordt gefilterd)
- Kenmerk: idem, voor een productkenmerk
- Merk: idem, voor een merk (manufacturer)
- Prijsvork: geldt voor pagina’s die op een bepaalde prijsklasse zijn gefilterd
Beschikbare beleidsregels
- Index, follow: indexeerbare pagina, met een canonical die naar zichzelf in genormaliseerde vorm wijst
- Noindex, follow: pagina niet geïndexeerd, maar de links worden gevolgd (aanbevolen voor zeldzame combinaties)
- Canonical naar de bovenliggende pagina: pagina blijft bereikbaar maar de canonical wijst naar de bovenliggende categorie (de SEO-waarde wordt overgedragen)
- Genormaliseerde canonical naar zichzelf: canonical op de pagina zelf, met de filters gesorteerd en gegroepeerd (verwijdert dubbele URL’s voor dezelfde combinatie)
Prioriteitsketen
De module beoordeelt de regels van de meest specifieke naar de meest algemene. Concreet, voor een pagina van de categorie Schoenen gefilterd op kleur:
- De module zoekt eerst een regel met bereik
categoryop Schoenen - Bestaat die en past die, dan wordt zij toegepast
- Zo niet, zoekt hij een regel met bereik
attribute_groupop Kleur - Zo niet, gaat hij terug naar de globale regel
- Past geen enkele regel, dan geldt het standaardbeleid uit het dashboard
Geavanceerde velden van een regel
- Maximum aantal indexeerbare filters: bevat de combinatie meer filters dan deze limiet, dan gaat het beleid automatisch naar
noindex follow. Bijvoorbeeld: maximaal 2 filters op schoenen (kleur + maat geïndexeerd, maar niet kleur + maat + materiaal + seizoen). - Witte lijst met waarden: toegestane waarde-ID’s (door komma’s gescheiden). Een combinatie die alleen waarden uit de witte lijst bevat, is indexeerbaar. Bijvoorbeeld: rood, zwart, wit en blauw op de witte lijst zetten, zodat zeldzame kleuren als « appelgroen » niet worden geïndexeerd.
- Zwarte lijst met waarden: het omgekeerde. Elke combinatie met een waarde uit de zwarte lijst valt automatisch terug op
noindex. - Minimum aantal producten: levert de combinatie niet minstens dit aantal producten op, dan gaat zij naar
noindex. Dat voorkomt het indexeren van vrijwel lege pagina’s. - Prioriteit: geheel getal. Botsen twee regels met hetzelfde bereik, dan wint de hoogste prioriteit.
Aanbevolen strategie om te beginnen: maak een globale regel met het beleid canonical naar de bovenliggende pagina en maximaal 1 indexeerbaar filter, en voeg daarna geleidelijk specifiekere regels toe om de indexering van kansrijke combinaties open te zetten.
SEO-landingspagina’s
Landingspagina’s zijn pagina’s die aan strategische filtercombinaties zijn gewijd. Ze hebben hun eigen schone URL, hun eigen H1, hun eigen meta en per taal een eigen redactionele inhoud.
Een landingspagina maken
- Ga naar Verbeteren → DF Faceted SEO → Landingspagina’s
- Klik op Toevoegen
- Onderdeel Doelbepaling: kies de categorie en eventueel het betrokken merk
- Onderdeel Weergave: standaardsortering, richting, activering, indexering, prioriteit
- Onderdeel Filtercombinatie: voeg de filters toe die de combinatie vormen (attribuutgroep en waarden, kenmerk of merk). Bijvoorbeeld: Kleur = Rood EN Maat = 42.
- Meertalige tabbladen: vul per taal de interne naam, de URL-slug, de H1, de metatitel, de metabeschrijving en de inleidende en afsluitende inhoud in.
- Sla op
URL-structuur
De URL van een landingspagina volgt dit patroon:
https://uw-domein.nl/landing/uw-slug
https://uw-domein.nl/en/landing/uw-slug
https://uw-domein.nl/nl/landing/uw-slug
Het taalvoorvoegsel wordt automatisch door de router van PrestaShop beheerd zodra de vereenvoudigde URL’s actief zijn en er meerdere talen op de winkel actief staan.
Krijgt u een 404 op de URL van een landingspagina, controleer dan in deze volgorde: vereenvoudigde URL’s ingeschakeld, .htaccess opnieuw gegenereerd (knop Opslaan onder aan SEO en URL’s), cache geleegd, landingspagina actief in het formulier, en de hook moduleRoutes wel degelijk aan de module gekoppeld in Modules → Posities.
Redactionele inhoud
Per taal beschikt u over twee rijke HTML-blokken:
- Inleiding: getoond boven het productraster. Ideaal voor een SEO-inleiding van 150 tot 300 woorden met uw doelzoekwoorden.
- Afsluiting: getoond onder het raster. Ideaal voor vertrouwenwekkende elementen, koopgidsen of FAQ’s.
Automatische JSON-LD
Elke landingspagina injecteert automatisch twee JSON-LD-blokken in de pagina:
- BreadcrumbList: Startpagina → Categorie → Landingspagina
- Product: één Product-blok per getoond product (naam, prijs, afbeelding, URL, beschikbaarheid)
Zo krijgt u automatisch de rich snippets van Google, zonder extra configuratie.
Statistieken over populaire combinaties
De module legt automatisch in de tabel ps_dffacetedseo_combination_log elke filtercombinatie vast die uw klanten daadwerkelijk bezoeken: handtekening, aantal hits en laatste bezoek.
De statistieken benutten
- Ga naar Verbeteren → DF Faceted SEO → Statistieken
- Filter op categorie, minimaal aantal hits en weergavelimiet
- Sorteer op aflopend aantal hits
- Spot de combinaties met meer dan 50 hits per week
- Klik op Promoten in de actiekolom
- Het formulier voor de landingspagina opent vooraf ingevuld met de filtercombinatie
- U hoeft alleen nog de redactionele inhoud in te vullen en op te slaan
Onderhoud
Onder aan de statistiekpagina staat een knop Oude gegevens opruimen met een veld « te bewaren dagen ». Aanbevolen: elke 90 dagen opruimen om onbeperkte groei van de tabel te vermijden.
Globale parameters
Het dashboard biedt 11 globale parameters, gegroepeerd in 3 secties.
Indexering
- Standaardbeleid: het beleid dat geldt wanneer geen enkele regel past
- Maximum aantal indexeerbare filters: globale waarde (per regel te overschrijven)
- Minimum aantal producten per combinatie: globale drempel om een pagina indexeerbaar te achten
Prestaties
- TTL van de cache (seconden): levensduur van een vermelding in de cache. Standaard 3600 (1 uur). Verhoog naar 86400 (24 uur) in een stabiele productieomgeving.
- Lege filters verbergen: staat dit aan, dan worden waarden met 0 resultaten in het filterpaneel verborgen
- Resultatenlimiet per pagina: paginering van de producten
URL’s
- Voorvoegsel van de landings-URL’s: standaard
landing. Het routepatroon staat vast in de hookmoduleRoutesvan de module en gebruikt dit voorvoegsel.
Slimme canonical
Op elke facetpagina berekent de module de optimale canonical:
- Combinatie die met een bestaande landingspagina overeenkomt: canonical = de nette URL van die landingspagina
- Combinatie die volgens de regels indexeerbaar is: canonical = genormaliseerd naar zichzelf (filters gesorteerd en gegroepeerd)
- Combinatie die volgens de regels niet indexeerbaar is: canonical = de bovenliggende categorie
- Categoriepagina zonder filter: canonical = standaard naar zichzelf
De normalisatie groepeert de waarden per groep en sorteert de groepen op ID. Twee URL’s die er verschillend uitzien maar semantisch identiek zijn (bijvoorbeeld met een andere volgorde van GET-parameters) krijgen dezelfde canonical.
Snelle filtermotor
De motor steunt op de tabel ps_dffacetedseo_index: één regel per koppel (product, filtertype, waarde). Het zoeken wordt zo een doorsnede van verzamelingen product-ID’s.
Cache met twee niveaus
- Niveau 1: geheugen (in-process). Voorkomt dat dezelfde query twee keer binnen dezelfde pagina wordt uitgevoerd.
- Niveau 2: database (tabel
ps_dffacetedseo_cache). Bewaart de resultaten tussen verzoeken door, met een TTL.
Automatische invalidatie
De module luistert naar de hooks actionProductSave, actionProductDelete en actionCategoryUpdate. Telkens als een product wordt opgeslagen, wordt zijn vermelding in de index opnieuw opgebouwd en worden alle cachevermeldingen die met dat product te maken hebben ongeldig gemaakt.
AJAX en gebruikservaring
Het filterpaneel aan de frontzijde werkt volledig op AJAX:
- Debounce van 250 ms bij filterwijzigingen
pushStateom de URL bij te werken zonder de pagina te herladen- Realtime bijwerken van de
canonical– enrobots-tags in de head van het document - Vloeiend scrollen naar het productraster na een update
- Aanklikbare labels voor actieve filters om er één afzonderlijk te verwijderen
- Prijsschuifregelaar met numerieke velden en een knop Toepassen
- Zichtbare kleurstalen op attributen van het type Kleur
Multistore en meertaligheid
De module is van nature multistore en meertalig:
- Elke landingspagina heeft vertalingen per taal (tabel
ps_dffacetedseo_landing_page_lang) - Elke landingspagina kan tot een of meer winkels worden beperkt (tabel
ps_dffacetedseo_landing_page_shop) - De indexeringsregels gelden standaard voor alle winkels
- De index is per winkel gepartitioneerd
- De vertalingen van de interface worden in het Frans en het Engels geleverd (XLIFF in
translations/)
Technische architectuur
Gebruikte hooks
displayHeader: dynamische canonical en meta robotsactionFrontControllerSetMedia: CSS en JS aan de frontzijdemoduleRoutes: nette route voor de landingspagina’sdisplayLeftColumn: injectie van het filterpaneeldisplayBeforeBodyClosingTag: JSON-LD op de landingspagina’sactionProductSearchProviderRunQuery: integratie met de motor van PrestaShopactionProductSaveenactionProductDelete: incrementele herindexeringactionCategoryUpdate: invalidatie van de categoriecachedisplayBackOfficeHeader: CSS en JS in de backoffice
Aangemaakte tabellen
| Tabel | Rol |
|---|---|
dffacetedseo_rule |
Indexeringsregels per bereik |
dffacetedseo_landing_page |
Landingspagina’s (bedrijfsgegevens) |
dffacetedseo_landing_page_lang |
Vertalingen van de landingspagina’s |
dffacetedseo_landing_page_shop |
Multistore-koppelingen |
dffacetedseo_landing_filter |
Filters gekoppeld aan de landingspagina’s |
dffacetedseo_combination_log |
Bezoekstatistieken |
dffacetedseo_cache |
Cache met queryresultaten |
dffacetedseo_filter_template |
Herbruikbare filtersjablonen |
dffacetedseo_index |
Gedenormaliseerde index (sleutel tot de prestaties) |
dffacetedseo_setting |
Interne parameters |
URL-conventie van de filters
?attribute_group__{id_group}=v1,v2&feature__{id_feature}=v3&manufacturer__0=5&price=10-50&s=needle
Er wordt een stabiele SHA-1-handtekening berekend om combinaties te vergelijken (matchen met landingspagina’s, cachesleutel, logboek).
Verwachte prestaties
Metingen op een referentiecatalogus (50 000 producten, 8 actieve facetten):
| Motor | Gemiddelde tijd |
|---|---|
native ps_facetedsearch |
800 ms tot 1,4 s per query |
| DF Faceted SEO zonder cache | 50 tot 120 ms |
| DF Faceted SEO met cache | minder dan 10 ms |
Typische winst: ×10 tot ×30
Technische FAQ
Moet ps_facetedsearch verwijderd worden
Nee, de module integreert via de officiële hooks. U kunt hem parallel testen. Eenmaal gevalideerd verwijdert u ps_facetedsearch om een dubbel filterpaneel te vermijden.
Werkt de module met HTTPS en absolute canonical-URL’s
Ja. De module gebruikt Context::getContext()->link->getPageLink() en getModuleLink(), die de HTTPS-configuratie van PrestaShop volgen.
Hoe voeg ik een nieuwe taal aan de module toe
Kopieer het bestand translations/fr-FR.xlf naar translations/xx-XX.xlf en vertaal de trans-unit-elementen. Verder is er niets nodig.
Ondersteunt de module samengestelde attributen (attribuutcombinaties)
Ja. De gedenormaliseerde index indexeert de varianten via hun attributen. De zoekmotor filtert op producten waarvan minstens één variant aan alle actieve filters voldoet.
Hoe debug ik een regel die niet wordt toegepast
Zet de PrestaShop-logboeken aan (Geavanceerde parameters → Logboeken) en bekijk de sectie dffacetedseo. Elke beslissing logt de toegepaste regel en de reden.
Problemen oplossen
Fatal error bij een aanroep van getBySlug
Symptoom: Call to a member function getBySlug() on false. Oorzaak: een oude helper get() die false teruggaf in plaats van het serviceobject. Verholpen in v1.0.1. Werk de module bij.
404 op de URL van een landingspagina
Symptoom: https://uw-site/en/landing/uw-slug geeft een 404. Gebruikelijke oorzaak: de hook moduleRoutes is niet geregistreerd of de routecache van PrestaShop is verouderd.
- Controleer of Voorkeuren → SEO en URL’s → Vereenvoudigde URL’s inschakelen op JA staat
- Sla die pagina op (dat genereert de
.htaccessopnieuw) - Leeg de PrestaShop-cache twee keer
- Ga naar Modules → Posities en controleer of
dffacetedseoaanmoduleRouteshangt - Testalternatief:
https://uw-site/index.php?fc=module&module=dffacetedseo&controller=landing&slug=uw-slug
De zoekmotor geeft geen enkel product terug
De index is waarschijnlijk leeg. Ga naar het dashboard en klik op De index opnieuw opbouwen.
De filters verschijnen niet in de kolom
Controleer in Modules → Posities of dffacetedseo aan de hook displayLeftColumn hangt. Afhankelijk van uw thema kunt u die ook aan displayRightColumn of displayHome koppelen.
Tragere prestaties na een massale productimport
De incrementele invalidatie werkt goed voor losse wijzigingen. Na een massale import is het sneller om de hele index vanaf het dashboard opnieuw op te bouwen en de cache te legen.
Updates
De module volgt een versienummering MAJOR.MINOR.PATCH. Kritieke correcties (beveiliging, fatale fouten) komen als patch; nieuwe functies verhogen het minor-nummer. Elke grote update bevat een script upgrade/upgrade-X.Y.Z.php dat bij de installatie van de nieuwe versie automatisch draait.
Ondersteuning
Voor vragen of bugmeldingen kunt u terecht bij support@datafirefly.com, met vermelding van uw PrestaShop-versie, PHP-versie, moduleversie en de PHP- en PrestaShop-logboeken.