# AI People Also Ask — Complete documentatie (dfaipaa)

> Presentatie AI People Also Ask (technische slug: dfaipaa) vangt de vragen op die uw klanten echt aan Google stellen (de "People Also Ask"-blokken), genereert de antwoorden met een AI naar…

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

## Presentatie

**AI People Also Ask** (technische slug: `dfaipaa`) vangt de vragen op die uw klanten echt aan Google stellen (de "People Also Ask"-blokken), genereert de antwoorden met een AI naar keuze en publiceert een schema.org-gemarkeerde FAQ op uw productpagina's en categoriepagina's.

De module industrialiseert een complete pipeline in vier stappen:

- **Scraping**: vastleggen van de PAA-vragen op uw doelzoekwoorden via SerpApi, DataForSEO of handmatige invoer.
- **AI-generatie**: schrijven van de antwoorden via Mistral, OpenAI of Anthropic, met configureerbare toon en merkidentiteit.
- **Redactionele workflow**: revisie, toewijzing aan producten en categorieën, publicatie (handmatig of automatisch).
- **Publicatie**: toegankelijk FAQ-accordeon in de winkel + JSON-LD FAQPage voor Google en de generatieve zoekmachines.

**Opmerking**: er is geen `composer install` nodig. Een minimale PSR-4-autoloader is ingebouwd in de module onder de namespace DataFirefly Dfaipaa.

## Vereisten

- PrestaShop 8.0.0 → 9.99.99
- PHP 8.1, 8.2 of 8.3
- MySQL 5.7 / MariaDB 10.4 of hoger
- Een API-sleutel voor minstens één AI-provider (Mistral, OpenAI of Anthropic)
- Optioneel: een SerpApi-sleutel of een DataForSEO-account om de scraping te automatiseren
- Toestemming voor uitgaande HTTPS-verbindingen (cURL) vanaf uw hosting

**Tip**: met de modus "handmatige invoer" kunt u de module zonder scraping-abonnement gebruiken: u voert zelf de vragen in, de AI zorgt voor de antwoorden.

## Installatie

1. Download de ZIP `dfaipaa.zip` via uw DataFirefly-account.
2. Ga in de PrestaShop-backoffice naar **Modules › Modulebeheer › Een module uploaden**.
3. Sleep de ZIP erin, wacht op de bevestiging en klik op **Installeren**.
4. Een nieuw menu **AI People Also Ask** verschijnt in de linkerkolom, met drie tabbladen: Configuratie, Zoekwoorden, Vragen.

De installatie maakt 4 tabellen aan (voorvoegsel `ps_dfaipaa_`), stelt de standaardconfiguratiewaarden in en installeert 4 beheertabbladen (één parent + drie kinderen) met gelokaliseerde labels in FR, EN, ES, DE, IT en NL.

**Belangrijk**: als uw uitpaktool de mappen `vendor/` overslaat, ontbreekt de autoloader en geeft de module een "Class not found"-fout. Pak uit met `unzip` of upload de ZIP rechtstreeks via de backoffice, die de mappenstructuur correct verwerkt.

## Configuratie — Scraping

Tabblad **AI People Also Ask › Configuratie**, eerste sectie.

| Veld | Beschrijving | Standaard |
| --- | --- | --- |
| Provider | `serpapi`, `dataforseo` of `manual` | `serpapi` |
| API-sleutel | SerpApi-sleutel, of DataForSEO-inloggegevens in het formaat `login:password` | leeg |
| Taal | ISO-code van 2 letters gebruikt in de Google-query | `fr` |
| Land | ISO-code van 2 letters van de doelmarkt | `FR` |
| Max. vragen per zoekwoord | Limiet per scraping-operatie | `8` |
| Verversingsinterval | In dagen; daarna geldt een zoekwoord als verouderd | `30` |

### Een SerpApi-sleutel verkrijgen

Maak een account aan op **serpapi.com**. Het gratis plan biedt 100 requests per maand, wat overeenkomt met ongeveer 100 gescrapete zoekwoorden. De sleutel vindt u in uw dashboard, sectie "Your Account". De module bevraagt het Google-zoekendpoint en gebruikt het blok `related_questions` van het antwoord.

### Een DataForSEO-account verkrijgen

Maak een account aan op **dataforseo.com**. U ontvangt een combinatie van gebruikersnaam en wachtwoord die u in het veld API-sleutel plakt in de vorm `login:password` (de module verzorgt de HTTP Basic-authenticatie). DataForSEO factureert per gebruik, wat beter past bij grote volumes. De module gebruikt het endpoint SERP Google organic live advanced en extraheert de elementen `people_also_ask`.

De mapping van de locatiecodes is ingebouwd voor de volgende markten: FR, BE, CH, LU, CA, US, UK, IE, ES, PT, IT, DE, AT, NL, PL, BR en MX.

### Modus handmatige invoer

Selecteer `manual` om elke externe aanroep uit te schakelen. U voegt de vragen dan zelf toe via het tabblad Vragen; de AI-generatie blijft volledig functioneel.

## Configuratie — Artificiële intelligentie

Tweede sectie van het tabblad Configuratie.

| Veld | Beschrijving | Standaard |
| --- | --- | --- |
| Provider | `mistral`, `openai` of `anthropic` | `mistral` |
| Model | Modelidentificatie bij de provider | `mistral-large-latest` |
| API-sleutel | Sleutel van de geselecteerde provider | leeg |
| Temperatuur | 0.0 tot 1.0; lager = feitelijker | `0.3` |
| Max. tokens | Maximale lengte van het gegenereerde antwoord | `500` |
| Toon | Vrije tekst: expert, pedagogisch, commercieel, warm... | leeg |
| Merkidentiteit | Aanvullende instructies om de redactionele stijl uit te lijnen | leeg |
| Autopublicatie | Publiceert automatisch elk gegenereerd antwoord | uitgeschakeld |

### Aanbevolen modellen

- **Mistral**: `mistral-large-latest` voor kwaliteit, `mistral-small-latest` om de kosten bij grote volumes te drukken.
- **OpenAI**: `gpt-4o-mini` biedt een uitstekende prijs-kwaliteitverhouding; `gpt-4o` voor veeleisende technische catalogi.
- **Anthropic**: `claude-sonnet-4-6` voor genuanceerde en goed gestructureerde antwoorden.

### Opgelegde beperkingen aan het model

De module bouwt een strikte systeemprompt, onafhankelijk van de provider: antwoorden van 60 tot 120 woorden, alleen eenvoudige HTML (paragrafen, vet, cursief, lijsten), verbod op markdown, kopelementen en elk script. De context van de entiteit (naam en beschrijving van het product of de categorie, afgekapt op 1200 tekens) en het oorspronkelijke zoekwoord worden geïnjecteerd om het antwoord te verankeren. De oorspronkelijke Google-snippet wordt als referentie meegegeven met een expliciete instructie tot herformuleren, nooit kopiëren.

**Tip**: als een kleiner model toch markdown teruggeeft, verlaag dan de temperatuur naar 0.2 en vermeld "alleen HTML, geen markdown" in het veld Merkidentiteit.

## Configuratie — Weergave

Derde sectie van het tabblad Configuratie.

| Veld | Beschrijving | Standaard |
| --- | --- | --- |
| Productmodus | `tab` (tabblad) of `footer` (blok onderaan de productpagina) | `tab` |
| Inschakelen op product | Toont de FAQ op de productpagina's | ingeschakeld |
| Inschakelen op categorie | Toont de FAQ onderaan de categoriepagina | ingeschakeld |
| Titel tabblad | Gelokaliseerd label van het producttabblad | "Veelgestelde vragen" |
| Titel product | Titel van het blok in footer-modus | gelokaliseerd |
| Titel categorie | Titel van het categorieblok | gelokaliseerd |
| JSON-LD uitsturen | Injecteert de FAQPage-markering | ingeschakeld |

In de `tab`-modus steunt de module op het native mechanisme `ProductExtraContent` van PrestaShop: de FAQ verschijnt als tabblad naast "Beschrijving" en "Productdetails", zonder template-overrides.

## Redactionele workflow

### Stap 1 — Zoekwoorden toevoegen

Tabblad **Zoekwoorden**. Plak uw lijst in het tekstveld, één zoekwoord per regel, en bevestig. Duplicaten worden automatisch genegeerd (de toevoeging is idempotent per zoekwoord, taal en winkel).

Kies zoekwoorden die aansluiten bij koopintentie: "automatische koffiemachine", "beste koffiebonen", "onderhoud koffiezetapparaat". Vermijd pure merkzoekopdrachten, die zelden PAA-blokken opleveren.

### Stap 2 — Scrapen

Twee opties:

- **Scrapen**: individuele knop op elke zoekwoordregel, handig om de configuratie te testen.
- **Alle verouderde scrapen**: verwerkt in batches van 20 de zoekwoorden waarvan de laatste vastlegging het verversingsinterval overschrijdt.

Elke vastgelegde vraag wordt geregistreerd met een uniciteitshash (vraag + taal + winkel): een zoekwoord opnieuw scrapen creëert nooit duplicaten, het werkt alleen de datum van de laatste vastlegging bij.

### Stap 3 — Antwoorden genereren

Tabblad **Vragen**. Filter op status `pending`, selecteer de vragen via de selectievakjes en start de massa-actie **Genereren**. Op elke regel is ook een individuele knop beschikbaar.

De entiteitscontext wordt opgebouwd vanuit de eerste toewijzing van de vraag. Wijs voor betere antwoorden de vraag toe aan een product of categorie _voordat_ u genereert: de AI beschikt dan over de naam en de beschrijving van de entiteit.

### Stap 4 — Reviseren en toewijzen

Klik op een vraag om het bewerkingsformulier te openen. U kunt:

- het HTML-antwoord corrigeren in de rich-texteditor;
- de vraag toewijzen aan een of meer producten en categorieën (N-op-N-relatie);
- de toewijzingen herordenen om de weergavevolgorde van het accordeon te bepalen;
- een irrelevante vraag afwijzen (status `rejected`, bewaard in de database maar nooit getoond).

### Stap 5 — Publiceren

Zet de status op `published`. De FAQ verschijnt direct in de winkel, samen met de bijbehorende JSON-LD.

Als de optie **Autopublicatie** in de configuratie is ingeschakeld, worden stappen 4 en 5 samengevoegd: de generatie publiceert direct. Handig voor een volledig geautomatiseerde pipeline, voor te behouden aan catalogi waar menselijke controle niet kritiek is.

## Statussen van de vragen

| Status | Betekenis | Getoond in de winkel |
| --- | --- | --- |
| `pending` | Vraag vastgelegd, nog geen AI-antwoord | Nee |
| `generated` | Antwoord gegenereerd, wacht op validatie | Nee |
| `published` | Gevalideerd en gepubliceerd | Ja |
| `rejected` | Handmatig afgewezen | Nee |

## Weergave in de winkel

Het accordeon steunt op de native HTML-elementen `details` en `summary`, wat het volgende garandeert:

- een werkende toetsenbordnavigatie zonder JavaScript;
- inhoud die ook ingeklapt door zoekmachines geïndexeerd wordt;
- compatibiliteit met alle moderne browsers.

Het eerste element is standaard geopend. Er wordt een licht CSS-bestand geladen, volledig overschrijfbaar vanuit uw child theme. Alle classes gebruiken het voorvoegsel `dfaipaa-faq` om conflicten te vermijden.

### JavaScript-events

Het frontscript stuurt twee aangepaste events uit die u op uw analyticstool kunt aansluiten:

```
document.addEventListener('dfaipaa:open', function (e) {
  // e.detail.question, e.detail.index, e.detail.type, e.detail.entityId
  gtag('event', 'faq_open', { question: e.detail.question });
});

document.addEventListener('dfaipaa:close', function (e) {
  console.log('FAQ gesloten:', e.detail.question);
});
```

Het bestand `views/js/front.js` bevat ook een constante `SINGLE_OPEN` (standaard `false`): zet deze op `true` om slechts één paneel tegelijk open te laten.

### Deep-linking

Een anker in de vorm `#dfaipaa-q-123` opent automatisch de bijbehorende vraag en scrolt de pagina ernaartoe. Handig om een specifiek antwoord te delen vanuit een e-mail of een supportticket.

## JSON-LD FAQPage-markering

Bij elke lading van een product- of categoriepagina met minstens één gepubliceerde vraag injecteert de module een JSON-LD-blok vlak voor het sluiten van de documentbody (hook `displayBeforeBodyClosingTag`).

Uitgestuurde structuur: een `FAQPage`-node, een `mainEntity`-array, en voor elk item een `Question`-node met een `acceptedAnswer` van het type `Answer`. De HTML-inhoud van de antwoorden wordt vóór uitgifte opgeschoond: script- en style-elementen en event-attributen worden verwijderd.

**Tip**: valideer uw markering met de Google-tool voor het testen van rich results. Merk op dat Google de weergave van FAQ rich snippets heeft beperkt tot overheids- en gezondheidssites, maar de markering blijft waardevol voor de generatieve zoekmachines (ChatGPT, Perplexity, Gemini) die haar actief gebruiken.

## Automatisering via cron

Er wordt een CLI-script meegeleverd om de pipeline zonder handmatige tussenkomst uit te voeren.

```
# Verouderde zoekwoorden scrapen (standaard max. 20)
php modules/dfaipaa/cli/cron.php scrape --limit=20

# AI-antwoorden genereren voor de openstaande vragen
php modules/dfaipaa/cli/cron.php generate --limit=10

# Scraping en generatie na elkaar uitvoeren
php modules/dfaipaa/cli/cron.php all --limit=20
```

Voorbeeld van een crontab, nachtelijke uitvoering om 3 uur:

```
0 3 * * * cd /var/www/prestashop && php modules/dfaipaa/cli/cron.php all --limit=30 >> /var/log/dfaipaa.log 2>&1
```

**Belangrijk**: stem de parameter `--limit` af op uw API-quota. Een batch van 30 zoekwoorden verbruikt 30 SerpApi-requests; met het gratis plan (100 per maand) is een wekelijkse uitvoering geschikter dan een dagelijkse.

## Meertalig en multistore

De vragen worden geïndexeerd op `id_lang` en `id_shop`. Concreet:

- hetzelfde zoekwoord gescrapet in het Frans en het Engels levert twee afzonderlijke vragensets op;
- de antwoorden worden gegenereerd in de taal van de vraag, waarbij de prompt een expliciete taaldirectief toepast (fr, en, es, de, it, nl, pt, pl);
- in multistore verschijnen de vragen en toewijzingen van een winkel nooit op een andere;
- de weergavetitels (tabblad, product, categorie) worden opgeslagen als gelokaliseerde configuratie.

## Probleemoplossing

### De scraping levert geen enkele vraag op

- Controleer uw quotum bij de provider: SerpApi kapt stilzwijgend af boven het gratis plan.
- Controleer de consistentie tussen taal en land: "fr" met "US" geeft grillige resultaten.
- Sommige zoekwoorden triggeren bij Google simpelweg geen PAA-blok. Test de zoekopdracht handmatig in een browser in incognitomodus.
- Controleer voor DataForSEO het formaat `login:password` van het veld API-sleutel.

### De AI geeft markdown terug in plaats van HTML

Verlaag de temperatuur naar 0.2, of stap over op een capabeler model. De prompt legt al strikte HTML-regels op, maar de lichtste modellen kunnen ze deels negeren.

### De FAQ wordt niet in de winkel getoond

- Controleer of minstens één vraag de status `published` heeft.
- Controleer of ze daadwerkelijk is toegewezen aan de bezochte entiteit (product of categorie).
- Controleer of de weergave voor dat type entiteit in de configuratie is ingeschakeld.
- Leeg de Smarty-cache via **Geavanceerde instellingen › Prestaties**.

### De JSON-LD verschijnt niet in de broncode

Controleer of de optie "JSON-LD uitsturen" is ingeschakeld en of het thema de hook `displayBeforeBodyClosingTag` daadwerkelijk aanroept. Sommige thema's van derden laten hem weg: voeg dan `{hook h='displayBeforeBodyClosingTag'}` toe vóór het sluiten van de body in uw `layouts/layout-both-columns.tpl`.

### Fout "Class not found" na installatie

De map `vendor/` is niet uitgepakt. Herinstalleer de module door de ZIP via de backoffice te uploaden in plaats van handmatig uit te pakken.

### De operatielogs raadplegen

Alle operaties (scraping, generatie, publicatie) worden gelogd. Om te onderzoeken:

```
SELECT * FROM ps_dfaipaa_log ORDER BY date_add DESC LIMIT 50;
```

## Deïnstallatie

Klik in **Modules › Modulebeheer** op **Deïnstalleren**. De operatie verwijdert de 4 tabellen `ps_dfaipaa_*`, de 4 beheertabbladen en alle configuratiesleutels `DFAIPAA_`. De gegenereerde inhoud gaat definitief verloren: exporteer vooraf uw vragen als u ze wilt bewaren.

## Technische referentie

- **Technische slug**: `dfaipaa`
- **Namespace**: DataFirefly Dfaipaa (PSR-4, ingebouwde autoloader)
- **Aangemaakte tabellen**: `ps_dfaipaa_keyword`, `ps_dfaipaa_question`, `ps_dfaipaa_assignment`, `ps_dfaipaa_log`
- **Gebruikte hooks**: `displayHeader`, `displayProductExtraContent`, `displayFooterProduct`, `displayCategoryFooter`, `displayBeforeBodyClosingTag`, `actionFrontControllerSetMedia`, `actionAdminControllerSetMedia`, `actionProductUpdate`, `actionProductSave`, `actionCategoryUpdate`, `actionObjectProductDeleteAfter`, `actionObjectCategoryDeleteAfter`
- **Backoffice-tabbladen**: AdminDfaipaa (parent), AdminDfaipaaConfig, AdminDfaipaaKeywords, AdminDfaipaaQuestions
- **Configuratiesleutels**: `DFAIPAA_SCRAPER_PROVIDER`, `DFAIPAA_SCRAPER_API_KEY`, `DFAIPAA_SCRAPER_LANG`, `DFAIPAA_SCRAPER_COUNTRY`, `DFAIPAA_SCRAPER_MAX_PER_KEYWORD`, `DFAIPAA_AI_PROVIDER`, `DFAIPAA_AI_MODEL`, `DFAIPAA_AI_API_KEY`, `DFAIPAA_AI_TEMPERATURE`, `DFAIPAA_AI_MAX_TOKENS`, `DFAIPAA_AI_TONE`, `DFAIPAA_AI_BRAND_VOICE`, `DFAIPAA_AUTO_PUBLISH`, `DFAIPAA_REFRESH_INTERVAL`, `DFAIPAA_PRODUCT_MODE`, `DFAIPAA_EMIT_JSONLD`, `DFAIPAA_TAB_TITLE`, `DFAIPAA_PRODUCT_TITLE`, `DFAIPAA_CATEGORY_TITLE`
- **CLI**: `modules/dfaipaa/cli/cron.php` (commando's `scrape`, `generate`, `all`)
- **Fronttemplate**: `views/templates/hook/faq.tpl`

## AVG-conformiteit

De module verzamelt en bewaart geen enkele vorm van persoonsgegevens: alleen zoekwoorden, vragen, gegenereerde antwoorden en technische operatielogs worden geregistreerd. Er wordt geen cookie geplaatst in de winkel. De aanroepen naar de externe API's (scraping, AI) versturen alleen het zoekwoord, de vraag en de productcontext, nooit klantgegevens.

## Support

Neem voor technische vragen contact op met het DataFirefly-team via **contact@datafirefly.com** of raadpleeg uw klantomgeving op [datafirefly.com](https://www.datafirefly.com/).
