Toestemmingsbeheer voor WordPress
dat blokkeert vóór de klik.
OW Consent maakt trackers in de HTML onschadelijk nog vóór de bezoeker gekozen heeft, past het wettelijke regime van diens rechtsgebied toe en schrijft elke beslissing weg in een geketend register dat je zelf kunt controleren. Elf compliance-profielen, negen benoemde regimes — van de AVG tot de CCPA. Gratis, GPL, zonder Pro-versie.
Waarom nóg een toestemmingsplugin?
De banner was nooit het probleem. Bijna elke site heeft er een, en toch vertrekken de trackers al bij de eerste byte: het Analytics-script staat hard in het thema, de advertentiepixel draait vanuit de footer, de YouTube-iframe plaatst zijn cookies terwijl de banner er nog overheen verschijnt. Een klik op “Alles accepteren” geeft dan nergens meer toestemming voor, hij bekrachtigt alleen wat al gebeurd is.
De tweede valkuil is de cache. Zodra een plugin de HTML bepaalt door de cookie van de bezoeker te lezen, is hij onverenigbaar met een paginacache — of erger, hij serveert de keuzes van de ene bezoeker aan de andere. De derde is het bewijs: artikel 7.1 vraagt om de toestemming aan te tonen, en een vinkje ergens in de database toont helemaal niets aan.
OW Consent vertrekt vanuit die drie beperkingen. De markup die wordt geserveerd is voor iedereen identiek, inclusief de onschadelijk gemaakte trackers, en het is de browser die vrijgeeft wat de bezoeker heeft toegestaan. Elke beslissing wordt toegevoegd aan een ondertekende hashketen. En het toegepaste regime — opt-in of opt-out, een “Do Not Sell”-link, een bindend GPC-signaal of niet — volgt het rechtsgebied, niet een standaard aangevinkt vakje.
In de strikte modus, standaard aan, wordt het document bij het uitsturen herschreven: scripts onschadelijk gemaakt als text/plain, iframes omgezet naar about:blank achter een aanklikbaar kader, pixels vervangen door een transparante GIF, verbindingshints verwijderd. Een bezoeker die nooit klikt, laadt die bronnen ook nooit.
Niets in het renderpad leest de cookie. De status van de bezoeker wordt in de browser opnieuw opgebouwd en op de html-tag gezet vóór het eerste beeld. LiteSpeed, WP Rocket, Varnish of een CDN mogen de pagina cachen zonder ooit twee bezoekers door elkaar te halen.
Elke gebeurtenis komt in een geketende tabel terecht, elke rij ondertekend met HMAC over de hash van de vorige, het kopanker buiten de tabel bewaard. En weigert het register te schrijven, dan antwoordt de API met 503, trekt ze de cookie in en geeft ze geen enkele tracker vrij: een toestemming die de site niet kan bewijzen, is een toestemming die hij niet claimt.
Wat er concreet verandert
Geen slogans. Dit zijn de technische keuzes die dit product onderscheiden.
In de strikte modus — standaard aan — wordt het volledige document bij het uitsturen opgevangen en in vijf passes herschreven: scripts krijgen het type text/plain met hun URL opgeborgen in data-owc-src, iframes gaan naar about:blank achter een kader met een “Accepteer”-knop op naam van de leverancier, meetpixels worden vervangen door een transparante GIF van 1×1, preconnect en dns-prefetch worden verwijderd (een simpele hint opent al een TLS-verbinding en geeft het IP-adres prijs), en al gecatalogiseerde media van derden verliezen hun autoplay. De meegeleverde catalogus telt 183 signaturen voor 71 leveranciers, en je kunt er vanuit de beheeromgeving toevoegen, corrigeren of verwijderen. Standaard glipt een onbekend script van derden erdoor, terwijl een onbekende iframe wordt geblokkeerd.
Niets van wat de server rendert hangt af van de cookie van de bezoeker: iedereen krijgt dezelfde onschadelijk gemaakte tags, en de runtime herstelt ze in de browser, in documentvolgorde, alleen voor de toegestane categorieën. De status wordt op de html-tag gezet vóór het eerste beeld, dus geen banner die even opflitst. Het schrijftoken wordt vlak voor elke verzending vers opgehaald en zit nooit in gecachte HTML: dat ophalen is afgetopt op 4 seconden en het ontbreken ervan blokkeert nooit een keuze.
AVG, UK PECR, de Zwitserse nFADP, de Quebecse Wet 25, LGPD, CCPA, POPIA, PIPL, de Indiase DPDP, plus een Australisch en een algemeen Amerikaans profiel. Het profiel is geen decoratie: het bepaalt het wettelijke model (opt-in, of toegestaan tot weigering voor CCPA, het algemene Amerikaanse profiel en Australië), of de link “Do Not Sell or Share” verschijnt — één klik voert de opt-out echt uit, hij opent geen paneel —, of het Global Privacy Control-signaal bindend is, en welke taal en welke toezichthoudende autoriteit in de gegenereerde documenten staan. Detectie per land bestaat, standaard uitgeschakeld.
Elke acceptatie, weigering, wijziging of intrekking komt in een eigen tabel terecht: elke rij ondertekend met HMAC-SHA-256 (of SHA3-256) over de hash van de vorige, met een kopanker buiten de tabel zodat afkappen zichtbaar wordt. Vastgelegd worden een pseudonieme browsertoken, het ingekorte IP-adres, een hash van de user-agent, de pagina, het geldende profiel, de exacte revisie van de getoonde banner en de hash van de gekoppelde documenten — nooit een naam of een adres. Eén knop controleert de hele keten en wijst de breuk aan; de CSV- of JSON-export krijgt een envelop mee waarmee een derde een uittreksel opnieuw kan verifiëren. Standaardbewaartermijn: 5 jaar.
Standaard uitgeschakeld meegeleverd, aan te zetten wanneer je wilt: de scanner loopt via WP-Cron je eigen pagina's af (standaard 25 URL's, instelbaar tot 500) en wisselt daarbij homepage, pagina's, berichten, contenttypes en taxonomieën af. Drie onderscheiden en herkenbare bronnen: de geserveerde HTML, de Set-Cookie-headers — de enige cookies die een serverscan kan bewijzen, en de enige die niets kan tegenhouden — en een probe in de pagina die alleen voor ingelogde beheerders draait en oppikt wat een tagmanager tijdens runtime injecteert. Een vondst wordt met één klik een catalogusregel. En het rapport vertelt wat het níét gelezen heeft, in plaats van een halve scan voor een volledige inventaris te laten doorgaan.
Vier documenten die als versiebeheerde WordPress-pagina's worden gegenereerd — cookiebeleid, privacybeleid, wettelijke vermeldingen, algemene voorwaarden — in de taal van het rechtsgebied (Frans, Engels, Portugees), met de toezichthoudende autoriteit en de trackertabel uit de scan. Publiceren wordt geweigerd zolang een wettelijk verplicht veld leeg is, en elk document draagt een waarschuwing die eraan herinnert het te laten nalezen. Voor de rechten van betrokkenen opent de shortcode owc_dsar_form zeven soorten verzoeken, geverifieerd via een e-mail heen en terug; de termijn van artikel 12.3 start bij de identiteitsbevestiging, en het verzoek opent tegelijk een native WordPress-verzoek zodat de export of de wissing alle plugins van de site dekt.
Tegenover alternatieven
Verifieerbare data. Alleen aanvinken wat bij de concurrent echt bestaat.
| Criterium | OW Consent | Complianz | CookieYes | Borlabs Cookie |
|---|---|---|---|---|
| Verdienmodel | Gratis, GPL-2.0-or-later | Freemium (betalende Pro) | Freemium (betalende Pro) | Niet vermeld |
| Te activeren licentiesleutel | Geen | Voor de Pro-versie | Voor de Pro-versie | Niet vermeld |
| Manier waarop trackers geblokkeerd worden | HTML wordt aan de serverzijde herschreven, 183 meegeleverde en aanpasbare signaturen | Niet vermeld | Niet vermeld | Niet vermeld |
| Geketend en verifieerbaar bewijsregister | HMAC-SHA-256-keten, anker buiten de tabel, verificatie met één klik | Niet vermeld | Niet vermeld | Niet vermeld |
| Meegeleverde compliance-profielen | 11 profielen, 9 benoemde regimes | Niet vermeld | Niet vermeld | Niet vermeld |
| Instelbare toestemmingsbanner | 4 posities, licht / donker / automatisch thema | |||
| Portaal voor verzoeken van betrokkenen | Inbegrepen: formulier, e-mailverificatie, termijn art. 12.3 | Niet vermeld | Niet vermeld | Niet vermeld |
| Waar de geregistreerde toestemmingen staan | In de database van je eigen hosting, geen enkele externe dienst | Niet vermeld | Niet vermeld | Niet vermeld |
Drie manieren om een formulier in te bouwen
Geen opgelegde proprietary page builder. Kies de aanpak die bij jouw stack past.
<!-- Wat je thema uitprint -->
<script src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
<iframe src="https://www.youtube.com/embed/VIDEO_ID"></iframe>
<!-- Wat de bezoeker krijgt vóór elke toestemming (strikte modus, standaard) -->
<script type="text/plain"
data-owc-cat="analytics"
data-owc-vendor="Google"
data-owc-src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
<span class="owc-embed-placeholder" data-owc-cat="social" data-owc-vendor="Google">
<span class="owc-embed-text">Google content blocked: this content uses cookies…</span>
<button type="button" class="owc-embed-accept" data-owc-cat="social">Accept Google</button>
<iframe data-owc-cat="social"
data-owc-src="https://www.youtube.com/embed/VIDEO_ID"
src="about:blank"></iframe>
</span>
<!-- Deze markup is voor iedereen dezelfde, paginacache inbegrepen.
Het is de runtime, in de browser, die de tags van de toegestane
categorieën herstelt, in documentvolgorde. Een intrekking van de
toestemming herlaadt de pagina: een script dat al gedraaid heeft,
krijg je niet meer uitgeladen. -->Redelijke twijfels, directe antwoorden
Ja, en die blokkering zit in de markup, niet in een belofte. In de strikte modus, standaard aan, wordt het document bij het uitsturen opgevangen en herschrijven vijf passes scripts, iframes, pixels, verbindingshints en media van derden. Twee grenzen die je moet kennen: de echte blokkering steunt op de catalogus van 183 signaturen en op de signaturen voor inline code — een onbekend script van derden wordt standaard toegelaten, een onbekende iframe wordt geblokkeerd —, en zet je de strikte modus uit, dan worden alleen de door WordPress geregistreerde scripts behandeld, niet die hard in het thema staan. En ten slotte: een document van meer dan 8 MB of een fout in de reguliere-expressiemotor wordt onaangeroerd geserveerd in plaats van kapot.
Ja, dat was het uitgangspunt. De geserveerde HTML is voor alle bezoekers identiek, inclusief de onschadelijk gemaakte trackers, en de toestemmingsstatus wordt in de browser uit de cookie opnieuw opgebouwd en toegepast vóór het eerste beeld. Geen enkele cache kan dus de keuzes van de ene bezoeker aan de andere serveren. De prijs daarvoor is duidelijk: het regime van de bezoeker wordt aan de clientzijde bepaald, dus zonder JavaScript wordt er niets geregistreerd. Een bezoeker zonder JavaScript ziet een noscript-blok, laadt niets dat niet strikt noodzakelijk is, en zit nooit opgesloten achter een venster dat hij niet kan sluiten.
Het bepaalt het wettelijke model: opt-in voor de AVG, UK PECR, de Zwitserse nFADP, Wet 25, LGPD, POPIA, PIPL en DPDP; toegestaan tot weigering voor CCPA, het algemene Amerikaanse profiel en Australië. Het bepaalt ook of de link “Do Not Sell or Share” verschijnt (alleen CCPA en het algemene Amerikaanse profiel), of het GPC-signaal bindend is (dezelfde twee profielen: elders wordt het signaal wel op het scherm weerspiegeld, maar wordt er niets geregistreerd), en welke taal en welke toezichthoudende autoriteit de gegenereerde documenten dragen. Detectie per land is optioneel en staat standaard uit; ze faalt gesloten, dus richting het strengste regime. Twee erkende grenzen: geen onderscheid per Amerikaanse staat of Canadese provincie, en het MaxMind-bestand wordt door de plugin niet gedownload en kan er ook niet in worden geüpload — dat zet je zelf in uploads/ow-geoip/.
Het bewijst precies zoveel als de sleutel die het ondertekent, en de plugin zegt je dat ronduit. Elke rij is met HMAC ondertekend over de hash van de vorige en het kopanker wordt buiten de tabel bewaard, zodat een wijziging, een afkapping of een leeggemaakte tabel bij de verificatie zichtbaar wordt. Maar staan AUTH_KEY en AUTH_SALT niet in je wp-config.php en heb je OWC_LEDGER_KEY niet gedefinieerd, dan komt de sleutel uit de database: wie toegang heeft tot die database, kan de keten opnieuw ondertekenen. In dat geval toont de plugin een waarschuwing in de beheeromgeving en meldt hij zelf dat de keten niet langer onvervalsbaar is, in plaats van dat te blijven beweren.
Nee, en dat zeg je beter vooraf dan achteraf. De module implementeert TCF v2.2 aan de browserzijde — de __tcfapi-API, een gecodeerde TC-string, de cookie euconsent-v2 — maar levert geen CMP ID: dat wordt door IAB Europe toegekend na registratie, en zonder dat ID zendt de module strikt niets uit. De omvang is eveneens begrensd: enkel het Core-segment, geen enkele publisher restriction, twee ondersteunde speciale functies, geen globale scope. Concreet werkt hij als een niet-officiële CMP-compatibele modus, wat voor veel integraties volstaat maar geen officiële registratie vervangt — Google AdSense weigert hem in het bijzonder in productie binnen de EER. De module staat standaard uit.
Deactiveren raakt geen enkel gegeven aan: het haalt alleen de geplande taken weg. Bij verwijderen verdwijnen er altijd twee dingen, wat je ook hebt ingesteld: de geplande taken en de tabel met verzoeken van betrokkenen, de enige tabel met direct identificerende gegevens van derden waarvan de bewaring door niets meer wordt begrensd zodra de plugin weg is. De rest — toestemmingsregister, scannervondsten, trackercatalogus — blijft bestaan, tenzij je uitdrukkelijk het volledig wissen hebt aangevinkt, wat standaard uit staat: je toestemmingsbewijs uit artikel 7.1 hoort niet met een de-installatie te verdwijnen.
Geen Pro-versie, geen licentiesleutel.
OW Consent verschijnt onder de licentie GPL-2.0-or-later. Alles wat deze pagina beschrijft zit in de .zip die je downloadt: geen afgeschermde module, geen abonnement, geen limiet op het aantal pagina's, toestemmingen of verzoeken.
- Alles zit erin: banner, trackerblokkering, scanner, aanpasbare catalogus, geketend register, documentgenerator, verzoekenportaal, Consent Mode v2, TCF v2.2 en Global Privacy Control.
- De .zip download je op optionweb.dev: installeer hem via Plugins → Nieuwe plugin → Plugin uploaden. WordPress 6.2 als minimum — daaronder weigert de plugin te starten en zegt dat ook, in plaats van een banner te tonen die niets blokkeert.
- Geen externe dienst, geen licentiecontrole, geen extra tracker: toestemmingen, verzoeken en documenten blijven in de database van je eigen hosting.
- De code staat onder GPL-2.0-or-later, is leesbaar en aanpasbaar, met gedocumenteerde uitbreidingspunten: de filters owc_settings, owc_scripts_catalog, owc_blocker_allowlist, owc_policy_template, en de acties van het register.