# DF Faceted SEO: facetzoeken en SEO voor PrestaShop

> 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…

- Pagina: <https://www.datafirefly.com/nl/documentation/dffacetedseo/>
- Taal: nl
- Bijgewerkt op: 2026-09-09
- Andere talen: [fr](https://www.datafirefly.com/documentation/dffacetedseo/index.md), [en](https://www.datafirefly.com/en/documentation/dffacetedseo/index.md), [es](https://www.datafirefly.com/es/documentation/dffacetedseo/index.md), [de](https://www.datafirefly.com/de/documentation/dffacetedseo/index.md), [it](https://www.datafirefly.com/it/documentation/dffacetedseo/index.md), [pl](https://www.datafirefly.com/pl/documentation/dffacetedseo/index.md), [pt](https://www.datafirefly.com/pt/documentation/dffacetedseo/index.md)
- Index: <https://www.datafirefly.com/nl/documentation/llms.txt>

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 follow` krijgen 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

1. Upload het ZIP-archief via _Modules → Modulebeheer → Een module uploaden_.
2. Klik op **Installeren**. De module maakt automatisch 10 tabellen `ps_dffacetedseo_*` en 5 tabbladen onder _Verbeteren_ aan.
3. Ga naar _Verbeteren → DF Faceted SEO → Dashboard_.
4. Klik op **De index opnieuw opbouwen**. _Deze stap is de eerste keer verplicht_: zonder index heeft de zoekmotor van de module geen enkele gegevensbron.
5. 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:

1. De module zoekt eerst een regel met bereik `category` op Schoenen
2. Bestaat die en past die, dan wordt zij toegepast
3. Zo niet, zoekt hij een regel met bereik `attribute_group` op Kleur
4. Zo niet, gaat hij terug naar de globale regel
5. 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

1. Ga naar _Verbeteren → DF Faceted SEO → Landingspagina's_
2. Klik op **Toevoegen**
3. Onderdeel **Doelbepaling**: kies de categorie en eventueel het betrokken merk
4. Onderdeel **Weergave**: standaardsortering, richting, activering, indexering, prioriteit
5. Onderdeel **Filtercombinatie**: voeg de filters toe die de combinatie vormen (attribuutgroep en waarden, kenmerk of merk). Bijvoorbeeld: Kleur = Rood EN Maat = 42.
6. Meertalige tabbladen: vul per taal de interne naam, de URL-slug, de H1, de metatitel, de metabeschrijving en de inleidende en afsluitende inhoud in.
7. 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

1. Ga naar _Verbeteren → DF Faceted SEO → Statistieken_
2. Filter op categorie, minimaal aantal hits en weergavelimiet
3. Sorteer op aflopend aantal hits
4. Spot de combinaties met meer dan 50 hits per week
5. Klik op **Promoten** in de actiekolom
6. Het formulier voor de landingspagina opent **vooraf ingevuld** met de filtercombinatie
7. 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 hook `moduleRoutes` van 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
- `pushState` om de URL bij te werken zonder de pagina te herladen
- Realtime bijwerken van de `canonical`- en `robots`-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 robots
- `actionFrontControllerSetMedia`: CSS en JS aan de frontzijde
- `moduleRoutes`: nette route voor de landingspagina's
- `displayLeftColumn`: injectie van het filterpaneel
- `displayBeforeBodyClosingTag`: JSON-LD op de landingspagina's
- `actionProductSearchProviderRunQuery`: integratie met de motor van PrestaShop
- `actionProductSave` en `actionProductDelete`: incrementele herindexering
- `actionCategoryUpdate`: invalidatie van de categoriecache
- `displayBackOfficeHeader`: 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.

1. Controleer of _Voorkeuren → SEO en URL's → Vereenvoudigde URL's inschakelen_ op JA staat
2. Sla die pagina op (dat genereert de `.htaccess` opnieuw)
3. Leeg de PrestaShop-cache twee keer
4. Ga naar _Modules → Posities_ en controleer of `dffacetedseo` aan `moduleRoutes` hangt
5. 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](mailto:support@datafirefly.com), met vermelding van uw PrestaShop-versie, PHP-versie, moduleversie en de PHP- en PrestaShop-logboeken.
