# DataFirefly All in One SEO: volledige gids

> Volledige documentatie van de module DataFirefly All in One SEO voor PrestaShop 8 en 9: installatie, metatemplates, JSON-LD-schema's, XML-sitemap, redirects, 404-monitoring, robots.txt, GA4/GTM-tracking, contentanalyzer.

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

Premium alles-in-één SEO-suite voor PrestaShop 8 en 9: dynamische metatemplates, volledige JSON-LD-schema's, meertalige XML-sitemap, redirects, 404-monitoring, Open Graph en Twitter Cards, GA4 en GTM, slimme robots.txt met blokkering van AI-crawlers en een contentanalyzer — alles in één module.

## Vereisten

- **PrestaShop**: 8.0 tot 9.x
- **PHP**: 8.1 of hoger (8.2 en 8.3 aanbevolen)
- **MySQL**: 5.7+ of MariaDB 10.3+
- **Module productcomments** (officieel PrestaShop): optioneel, alleen vereist voor AggregateRating op de producten
- **mod_rewrite** ingeschakeld op de Apache-server (of Nginx-equivalent) voor de herschreven URL's

De module is native multistore-bewust: alle tabellen zijn gescopet op `id_shop`. U kunt per winkel volledig verschillende configuraties hebben.

## Installatie

1. Download het bestand `dfallinoneseo-vX.Y.Z.zip` vanuit uw DataFirefly-klantaccount.
2. Log in op uw PrestaShop back-office.
3. Ga naar **Modules → Module Manager**.
4. Klik rechtsboven op **Een module installeren**.
5. Sleep het ZIP-bestand erin of klik op **Een bestand selecteren**.
6. De installatie maakt automatisch de 11 SQL-tabellen aan, registreert de hooks en voegt het menu **Verbeteren → DataFirefly SEO** toe.

Open na de installatie het **Dashboard** van de module voor een overzicht van de globale SEO-score en de eerst te corrigeren punten.

## Eerste configuratie in 10 minuten

Deze snelle route laat u het essentiële configureren vóór de eerste Google-crawl.

1. **Instellingen → Algemeen**: schakel de module in, vul de sitenaam en het label "Home" voor het broodkruimelpad in.
2. **Meta & templates**: definieer minimaal een template _Product_ en een template _Categorie_ (zie de aparte sectie).
3. **Schema → Identiteit van de organisatie**: vul logo, telefoon, e-mail, adres en de URL's van de sociale netwerken (`sameAs`) in.
4. **Sitemap**: schakel de sitemap in en klik op **Nu regenereren**.
5. **Tracking**: voeg uw GA4 Measurement ID en/of GTM ID toe.
6. **Tracking → Verificaties**: plak de verificatiewaarde van Google Search Console.
7. **Robots.txt**: klik op **Standaardwaarden laden (PS + AI-blokkering)** om van een gezonde basis te vertrekken.

## Metatemplates

De module vervangt het handmatig invoeren van `meta_title` en `meta_description` door dynamische templates per entiteitstype. Bij het opslaan van een fiche waarvan de meta leeg zijn, wordt het bijbehorende template automatisch toegepast.

### Ondersteunde entiteitstypes

- **Product**: productfiches (alle types, inclusief virtuele producten en packs)
- **Categorie**: categoriepagina's
- **CMS-pagina**: statische inhoudspagina's
- **Merk / Fabrikant**: fabrikantpagina's
- **Leverancier**: leverancierspagina's
- **Home**: homepage van de winkel
- **Generieke pagina's**: `/contact`, `/sitemap`, enzovoort

### Beschikbare tokens

De tokens worden bij het renderen van de pagina vervangen door de werkelijke waarden. Niet alle tokens zijn op elk entiteitstype beschikbaar.

- `{shop_name}` — naam van de winkel
- `{sep}` — scheidingsteken (standaard `|`)
- `{product_name}` — productnaam (huidige taal)
- `{product_reference}` — interne referentie
- `{product_sku}` — alias van de referentie
- `{product_ean13}` — EAN13-barcode
- `{product_brand}`, `{brand}` — merk/fabrikant
- `{category}` — standaardcategorie (product) of categorienaam (categoriepagina)
- `{category_parent}` — naam van de bovenliggende categorie
- `{category_description}` — korte beschrijving (max. 160 tekens)
- `{short_description}` — korte productbeschrijving (max. 160 tekens)
- `{price}` — geformatteerde prijs incl. btw met valuta
- `{price_tax_excl}` — geformatteerde prijs excl. btw
- `{title}` — titel van de CMS-pagina
- `{summary}` — uittreksel van de CMS-inhoud (max. 160 tekens)

### Voorwaardelijke blokken

Gebruik om geen leeg token te tonen de voorwaardelijke syntaxis:

```
{?product_brand}{product_brand} | {/?}{product_name} - {shop_name}
```

Is `product_brand` leeg (product zonder merk), dan wordt het hele blok tussen `{?token}` en `{/?}` verwijderd. Anders wordt de inhoud gerenderd en worden de tokens erin normaal vervangen.

### Aanbevolen voorbeeldtemplates

**Product**:

```
Title : {?product_brand}{product_brand} {/?}{product_name} - {category} | {shop_name}
Description : Ontdek {product_name}{?product_brand} van {product_brand}{/?}. {short_description} Snelle levering bij {shop_name}.
```

**Categorie**:

```
Title : {category} - {?category_parent}{category_parent} - {/?}{shop_name}
Description : Alle producten uit de categorie {category} bij {shop_name}. {category_description}
```

**Home**:

```
Title : {shop_name} - Online winkel
Description : Welkom bij {shop_name}. Ontdek onze catalogus, snelle levering, veilig betalen.
```

### Override per entiteit

Om een specifieke fiche te overschrijven (bijvoorbeeld een topproduct), klikt u op het icoon **Meta-override** in het menu **Bulkbewerking** of gebruikt u de URL:

```
?controller=AdminDfSeoMeta&entity=product&entity_id=42
```

De overridepagina laat toe per taal `meta_title`, `meta_description`, de robots-directive (bijvoorbeeld `noindex,follow`) en een custom canonical te definiëren.

De robots-directive op een specifieke entiteit heeft voorrang op de globale indexeringsinstellingen. Gebruik haar spaarzaam om niet per ongeluk uw beste pagina's te de-indexeren.

## JSON-LD-schema's

De module genereert één enkel `@graph`-blok dat alle schema's van de huidige pagina bundelt, gevalideerd met de Google Rich Results Test.

### Automatisch gegenereerde schema's

- **Organization** — op alle pagina's, identiteit van het bedrijf
- **WebSite** — op de homepage, met `SearchAction` om de sitelinks search box te activeren
- **LocalBusiness** — als een fysiek adres is ingevuld
- **BreadcrumbList** — broodkruimelpad
- **Product** — op de productfiches, met `offers`, `priceValidUntil`, `gtin13`/`isbn`/`mpn`
- **AggregateRating** — geaggregeerd vanuit de officiële productcomments-module
- **Article** — op de CMS-pagina's
- **FAQPage** — vanuit de FAQ-blokken van product of pagina

### Identiteit van de organisatie

Tabblad **Schema → Identiteit van de organisatie**. In te vullen velden:

- **Type**: Organization, Corporation, LocalBusiness, Store, OnlineStore, OnlineBusiness
- **Logo**: absolute URL (aanbevolen minimaal 600x60, vierkante of liggende verhouding)
- **Telefoon**, **E-mail**: gebruikt in `contactPoint`
- **Postadres**: straat, postcode, plaats, land (ISO-2)
- **sameAs**: één URL per regel (Facebook, Instagram, LinkedIn, Twitter/X, enzovoort)

### Geldigheid van de productaanbiedingen

Het veld _Geldigheid van de productaanbiedingen (dagen)_ bepaalt de waarde van `priceValidUntil` in `Product.offers`. Standaard: 60 dagen. Google vereist dit veld om de prijs in de rich results te tonen.

### Aangepaste schema's

Tabblad **Schema → Aangepaste schema's**. Laat toe JSON-LD-blokken op maat toe te voegen (HowTo, Recipe, Event, JobPosting, VideoObject, Course, enzovoort) op een precies bereik:

- **global**: alle pagina's
- **home**: alleen de homepage
- **product**: alle productpagina's
- **product_id**: één specifiek product (gebruikt het ID-veld)
- **category**, **category_id**: idem categorie
- **cms**, **cms_id**: idem CMS-pagina

Beschikbare variabelen in de aangepaste JSON: `{shop_name}`, `{base_url}`, `{entity_id}`, `{entity_type}`.

De aangepaste JSON-LD wordt ongewijzigd in de `@graph` ingevoegd. Valideer haar vóór publicatie met de [Rich Results Test](https://search.google.com/test/rich-results). Ongeldige JSON wordt stilzwijgend geweigerd.

## XML-sitemap

De module genereert een XML-sitemap conform de [sitemaps.org-specificatie](https://www.sitemaps.org/protocol.html), met hreflang op elke URL en ondersteuning voor afbeeldingen. Architectuur: één _sitemap-index_ per winkel, dan één sitemap per entiteitstype × taal, opgedeeld in chunks.

### Configuratie

Tabblad **Sitemap**. Schakel de sitemap in en vink de op te nemen inhoud aan:

- Producten (standaard alle actieve producten)
- Categorieën
- CMS-pagina's
- Merken / Fabrikanten
- Leveranciers
- Afbeeldingen (voegt `image:image` toe aan elke product-URL)
- Video's (indien aanwezig in de fiches)

Extra opties:

- **Uitverkochte producten uitsluiten**: verwijdert out-of-stock producten
- **Gzip**: genereert ook de `.xml.gz`-varianten (verkleint de door crawlers gedownloade grootte 5 tot 10 keer)
- **URL's per bestand**: chunkgrootte (aanbevolen 5000-10000, max. 50000 volgens de XML-spec)

### Regeneratie

De regeneratie is handmatig vanuit de admin om onverwachte serverbelasting te vermijden. Klik op **Nu regenereren**.

Plan voor automatisering een cron die het volgende script aanroept (elke 6 of 12 uur, afhankelijk van de updatefrequentie van uw catalogus):

```
0 */6 * * * php /var/www/html/index.php fc=module&module=dfallinoneseo&controller=sitemap&action=rebuild
```

### Indienen bij de zoekmachines

Klik op **De zoekmachines pingen** om Google en Bing te notificeren (legacy endpoints maar nog steeds actief). Dien voor Google Search Console de URL van de sitemap-index eenmalig in via GSC → Sitemaps. GSC crawlt automatisch opnieuw bij elke wijziging.

URL van de sitemap-index: `https://uw-winkel.com/sitemap.xml`

## Publieke HTML-sitemap

Een voor mensen leesbare HTML-sitemap wordt automatisch gegenereerd op `/plan-du-site`. Ze bundelt categorieën (boomstructuur), CMS-pagina's, merken, leveranciers en de 200 laatste producten. Nuttig voor de interne linking en de toegankelijkheid.

## Redirects

De module beheert HTTP-redirects 301 (permanent), 302 (tijdelijk), 307, 308 en 410 (Gone) met drie matchtypes.

### Matchtypes

- **Exact**: de bron-URL moet exact overeenkomen (zonder query string)
- **Prefix**: de bron-URL is een voorvoegsel van de gevraagde URL. Het achtervoegsel wordt in de bestemming behouden als _Query string behouden_ is aangevinkt. Nuttig om hele mappen te migreren (`/oude-map/` → `/nieuwe-map/`).
- **Regex**: reguliere PHP-expressie (modus `~...~i` hoofdlettergevoelig/-ongevoelig). De capturegroepen zijn in de bestemming beschikbaar via `$1`, `$2`, enzovoort.

### Handmatig aanmaken

Tabblad **Redirects → Nieuwe redirect**. Velden:

- **Bron-URL**: pad zonder domein (bijv. `/oude-pagina`)
- **Bestemmings-URL**: pad of absolute URL. Leeg laten voor een 410-code.
- **Matchtype**, **HTTP-code**, **Query string behouden**

### CSV-import / -export

Verwacht CSV-formaat (met header):

```
source,destination,type,code
/oud-product,/nieuw-product,exact,301
/oude-map/,/nieuwe-map/,prefix,301
/old-(.*),/new-$1,regex,301
```

De CSV-export neemt de op dat moment in de lijst gefilterde redirects over.

### Automatische redirect bij slugwijziging

Is de optie **Instellingen → Monitoring → Automatische 301-redirect bij URL-wijziging** aangevinkt, dan maakt de module automatisch een 301 aan wanneer u de slug van een product, categorie, CMS-pagina, merk of leverancier wijzigt. De `created_by` wordt dan gemarkeerd als `auto:urlchange` ter onderscheiding.

Deze optie voorkomt de meerderheid van de klassieke SEO-404's bij contentherzieningen. Schakel haar meteen bij de installatie in.

## 404-monitoring

Tabblad **Monitor 404**. Vangt alle door PrestaShop geserveerde 404-URL's op, met ontdubbeling, hittelling, botdetectie en hashing van de IP-adressen (salt `COOKIE_KEY` van PrestaShop voor AVG-conformiteit).

### Beschikbare filters

- **Onopgelost**: URL's zonder dekkende redirect (standaardweergave)
- **Opgelost**: URL's waarvoor achteraf een redirect is aangemaakt
- **Bots**: hits van user-agents die als bots zijn herkend
- **Alle**

### Een redirect aanmaken in één klik

Op elke regel opent de knop **Redirecten** een inline formulier dat de bron voorinvult. Voer de bestemming in, kies de HTTP-code, bevestig. De 404 wordt automatisch als opgelost gemarkeerd.

### Opschoning en onderhoud

Het menu **Instellingen → Monitoring** biedt een drempel _Maximumaantal bewaarde 404-vermeldingen_ (standaard 5000). Daarboven verwijdert de knop **Oude 404's opschonen** de oudste onopgeloste vermeldingen.

## Dynamische robots.txt

De module serveert een bij elk verzoek dynamisch gegenereerd bestand `/robots.txt`, gebaseerd op de regels in **Robots.txt**.

### PrestaShop-presets + AI-blokkering

De knop **Standaardwaarden laden (PS + AI-blokkering)** overschrijft alle huidige regels en laadt een gezonde preset die:

- De gevoelige PrestaShop-mappen blokkeert (`/admin*/`, `/cache/`, `/classes/`, enzovoort)
- De technische pagina's blokkeert (`/cart`, `/order`, `/my-account`, enzovoort)
- De belangrijkste niet-respectvolle AI-crawlers blokkeert: **GPTBot**, **ClaudeBot**, **CCBot**, **Google-Extended**, **anthropic-ai**
- Naar de sitemap verwijst (`Sitemap: /sitemap.xml`)

### Aangepaste regels

Elke regel heeft een user-agent, een directive (`Allow`, `Disallow`, `Crawl-delay`), een waarde en een positie (volgorde in het bestand). Schakel een regel in of uit zonder haar te verwijderen via de ON/OFF-knop.

### Live voorbeeld

Het blok **Voorbeeld van het gegenereerde bestand** onderaan de pagina rendert de robots.txt zoals hij zal worden geserveerd, vóór publicatie.

## Native llms.txt-bestand

De module serveert een bestand `/llms.txt` conform de [llmstxt.org-specificatie](https://llmstxt.org/). Dit bestand somt, in markdown, de hoofdsecties van de site op voor respectvolle AI-crawlers die een gestructureerd overzicht willen in plaats van de volledige HTML te scrapen.

Er is geen enkele configuratie vereist — de module genereert het bestand automatisch vanuit uw categorieboom, CMS-pagina's en merken.

## Open Graph en Twitter Cards

Tabblad **Social**. De module injecteert de tags `og:*` en `twitter:*` op alle pagina's.

### Instellingen

- **Open Graph en Twitter Cards inschakelen**: hoofdschakelaar
- **Automatische og:locale**: berekend vanuit de contexttaal (bijv. `nl_NL`)
- **Standaard OG-afbeelding**: absolute URL van een afbeelding van 1200×630 (gebruikt wanneer de pagina geen eigen afbeelding heeft)
- **og:site_name**, standaard **og:type**
- **Twitter @handle** en kaarttype (`summary` of `summary_large_image`)
- **fb:app_id**: Facebook App ID

Voor de productfiches gebruikt de module automatisch de hoofdafbeelding van de fiche. Voor de andere pagina's wordt de standaard OG-afbeelding gebruikt als geen afbeelding is gedefinieerd.

## Tracking: GA4, GTM, pixels

### GA4 en Enhanced Ecommerce

Veld **GA4 Measurement ID**: formaat `G-XXXXXXXXXX`. Automatische formaatvalidatie.

Vink **Enhanced Ecommerce** aan om de events `view_item`, `view_item_list`, `add_to_cart`, `remove_from_cart`, `begin_checkout`, `add_payment_info`, `purchase` te activeren.

Vink **Consent Mode v2 respecteren** aan om de hits te anonimiseren tot de expliciete toestemming (compatibel met de standaard-CMP's).

### Google Tag Manager

Veld **GTM ID**: formaat `GTM-XXXXXXX`. De module injecteert het GTM-snippet in de `head` en de `noscript`-fallback direct na de opening van de `body`.

### Advertentiepixels

- **Facebook Pixel ID**: 15 cijfers
- **TikTok Pixel ID**: alfanumeriek

Is Consent Mode v2 actief, dan worden deze pixels pas na toestemming geactiveerd.

### Eigendomsverificaties

Plak de waarden van de verificatietags (zonder de volledige `meta`-tag, alleen de inhoud van het `content`-attribuut):

- Google Search Console
- Bing Webmaster Tools
- Yandex Webmaster
- Pinterest
- Baidu

### Aangepaste code in head en body-end

Twee vrije velden accepteren willekeurige HTML/JS:

- **Code geïnjecteerd in de head**: voor scripts van derden, aanvullende meta
- **Code geïnjecteerd vlak vóór het sluiten van de body**: ideaal voor chatwidgets, late retargeting, asynchrone scripts

Deze velden voeren geen enkele validatie uit. Een HTML-syntaxfout kan de weergave van de pagina breken. Test in pre-productie vóór publicatie.

## Contentanalyzer

Tabblad **Analyzer**. Leg een product, een categorie, een CMS-pagina of ruwe HTML voor aan de analyzer voor een globale SEO-score en een detail van de metrieken.

### Berekende metrieken

- **Globale SEO-score** (0-100) — gewogen weging van de checks
- **Flesch-leesbaarheid** — meertalige benadering (lettergreeptelling per klinkergroep)
- **Aantal woorden**, **aantal zinnen**
- **Dichtheid van het hoofdtrefwoord** (in %)
- **Interne / externe / nofollow-links**
- **Afbeeldingen zonder alt-attribuut**
- **Structuur van de koppen H1 tot H6**
- Aanwezigheid van het trefwoord in **slug** en **eerste alinea**

### Checks

De analyzer geeft een lijst checks terug met status `good` / `warn` / `bad`:

- Lengte van de title (50-60 tekens)
- Lengte van de meta description (140-160 tekens)
- Aanwezigheid en lengte van de slug
- Lengte van de body (minimaal 300 woorden)
- Aanwezigheid van minstens één afbeelding met alt
- Trefwoord in de title, in de eerste alinea, in de slug
- Trefwoorddichtheid tussen 0,5% en 2,5%
- Minstens één H1 en meerdere H2/H3

De analyzer is een gids, geen absolute waarheid. Een score van 80+ is uitstekend. Onder de 50 herziet u de structuur en de formulering. Offer nooit redactionele kwaliteit op voor een score.

## Bulkbewerking

Tabblad **Bulkbewerking**. Gepagineerd raster (30 vermeldingen/pagina) met filters om snel `meta_title`, `meta_description` en `link_rewrite` te wijzigen op producten, categorieën of CMS-pagina's.

### Beschikbare filters

- **Alle**
- **Zonder title**: alleen vermeldingen met lege meta_title
- **Zonder description**: alleen vermeldingen met lege meta_description
- **Zoeken op naam**

### Templates in bulk toepassen

De knop **Templates toepassen** past automatisch het voor het huidige entiteitstype gedefinieerde template toe op de fiches die aan de filters voldoen. Vink **Alleen op lege velden toepassen** aan om al ingevoerde meta niet te overschrijven.

## SEO-metabox op de productfiche

Op de bewerkingspagina van een product in de back-office wordt een kader **DataFirefly SEO** toegevoegd met:

- Een **live SEO-score** (7 checks: lengte title, description, slug, body, afbeelding, EAN13, merk)
- Een getrouw gerenderd **Google SERP-voorbeeld**
- Het gedetecteerde hoofdtrefwoord

## Geavanceerde instellingen

### Indexering

Tabblad **Instellingen → Indexering**:

- **Meertalige hreflang**: genereert de tags `link rel="alternate"` op alle pagina's
- **x-default-strategie**: _Standaardtaal_ (aanbevolen), _Engels_, of _Uitgeschakeld_
- **Canonical URL**: injecteert `link rel="canonical"`
- **Canonical op de paginering**: _Op de huidige pagina_ (aanbevolen), _Altijd op pagina 1_, of _Geen canonical_
- **Automatische noindex**: pagina's /search, winkelwagen, mijn account, nieuwigheden, bestsellers, promoties, facetten
- **Canonical naar de moederpagina op facetten**: voorkomt duplicate content van de facetnavigatie

### Afbeeldingen

- **Automatische generatie van alt-attributen**: past bij het opslaan van een afbeelding zonder alt het template toe
- **Alt-template**: standaard `{product_name} - {shop_name}`
- **Native lazyload van afbeeldingen**: voegt `loading="lazy"` en `decoding="async"` toe aan alle afbeeldingen, met IntersectionObserver-fallback voor `data-src`-afbeeldingen

### Onderhoud

- **Cache legen**: schoont de Smarty-cache + PrestaShop-cache op
- **Oude 404's opschonen**: past de geconfigureerde drempel toe
- **Alle gegevens exporteren (JSON)**: downloadt een JSON-bestand met alle SEO-tabellen van de huidige winkel (nuttig voor migratie tussen omgevingen of back-up vóór deïnstallatie)

## Multistore

Alle functies zijn gescopet op `id_shop`. Door via de PrestaShop-contextkiezer van winkel te wisselen, ziet en wijzigt u alleen de gegevens van die winkel.

Bijzondere gevallen om te kennen:

- **Templates**: één template per paar (entiteitstype, winkel). Definieer de templates expliciet voor elke winkel.
- **Sitemap**: een aparte sitemap_index per winkel, bereikbaar op `https://winkel-1.com/sitemap.xml`, `https://winkel-2.com/sitemap.xml`, enzovoort.
- **Robots.txt**: regels per winkel, geserveerd op het bijbehorende domein
- **Redirects**: per winkel
- **Aangepaste schema's**: per winkel

## Probleemoplossing

### De sitemap wordt niet gegenereerd

- Controleer of de map `modules/dfallinoneseo/sitemaps/` door PHP beschrijfbaar is
- Controleer de rechten: `chmod 755 modules/dfallinoneseo/sitemaps/`
- Verhoog `max_execution_time` in php.ini als u meer dan 50.000 producten hebt

### De JSON-LD-schema's verschijnen niet

- Controleer of de module is ingeschakeld (**Instellingen → Algemeen**)
- Controleer of het betreffende schematype is ingeschakeld (**Schema → Gegenereerde schematypes**)
- Leeg de PrestaShop-cache
- Inspecteer de HTML-broncode: de schema's worden geïnjecteerd in een blok `script type="application/ld+json"`

### De 301-redirects werken niet

- Controleer of de module is geïnstalleerd en ingeschakeld
- Controleer of de redirects als **actief** zijn gemarkeerd (ON-knop)
- Test bij regex uw expressie op [regex101.com](https://regex101.com/) in PCRE-modus
- De prioriteitsvolgorde is: exact → prefix → regex (op aflopende `hit_count`)

### GA4 / GTM wordt niet geïnjecteerd

- Controleer het formaat van het ID (`G-XXXXXXX` of `GTM-XXXXXXX`)
- Is Consent Mode v2 actief, dan staat het snippet standaard in "denied"-modus tot de toestemming. Controleer de CMP-laag.
- Inspecteer de `head` van de pagina: het GA4/GTM-snippet wordt vlak vóór het sluiten geïnjecteerd

### De robots.txt verandert niet

- Controleer of er geen statisch `robots.txt`-bestand in de siteroot staat (dat zou voorrang hebben op de module). Verwijder het.
- De module serveert de robots.txt via een PrestaShop-route — controleer of de _herschreven URL's_ zijn ingeschakeld

### Fout bij het aanmaken van de SQL-tabellen bij de installatie

- Controleer of de MySQL-gebruiker de rechten `CREATE` en `ALTER` heeft
- Controleer de codering: MySQL moet `utf8mb4` met collatie `utf8mb4_unicode_ci` ondersteunen
- Als het aangepaste tabelvoorvoegsel van PrestaShop langer is dan 5 tekens, kunnen sommige indexnamen de MySQL-limiet van 64 tekens overschrijden. Neem contact op met de support.

## Technische referentie

### Gebruikte hooks

De module registreert 18 hooks:

- `displayHeader` — injectie van de metatags, canonical, hreflang, OG, Twitter, JSON-LD, GA4/GTM, verificaties
- `displayBeforeBodyClosingTag` — injectie van GTM noscript, FB Pixel noscript, aangepaste body-end code
- `displayBackOfficeHeader` — CSS/JS van de back-office
- `displayAdminProductsExtra` — SEO-metabox op de productfiche
- `actionDispatcherBefore`, `actionDispatcherAfter` — routing van de redirects en 404-registratie
- `actionObjectProductAddAfter`, `actionObjectProductUpdateAfter` — auto-fill meta + auto-301
- `actionObjectCategoryAddAfter`, `actionObjectCategoryUpdateAfter` — idem categorie
- `actionObjectCmsAddAfter`, `actionObjectCmsUpdateAfter` — idem CMS
- `actionObjectManufacturerUpdateAfter`, `actionObjectSupplierUpdateAfter` — auto-301 bij slugwijziging
- `actionAdminControllerSetMedia`, `actionFrontControllerSetMedia` — CSS/JS-assets
- `displayProductExtraContent` — gereserveerd voor toekomstig gebruik
- `moduleRoutes` — routes `/sitemap.xml`, `/plan-du-site`, `/robots.txt`, `/llms.txt`

### Toegevoegde SQL-tabellen

Alle tabellen gebruiken het voorvoegsel `df_seo_`, charset `utf8mb4`, collatie `utf8mb4_unicode_ci`:

- `df_seo_meta`, `df_seo_meta_lang` — meta-overrides per entiteit
- `df_seo_template`, `df_seo_template_lang` — templates per type
- `df_seo_redirect` — redirects 301/302/307/308/410
- `df_seo_404` — 404-logboek
- `df_seo_score` — score-snapshots (analyzer)
- `df_seo_keyword` — focustrefwoorden
- `df_seo_robots_rule` — robots.txt-regels
- `df_seo_schema_custom` — aangepaste JSON-LD-schema's
- `df_seo_log` — intern diagnoselogboek

### Deïnstallatie

Het deïnstalleren verwijdert de hooks en de back-office tabbladen, maar **behoudt de SQL-tabellen en de gegevens**. Om volledig op te schonen:

```
DROP TABLE ps_df_seo_meta, ps_df_seo_meta_lang, ps_df_seo_template, ps_df_seo_template_lang,
           ps_df_seo_redirect, ps_df_seo_404, ps_df_seo_score, ps_df_seo_keyword,
           ps_df_seo_robots_rule, ps_df_seo_schema_custom, ps_df_seo_log;
DELETE FROM ps_configuration WHERE name LIKE 'DFSEO_%';
```

Gebruik vóór de deïnstallatie **Instellingen → Onderhoud → Alle gegevens exporteren (JSON)** om een volledig archief te bewaren. Het JSON-formaat laat toe de redirects, templates en schema's op een andere installatie opnieuw te importeren.

## Updates en support

- **Updates**: 12 maanden inbegrepen bij aankoop. Optionele jaarlijkse verlenging voor 49 €.
- **Support**: 12 maanden per e-mail, antwoord binnen 48 werkuren.
- **Changelog** en download van de nieuwste versies via [uw DataFirefly-klantaccount](https://www.datafirefly.com/nl/product/dfallinoneseo/).
