De uitgangssituatie
Vanaf 19 juni 2026 heeft elke B2C-webshop in de EU een herroepingsknop nodig. De rechtsgrondslag is Richtlijn (EU) 2023/2673, die artikel 11a toevoegt aan de Richtlijn consumentenrechten (2011/83/EU). In Nederland is dit omgezet via artikel 6:230oa van het Burgerlijk Wetboek. Er is geen overgangsperiode.
De knop kent twee fasen: „Overeenkomst ontbinden“ als instap, „Herroeping bevestigen“ aan het einde van het formulier. Daartussen een kort formulier, gevolgd door een ontvangstbevestiging per e-mail op een duurzame gegevensdrager.
Manier A: script-tag in de header
De eenvoudigste manier. Je voegt een script-tag toe aan het header-gedeelte van je WordPress-installatie. Het script laadt de widget, herkent je shop via de widget-key en rendert de knop in een Shadow DOM, zonder te botsen met je thema-CSS.
Daarvoor bewerk je de header.php van je child-thema. Nooit die van het parent-thema, anders is de regel na de volgende update verdwenen.
<!-- widget/header.php, im Child-Theme -->
<?php wp_head(); ?>
<script
src="https://widerrufbutton.net/widget/v1/wh.js"
data-shop-id="<?php echo esc_attr(get_option('wrb_shop_id')); ?>"
data-position="footer"
data-lang="de"
async
defer
></script>Wie geen toegang tot het thema heeft, kan hetzelfde script via een plug-in zoals „Insert Headers and Footers“ invoegen. Werkt identiek, maar je hebt er één afhankelijkheid bij.
Manier B: functions.php-filter
Netter dan een directe ingreep in de header.php is een hook. Je registreert een functie die het script via WordPress' eigen wp_enqueue_scripts-filter uitlevert. Voordeel: je thema blijft onaangeroerd en de regel laat zich netjes uitschakelen.
// functions.php deines Child-Themes
add_action('wp_footer', function () {
$shop_id = get_option('wrb_shop_id');
if (empty($shop_id)) {
return;
}
printf(
'<script src="https://widerrufbutton.net/widget/v1/wh.js" ' .
'data-shop-id="%s" data-position="footer" data-lang="de" async defer></script>',
esc_attr($shop_id)
);
}, 99);De prioriteitswaarde 99 zorgt ervoor dat het script na alle andere footer-scripts wordt geladen. Dat voorkomt dat caching-plug-ins het te vroeg minificeren.
Manier C: WordPress-plug-in
Voor ondernemers zonder ontwikkelaarsachtergrond werken we aan een officiële WordPress-plug-in. Installeren, shop-ID invoeren, opslaan. De knop verschijnt in de footer. De plug-in zal het script hooken zoals in Manier B, een instellingenpagina in de WP-admin bieden en een controle inbouwen of het ingestelde domein bij de WordPress-installatie past.
Wie vandaag al live wil, gebruikt Manier A of B. De plug-in is een gemak, geen voorwaarde.
Conflicten met page builders
WooCommerce-shops draaien zelden puur. De meeste gebruiken Elementor, Divi, Bricks of WPBakery. Elk van deze builders rendert footer-templates zelfstandig en omzeilt soms de standaard hook-flow.
Elementor: controleer of je footer een „Theme Builder Footer“ is. Zo ja, voeg de widget toe via een HTML-element in de Elementor-footer, niet in de functions.php. Anders rendert Elementor eroverheen.
Divi: de Divi Theme Options hebben een veld „Code Integration“. Voeg script-tags daar toe, in de sectie „Body“.
Bricks: gebruikt een eigen hook genaamd bricks_body_end. Je enqueue moet daarop richten.
Cache- en beveiligingsplug-ins
WP Rocket, WP Super Cache, LiteSpeed Cache en Autoptimize komen graag aan script-tags. Ze minificeren, combineren, vertragen of laden ze via JavaScript na. Bij de herroepingsknop is dat een probleem, omdat de knop mogelijk te laat verschijnt of helemaal niet laadt.
Oplossing: sluit widerrufbutton.net in de cache-instellingen uit van minify en combine. Bij WP Rocket heet dat „Never delay JavaScript“. Bij LiteSpeed „JS Excludes“. Bij Autoptimize „Exclude scripts from Autoptimize“.
Wordfence en iThemes Security kunnen POST-verzoeken naar externe domeinen als verdacht markeren. De widget stuurt de herroeping naar onze API, niet vanaf je server. Het verzoek gaat vanuit de browser van de klant rechtstreeks naar ons, dus er zou geen conflict mogen ontstaan. Mocht dat toch zo zijn: zet widerrufbutton.net op de whitelist.
Controleren of de installatie echt werkt
Open je shop in de incognitomodus. Scroll niet. De knop moet zichtbaar zijn in de navigatie of footer. Klik erop. De modal moet zonder scroll-sprong verschijnen. Typ een testnaam, een test-e-mail, klik op „Herroeping bevestigen“. Je zou binnen enkele seconden een e-mail moeten ontvangen.
In het WiderrufButton-dashboard verschijnt de test-herroeping onder Herroepingen. Verwijder de testregel daarna om je statistieken schoon te houden.
Wat de wet technisch vereist
De knop moet zonder scrollen bereikbaar zijn, wat in de praktijk „above the fold“ in de navigatie of zichtbare footer betekent. Hij moet gedurende de volledige herroepingstermijn beschikbaar zijn, dus minstens veertien dagen na ontvangst van de goederen. De shop mag geen login eisen.
De ontvangstbevestiging moet zonder onnodige vertraging volgen, de volledige tekst van de herroepingsverklaring bevatten, inclusief datum en tijd, en op een duurzame gegevensdrager worden geleverd. Een e-mail volstaat. Een toast-popup niet.
Alles wat daarachter technisch noodzakelijk is, neemt de widget over: validatie, rate limiting (10 verzoeken per minuut per IP), CORS-tegencontrole tegen je geregistreerde domein, mailverzending, langetermijnarchivering met hash-keten. Details daarover in de gids voor de herroepingsknop.
Risico op ingebrekestelling en verlenging van de termijn
Ontbreekt de knop, dan treden twee mechanismen in werking. Concurrentieverenigingen sturen ingebrekestellingen die doorgaans 500 tot 2.000 € kosten. En de herroepingstermijn verlengt automatisch tot twaalf maanden en veertien dagen. Een klant kan dan een heel jaar lang herroepen.
Beide risico's zijn te vermijden door de knop vandaag in te bouwen.