{"id":323710,"date":"2026-06-10T21:53:48","date_gmt":"2026-06-10T21:53:48","guid":{"rendered":"https:\/\/fr-ca.wordpress.org\/plugins\/cweb-turnstile-for-elementor-forms\/"},"modified":"2026-06-11T04:03:48","modified_gmt":"2026-06-11T04:03:48","slug":"cweb-form-protection-turnstile-elementor","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/cweb-form-protection-turnstile-elementor\/","author":15572273,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.1","stable_tag":"1.1.1","tested":"7.0","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"CWeb Form Protection with Turnstile for Elementor Forms","header_author":"Collectif WEB","header_description":"Cloudflare Turnstile for your forms, with a per-form field for Elementor Pro so you choose exactly which forms are protected.","assets_banners_color":"151f36","last_updated":"2026-06-11 04:03:48","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/collectifweb\/cweb-form-protection-turnstile-elementor","header_author_uri":"https:\/\/collectif-web.ca","rating":0,"author_block_rating":0,"active_installs":0,"downloads":69,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.1":{"tag":"1.0.1","author":"alexandreminem","date":"2026-06-10 22:14:39"},"1.1.0":{"tag":"1.1.0","author":"alexandreminem","date":"2026-06-10 22:40:43"},"1.1.1":{"tag":"1.1.1","author":"alexandreminem","date":"2026-06-11 04:03:48"}},"upgrade_notice":{"1.1.1":"<p>Fixes comment replies from the WordPress admin being blocked when comment protection is on (the public form is unaffected), and stops a failed widget from retrying Cloudflare indefinitely.<\/p>","1.1.0":"<p>Adds an optional setting to protect all Elementor Pro forms at once. Existing setups are unchanged: the option is off by default.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3568108,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3568108,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3568108,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3568108,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3568108,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.1","1.1.0","1.1.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3568129,"resolution":"1","location":"assets","locale":"","width":1482,"height":885},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3568129,"resolution":"2","location":"assets","locale":"","width":950,"height":883},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3568129,"resolution":"3","location":"assets","locale":"","width":653,"height":598}},"screenshots":{"1":"The settings page (keys, appearance, WordPress form toggles).","2":"The \"Cloudflare Turnstile\" field inside an Elementor Pro form.","3":"The Turnstile widget displayed on a protected form."}},"plugin_section":[],"plugin_tags":[362,3882,76538,599,214603],"plugin_category":[44,54],"plugin_contributors":[263862],"plugin_business_model":[],"class_list":["post-323710","plugin","type-plugin","status-publish","hentry","plugin_tags-captcha","plugin_tags-cloudflare","plugin_tags-elementor","plugin_tags-spam","plugin_tags-turnstile","plugin_category-discussion-and-community","plugin_category-security-and-spam-protection","plugin_contributors-alexandreminem","plugin_committers-alexandreminem"],"banners":{"banner":"https:\/\/ps.w.org\/cweb-form-protection-turnstile-elementor\/assets\/banner-772x250.png?rev=3568108","banner_2x":"https:\/\/ps.w.org\/cweb-form-protection-turnstile-elementor\/assets\/banner-1544x500.png?rev=3568108","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/cweb-form-protection-turnstile-elementor\/assets\/icon.svg?rev=3568108","icon":"https:\/\/ps.w.org\/cweb-form-protection-turnstile-elementor\/assets\/icon.svg?rev=3568108","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/cweb-form-protection-turnstile-elementor\/assets\/screenshot-1.png?rev=3568129","caption":"The settings page (keys, appearance, WordPress form toggles)."},{"src":"https:\/\/ps.w.org\/cweb-form-protection-turnstile-elementor\/assets\/screenshot-2.png?rev=3568129","caption":"The \"Cloudflare Turnstile\" field inside an Elementor Pro form."},{"src":"https:\/\/ps.w.org\/cweb-form-protection-turnstile-elementor\/assets\/screenshot-3.png?rev=3568129","caption":"The Turnstile widget displayed on a protected form."}],"raw_content":"<!--section=description-->\n<p>This plugin adds <a href=\"https:\/\/www.cloudflare.com\/products\/turnstile\/\">Cloudflare Turnstile<\/a> \u2014 a free, privacy-friendly CAPTCHA alternative \u2014 to your WordPress site.<\/p>\n\n<p>Its key difference from other Turnstile plugins is <strong>per-form control for Elementor Pro<\/strong>: instead of toggling Turnstile globally for every Elementor form, you add a <strong>\"Cloudflare Turnstile\" field<\/strong> to the specific forms you want to protect, exactly like Elementor's built-in reCAPTCHA field. Forms without the field are left untouched. If you prefer the all-at-once approach, an optional setting protects <strong>every<\/strong> Elementor Pro form automatically.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li><strong>Per-form Turnstile field for Elementor Pro Forms<\/strong> \u2014 drag it into the forms you choose.<\/li>\n<li><strong>Optional \"all Elementor Pro forms\" switch<\/strong> \u2014 protect every Elementor Pro form at once, without adding the field to each one (off by default).<\/li>\n<li>Optional protection for the built-in WordPress forms:\n\n<ul>\n<li>Login<\/li>\n<li>Registration<\/li>\n<li>Lost password<\/li>\n<li>Comments<\/li>\n<\/ul><\/li>\n<li>One-click import of keys and settings from the \"Simple Cloudflare Turnstile\" plugin (no need to recreate your Cloudflare keys).<\/li>\n<li>Global widget appearance settings (theme, size, visibility, language).<\/li>\n<li>Strict server-side token verification (single-use tokens, 5-minute validity).<\/li>\n<li>Secure-by-default behaviour: missing\/invalid tokens are always blocked; the\nbehaviour when Cloudflare itself is unreachable is configurable.<\/li>\n<li>Write-only secret key (never displayed or sent to the browser).<\/li>\n<li>Lightweight: in the default per-form mode, the Cloudflare script loads only on pages that actually show a widget. (The optional \"all forms\" mode loads it across the front end so late-loaded forms are covered.)<\/li>\n<\/ul>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li>The Elementor field requires <strong>Elementor Pro<\/strong> (the Forms widget is a Pro feature). Without Elementor Pro, the WordPress form integrations still work.<\/li>\n<li>A free Cloudflare Turnstile site key and secret key.<\/li>\n<\/ul>\n\n<h4>Third-party service<\/h4>\n\n<p>This plugin renders the official Cloudflare Turnstile widget and verifies tokens with Cloudflare.<\/p>\n\n<ul>\n<li>When a protected form is displayed, the visitor's browser loads <code>https:\/\/challenges.cloudflare.com\/turnstile\/v0\/api.js<\/code> from Cloudflare.<\/li>\n<li><p>When a protected form is submitted, your server sends a request to <code>https:\/\/challenges.cloudflare.com\/turnstile\/v0\/siteverify<\/code> containing: the Turnstile token from the widget (<code>cf-turnstile-response<\/code>), your secret key, and \u2014 unless disabled with the <code>cwebts_remoteip<\/code> filter \u2014 the visitor's IP address (<code>REMOTE_ADDR<\/code>). The secret key is never sent to the browser.<\/p><\/li>\n<li><p>Cloudflare Turnstile: https:\/\/www.cloudflare.com\/products\/turnstile\/<\/p><\/li>\n<li>Terms of Service: https:\/\/www.cloudflare.com\/website-terms\/<\/li>\n<li>Privacy Policy: https:\/\/www.cloudflare.com\/privacypolicy\/<\/li>\n<\/ul>\n\n<h4>About the name<\/h4>\n\n<p>The distinctive part of the name is <strong>CWeb Form Protection<\/strong>, after <strong>Collectif WEB<\/strong>, the agency that maintains this plugin. The trailing \"with Turnstile for Elementor Forms\" only describes what the plugin integrates with: \"Turnstile\" is the Cloudflare service it uses, and \"for Elementor Forms\" signals compatibility with Elementor's Forms widget. This plugin is not affiliated with, sponsored by, or endorsed by Cloudflare, Inc. or Elementor Ltd.<\/p>\n\n<h4>Trademarks<\/h4>\n\n<p>Not affiliated with Cloudflare, Inc. or Elementor Ltd. \"Cloudflare\" and \"Turnstile\" are trademarks of Cloudflare, Inc. \"Elementor\" is a trademark of Elementor Ltd. These names are used only to describe compatibility.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to <code>\/wp-content\/plugins\/<\/code> or install it from the Plugins screen.<\/li>\n<li>Activate it.<\/li>\n<li>Go to <strong>Settings \u2192 CWeb Form Protection<\/strong> and enter your Cloudflare <strong>site key<\/strong> and <strong>secret key<\/strong>.<\/li>\n<li>(Elementor) Edit a form, add the <strong>Cloudflare Turnstile<\/strong> field where you want the widget, then save.<\/li>\n<li>(WordPress forms) Enable the toggles for login, registration, lost password and\/or comments.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20protect%20every%20elementor%20form%20automatically%3F\"><h3>Does it protect every Elementor form automatically?<\/h3><\/dt>\n<dd><p>By default, no \u2014 and that is the point. You add the Turnstile field only to the forms you want to protect, and forms without the field are left untouched. If you prefer, turn on <strong>Settings \u2192 CWeb Form Protection \u2192 Elementor Pro forms \u2192 \"All Elementor Pro forms\"<\/strong> to protect every Elementor Pro form automatically, without adding the field to each one.<\/p><\/dd>\n<dt id=\"does%20it%20work%20without%20elementor%20pro%3F\"><h3>Does it work without Elementor Pro?<\/h3><\/dt>\n<dd><p>The Elementor field needs Elementor Pro (Forms is a Pro module). The WordPress login, registration, lost password and comment integrations work on any WordPress site.<\/p><\/dd>\n<dt id=\"is%20the%20secret%20key%20safe%3F\"><h3>Is the secret key safe?<\/h3><\/dt>\n<dd><p>Yes. The secret key is stored server-side, is never printed in the page, and is never sent to the browser. The settings screen never displays it back.<\/p><\/dd>\n<dt id=\"i%20already%20use%20%22simple%20cloudflare%20turnstile%22.%20do%20i%20have%20to%20recreate%20my%20keys%3F\"><h3>I already use \"Simple Cloudflare Turnstile\". Do I have to recreate my keys?<\/h3><\/dt>\n<dd><p>No. If that plugin's settings are present, the <strong>Settings \u2192 CWeb Form Protection<\/strong> page shows an \"Import keys &amp; settings\" button that copies your site key, secret key, appearance options and form toggles over. Your existing Cloudflare keys keep working \u2014 nothing is regenerated, and the other plugin is left untouched.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20cloudflare%20can%27t%20be%20reached%3F\"><h3>What happens if Cloudflare can't be reached?<\/h3><\/dt>\n<dd><p>Missing or invalid tokens are always rejected. If Cloudflare's verification endpoint is unreachable (network error or timeout), the <strong>\"If Cloudflare is unreachable\"<\/strong> setting decides whether to block (default, more secure) or allow (more available) the submission.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Fix: replying to a comment from the WordPress admin (the <code>replyto-comment<\/code> AJAX action) was blocked when \"Protect comments\" was enabled. WordPress builds those replies server-side with no Turnstile widget, so no token is ever sent. Moderators now skip the check in the admin AJAX context; the public comment form stays protected.<\/li>\n<li>Fix: a widget hitting a persistent render error (for example a site key restricted to another domain) retried forever, flooding Cloudflare with failed requests and flickering. It now retries a couple of times to recover from a transient network glitch, then stops; a successful challenge clears the counter. No change to server-side verification.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>New: optional \"Protect all Elementor Pro forms\" setting (off by default). When enabled, the Turnstile widget is added to every Elementor Pro form automatically \u2014 including forms loaded in popups or via AJAX \u2014 without adding the per-form field. The per-form field remains the default.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fix: the Cloudflare Turnstile widget now renders on the WooCommerce \"Lost password\" form (\/my-account\/lost-password\/). Previously the widget did not appear and every password reset was rejected.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: per-form Turnstile field for Elementor Pro; WordPress login, registration, lost password and comment integrations; global appearance settings; strict server-side verification.<\/li>\n<\/ul>","raw_excerpt":"Add Cloudflare Turnstile to your forms \u2014 with a per-form field for Elementor Pro so you choose exactly which forms are protected.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/323710","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=323710"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/alexandreminem"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=323710"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=323710"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=323710"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=323710"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=323710"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=323710"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}