Live · status OK
OW Consent · v1.5.0 · GPL-2.0-or-later

Le consentement WordPress
qui bloque avant le clic.

OW Consent neutralise les traceurs dans le HTML avant que le visiteur ait choisi, applique le régime légal de sa juridiction, et inscrit chaque décision dans un registre chaîné que tu peux vérifier. Onze profils de conformité, neuf régimes nommés — du RGPD au CCPA. Gratuit, GPL, sans version Pro.

v1.5.0GPL-2.0-or-laterWordPress 6.2+PHP 7.4+
Pourquoi

Pourquoi encore un plugin de consentement ?

La bannière n'a jamais été le problème. Presque tous les sites en ont une, et les traceurs partent quand même au premier octet : le script Analytics est écrit en dur dans le thème, le pixel publicitaire s'exécute depuis le pied de page, l'iframe YouTube dépose ses cookies pendant que la bannière s'affiche par-dessus. Le clic sur « Tout accepter » n'autorise alors plus rien, il ratifie ce qui a déjà eu lieu.

Le deuxième piège est le cache. Dès qu'un plugin décide du HTML en lisant le cookie du visiteur, il devient incompatible avec un cache de page — ou pire, il sert les choix d'un visiteur à un autre. Le troisième est la preuve : l'article 7.1 demande de démontrer le consentement, et une case cochée quelque part en base ne démontre rien du tout.

OW Consent part de ces trois contraintes. Le balisage servi est identique pour tout le monde, traceurs neutralisés inclus, et c'est le navigateur qui libère ce que le visiteur a accordé. Chaque décision est ajoutée à une chaîne de hachage signée. Et le régime appliqué — opt-in ou opt-out, lien « Do Not Sell », signal GPC contraignant ou non — suit la juridiction, pas une case par défaut.

Une bannière qui arrive après les traceurs

En mode strict, activé par défaut, le document est réécrit en sortie : scripts neutralisés en text/plain, iframes basculées sur about:blank derrière un encart cliquable, pixels remplacés par un GIF transparent, indices de connexion supprimés. Le visiteur qui ne clique jamais ne charge jamais ces ressources.

Le cache de page contre le consentement

Rien sur le chemin de rendu ne lit le cookie. L'état du visiteur est reconstruit dans le navigateur et posé sur la balise html avant le premier affichage. LiteSpeed, WP Rocket, Varnish ou un CDN peuvent mettre la page en cache sans jamais mélanger deux visiteurs.

Une preuve qu'on ne peut pas produire

Chaque événement rejoint une table chaînée, chaque ligne signée en HMAC avec le hash de la précédente, l'ancre de tête conservée hors table. Et si le registre refuse d'écrire, l'API répond 503, annule le cookie et ne libère aucun traceur : un consentement que le site ne sait pas prouver est un consentement qu'il ne revendique pas.

Sous le capot

Ce qui change concrètement

Pas de slogans. Voici les décisions techniques qui distinguent ce produit.

Les traceurs sont bloqués dans le balisage

En mode strict — activé par défaut — le document complet est capturé en sortie et réécrit en cinq passes : les scripts deviennent type text/plain avec leur URL rangée dans data-owc-src, les iframes passent sur about:blank derrière un encart « Accepter » nominatif, les pixels de mesure sont remplacés par un GIF 1×1 transparent, les preconnect et dns-prefetch sont supprimés (un simple indice ouvre déjà une connexion TLS et livre l'IP), et les médias tiers déjà catalogués perdent leur autoplay. Le catalogue livré compte 183 signatures pour 71 vendeurs, et tu peux en ajouter, en corriger ou en supprimer depuis l'admin. Par défaut un script tiers inconnu passe, une iframe inconnue est bloquée.

Conçu pour tourner derrière un cache de page

Rien de ce que le serveur rend ne dépend du cookie du visiteur : les mêmes balises neutralisées sont servies à tout le monde, et le runtime les restaure dans le navigateur, dans l'ordre du document, pour les seules catégories accordées. L'état est estampillé sur la balise html avant le premier affichage, donc pas de bannière qui clignote. Le jeton d'écriture est récupéré frais avant chaque envoi, jamais embarqué dans du HTML mis en cache : sa récupération est plafonnée à 4 secondes et son absence ne bloque jamais un choix.

Onze profils de conformité, neuf régimes nommés

RGPD, UK PECR, nLPD suisse, Loi 25 québécoise, LGPD, CCPA, POPIA, PIPL, DPDP indienne, plus un profil australien et un profil américain générique. Le profil n'est pas décoratif : il décide du modèle légal (opt-in, ou accordé jusqu'au refus pour le CCPA, l'US générique et l'Australie), de la présence du lien « Do Not Sell or Share » — un clic exécute réellement l'opt-out, il n'ouvre pas un panneau —, du caractère contraignant ou non du signal Global Privacy Control, et de la langue comme de l'autorité de contrôle citées dans les documents générés. La détection par pays existe, désactivée par défaut.

Un registre de consentement que tu peux vérifier

Chaque acceptation, refus, modification ou retrait rejoint une table dédiée : ligne signée en HMAC-SHA-256 (ou SHA3-256) avec le hash de la précédente, ancre de tête conservée hors table pour qu'une troncature se voie. Sont inscrits un jeton de navigateur pseudonyme, l'IP tronquée, une empreinte du user-agent, la page, le profil en vigueur, la révision exacte de la bannière affichée et l'empreinte des politiques liées — jamais de nom ni d'adresse. Un bouton vérifie toute la chaîne et nomme la rupture ; l'export CSV ou JSON porte une enveloppe permettant à un tiers de re-vérifier un extrait. Rétention par défaut : 5 ans.

Scanner de site et catalogue éditable

Livré désactivé, à activer quand tu le veux : le scanner parcourt tes propres pages sur WP-Cron (25 URL par défaut, réglable jusqu'à 500) en entrelaçant accueil, pages, articles, types de contenu et taxonomies. Trois sources distinctes et tracées : le HTML servi, les en-têtes Set-Cookie — les seuls cookies qu'un scan serveur peut prouver, et les seuls que rien ne peut bloquer — et une sonde en page réservée aux administrateurs connectés, qui attrape ce qu'un gestionnaire de balises injecte au runtime. Une trouvaille devient une règle de catalogue en un clic. Et le rapport dit ce qu'il n'a pas lu au lieu de faire passer un balayage partiel pour un inventaire.

Documents légaux et portail de demandes

Quatre documents générés en pages WordPress versionnées — politique cookies, politique de confidentialité, mentions légales, conditions générales — dans la langue de la juridiction (français, anglais, portugais), avec l'autorité de contrôle et le tableau des traceurs issus du scan. La publication est refusée tant qu'un champ légalement obligatoire est vide, et chaque document porte un avertissement rappelant de le faire relire. Côté droits, le shortcode owc_dsar_form ouvre sept types de demandes, vérifiées par un aller-retour e-mail ; le délai de l'article 12.3 démarre à la confirmation d'identité, et la demande ouvre en parallèle une demande native WordPress pour que l'export ou l'effacement couvre toutes les extensions du site.

Comparaison

Face aux alternatives

Données vérifiables. Cocher uniquement ce qui existe vraiment chez le concurrent.

CritèreOW ConsentComplianzCookieYesBorlabs Cookie
Modèle économiqueGratuit, GPL-2.0-or-laterFreemium (Pro payant)Freemium (Pro payant)Non annoncé
Clé de licence à activerAucunePour la version ProPour la version ProNon annoncé
Méthode de blocage des traceursRéécriture du HTML côté serveur, 183 signatures livrées et éditablesNon annoncéNon annoncéNon annoncé
Registre de preuves chaîné et vérifiableChaîne HMAC-SHA-256, ancre hors table, vérification en un clicNon annoncéNon annoncéNon annoncé
Profils de conformité livrés11 profils, 9 régimes nommésNon annoncéNon annoncéNon annoncé
Bannière de consentement paramétrable4 positions, thème clair / sombre / auto
Portail de demandes d'exercice de droitsInclus : formulaire, vérification e-mail, délai art. 12.3Non annoncéNon annoncéNon annoncé
Où vivent les consentements enregistrésDans la base de ton hébergement, aucun service tiersNon annoncéNon annoncéNon annoncé
Intégration

Trois façons d'intégrer un formulaire

Pas de page builder propriétaire forcé. Choisis l'approche qui correspond à ton stack.

<!-- Ce que ton thème imprime -->
<script src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
<iframe src="https://www.youtube.com/embed/VIDEO_ID"></iframe>

<!-- Ce que reçoit le visiteur avant tout consentement (mode strict, par défaut) -->
<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>

<!-- Ce balisage est le même pour tout le monde, cache de page compris.
     C'est le runtime, dans le navigateur, qui restaure les balises des
     catégories accordées, dans l'ordre du document. Un retrait de
     consentement recharge la page : un script déjà exécuté ne se décharge pas. -->
Questions techniques

Doutes raisonnables, réponses directes

Les traceurs sont-ils vraiment bloqués avant le consentement ?

Oui, et le blocage vit dans le balisage, pas dans une promesse. En mode strict, activé par défaut, le document est capturé en sortie et cinq passes réécrivent scripts, iframes, pixels, indices de connexion et médias tiers. Deux limites que tu dois connaître : le blocage réel repose sur le catalogue de 183 signatures et sur les signatures de code en ligne — un script tiers inconnu est autorisé par défaut, une iframe inconnue est bloquée —, et si tu désactives le mode strict, seuls les scripts enregistrés par WordPress sont traités, pas ceux écrits en dur dans le thème. Enfin, un document de plus de 8 Mo ou un échec du moteur d'expressions régulières est servi intact plutôt que cassé.

Est-ce compatible avec mon cache de page ?

Oui, c'est la contrainte de départ. Le HTML servi est identique pour tous les visiteurs, traceurs neutralisés compris, et l'état de consentement est reconstruit dans le navigateur depuis le cookie puis appliqué avant le premier affichage. Aucun cache ne peut donc servir les choix d'un visiteur à un autre. La contrepartie est explicite : le régime du visiteur est décidé côté client, donc sans JavaScript rien n'est enregistré. Un visiteur sans JavaScript voit un bloc noscript, ne charge rien de non essentiel, et n'est jamais enfermé derrière une fenêtre qu'il ne peut pas fermer.

Qu'est-ce que le profil de conformité change concrètement ?

Il décide du modèle légal : opt-in pour le RGPD, le UK PECR, la nLPD suisse, la Loi 25, la LGPD, POPIA, PIPL et DPDP ; accordé jusqu'au refus pour le CCPA, le profil américain générique et l'Australie. Il décide aussi de l'affichage du lien « Do Not Sell or Share » (CCPA et US générique seulement), du caractère contraignant du signal GPC (mêmes deux profils : ailleurs le signal est reflété à l'écran mais rien n'est enregistré), et de la langue comme de l'autorité de contrôle des documents générés. La détection par pays est facultative et désactivée par défaut ; elle échoue fermé, c'est-à-dire vers le régime le plus strict. Deux limites assumées : pas de granularité par État américain ni par province canadienne, et le fichier MaxMind n'est ni téléchargé ni téléversable par le plugin — tu le déposes toi-même dans uploads/ow-geoip/.

Le registre prouve-t-il vraiment quelque chose ?

Il prouve autant que la clé qui le signe, et le plugin te le dit franchement. Chaque ligne est signée en HMAC avec le hash de la précédente et l'ancre de tête est conservée hors de la table, si bien qu'une modification, une troncature ou un vidage se voient à la vérification. Mais si AUTH_KEY et AUTH_SALT ne sont pas dans ton wp-config.php et que tu n'as pas défini OWC_LEDGER_KEY, la clé provient de la base : quiconque a accès à la base peut re-signer la chaîne. Dans ce cas le plugin affiche un avertissement d'administration et rapporte lui-même que la chaîne n'est plus infalsifiable, au lieu de continuer à l'affirmer.

Le module IAB TCF fait-il de mon site un CMP certifié ?

Non, et c'est important de le dire avant l'achat plutôt qu'après. Le module implémente TCF v2.2 côté navigateur — API __tcfapi, chaîne TC encodée, cookie euconsent-v2 — mais il ne fournit pas de CMP ID : celui-ci est attribué par IAB Europe après enregistrement, et sans lui le module n'émet strictement rien. Le périmètre est également borné : segment Core uniquement, aucune publisher restriction émise, deux fonctionnalités spéciales prises en charge, pas de portée globale. En clair, il fonctionne comme un CMP compatible non officiel, ce qui suffit à beaucoup d'intégrations mais ne remplace pas un enregistrement officiel — Google AdSense, en particulier, le refuse en production dans l'EEE. Le module est désactivé par défaut.

Que se passe-t-il si je désactive ou si je supprime le plugin ?

Une désactivation ne touche à aucune donnée : elle se contente de retirer les tâches planifiées. À la suppression, deux choses partent toujours, quel que soit ton réglage : les tâches planifiées et la table des demandes d'exercice de droits, seule table à contenir des données directement identifiantes de tiers que plus rien ne borne une fois le plugin parti. Le reste — registre de consentement, trouvailles du scanner, catalogue de traceurs — survit, sauf si tu as coché explicitement l'effacement complet, décoché par défaut : ta preuve de consentement au titre de l'article 7.1 ne doit pas disparaître avec une désinstallation.

Gratuit. Sans astérisque.

Aucune version Pro, aucune clé de licence.

OW Consent est publié sous licence GPL-2.0-or-later. Tout ce que décrit cette page se trouve dans le .zip que tu télécharges : aucun module réservé, aucun abonnement, aucune limite sur le nombre de pages, de consentements ou de demandes.

  • Tout est inclus : bannière, blocage des traceurs, scanner, catalogue éditable, registre chaîné, générateur de documents, portail de demandes, Consent Mode v2, TCF v2.2 et Global Privacy Control.
  • Le .zip se télécharge sur optionweb.dev : installe-le via Extensions → Ajouter → Téléverser une extension. WordPress 6.2 minimum — en dessous, le plugin refuse de démarrer et le dit, plutôt que d'afficher une bannière qui ne bloque rien.
  • Aucun service tiers, aucune vérification de licence, aucun traceur ajouté : consentements, demandes et documents restent dans la base de ton hébergement.
  • Le code est sous GPL-2.0-or-later, lisible et modifiable, avec ses points d'extension documentés : filtres owc_settings, owc_scripts_catalog, owc_blocker_allowlist, owc_policy_template, et les actions du registre.
Conçu par Julien Daniel · Châtelet, Belgique