AI People Also Ask — Complete documentatie (dfaipaa)
Complete handleiding voor de module dfaipaa: installatie, configuratie van scrapingproviders (SerpApi, DataForSEO) en AI (Mistral, OpenAI, Anthropic), redactionele workflow, FAQ-weergave, JSON-LD FAQPage en cronautomatisering.
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.
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
Installatie
- Download de ZIP
dfaipaa.zipvia uw DataFirefly-account. - Ga in de PrestaShop-backoffice naar Modules › Modulebeheer › Een module uploaden.
- Sleep de ZIP erin, wacht op de bevestiging en klik op Installeren.
- 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.
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-latestvoor kwaliteit,mistral-small-latestom de kosten bij grote volumes te drukken. - OpenAI:
gpt-4o-minibiedt een uitstekende prijs-kwaliteitverhouding;gpt-4ovoor veeleisende technische catalogi. - Anthropic:
claude-sonnet-4-6voor 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.
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.
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
--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:passwordvan 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
publishedheeft. - 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’sscrape,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.