{"id":199265,"date":"2024-08-13T19:17:00","date_gmt":"2024-08-13T19:17:00","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/custom-captcha-field-for-fluent-forms\/"},"modified":"2026-07-09T19:27:12","modified_gmt":"2026-07-09T19:27:12","slug":"custom-captcha-field-for-fluent-forms","status":"publish","type":"plugin","link":"https:\/\/twd.wordpress.org\/plugins\/custom-captcha-field-for-fluent-forms\/","author":17587254,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.0.0","stable_tag":"2.0.0","tested":"7.0.2","requires":"5.0","requires_php":"7.4","requires_plugins":null,"header_name":"Custom Captcha Field for Fluent Forms","header_author":"Lukman Nakib","header_description":"Custom Captcha - 3 types of captcha","assets_banners_color":"b2b0ac","last_updated":"2026-07-09 19:27:12","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/nkb-bd.github.io\/","rating":0,"author_block_rating":0,"active_installs":100,"downloads":1655,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","changelog"],"tags":{"0.1":{"tag":"0.1","author":"pyrobd","date":"2024-08-14 05:34:05"},"2.0.0":{"tag":"2.0.0","author":"pyrobd","date":"2026-07-09 19:27:12"}},"upgrade_notice":[],"ratings":{"1":0,"2":0,"3":0,"4":0,"5":0},"assets_icons":[],"assets_banners":{"banner-772x250.png":{"filename":"banner-772x250.png","revision":3601920,"resolution":"772x250","location":"assets","locale":"","width":842,"height":332}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.1","2.0.0"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[109,362,185045,144425,599],"plugin_category":[38],"plugin_contributors":[184410],"plugin_business_model":[],"class_list":["post-199265","plugin","type-plugin","status-publish","hentry","plugin_tags-antispam","plugin_tags-captcha","plugin_tags-fluent-forms","plugin_tags-math-captcha","plugin_tags-spam","plugin_category-authentication","plugin_contributors-pyrobd","plugin_committers-pyrobd"],"banners":{"banner":"https:\/\/ps.w.org\/custom-captcha-field-for-fluent-forms\/assets\/banner-772x250.png?rev=3601920","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/custom-captcha-field-for-fluent-forms_b2b0ac.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Adds a \"Custom Captcha\" field to the Fluent Forms editor with three challenge types:<\/p>\n\n<ul>\n<li><strong>Image captcha<\/strong> \u2014 a 6-character code rendered as an image, with customizable text color and a transparent background by default so it blends with any form design<\/li>\n<li><strong>Math captcha<\/strong> \u2014 a simple arithmetic question rendered as an image<\/li>\n<li><strong>Question and answer<\/strong> \u2014 you define the question (field label) and the expected answer<\/li>\n<\/ul>\n\n<p>Challenges are single-use and expire after 15 minutes. Answers are stored server-side via WordPress transients \u2014 nothing is exposed to the browser except the image itself. Visitors get a refresh button to request a new challenge, and the captcha automatically renews after each AJAX submission, so it also works on cached pages.<\/p>\n\n<p>On top of the captcha you get two extra spam defenses:<\/p>\n\n<ul>\n<li><strong>Time-trap<\/strong> (optional, off by default) \u2014 submissions completed faster than a human possibly could are rejected via an HMAC-signed timestamp; enable it and set the minimum submit time per field<\/li>\n<li><strong>Disposable email blocking<\/strong> (optional, on by default) \u2014 rejects submissions where an email field uses a temporary\/disposable email domain like mailinator.com or yopmail.com; extend the list with the <code>ffc_captcha_blocked_email_domains<\/code> filter<\/li>\n<\/ul>\n\n<p>Everything runs on your own server: no external captcha service, no API keys, no cookies, no visitor data sent anywhere.<\/p>\n\n<h3>Requirements<\/h3>\n\n<p><a href=\"https:\/\/wordpress.org\/plugins\/fluentform\">Fluent Forms<\/a> is required. The PHP GD extension is recommended for image rendering (with a plain-text fallback when unavailable).<\/p>\n\n<h3>How To Use<\/h3>\n\n<ol>\n<li>Activate the plugin<\/li>\n<li>Edit a form in Fluent Forms \u2014 a new \"Custom Captcha\" field appears in the editor<\/li>\n<li>Drop it into your form and pick the captcha type in the field settings<\/li>\n<li>Optionally set the text color, background color (RGB values like \"68, 68, 68\", or \"transparent\") and error message<\/li>\n<\/ol>\n\n<!--section=installation-->\n<ol>\n<li>Login to your WordPress Admin Area<\/li>\n<li>Go to Plugins -&gt; Add New<\/li>\n<li>Type \"Custom Captcha Field for Fluent Forms\" into the Search and hit Enter<\/li>\n<li>Find this plugin and click \"Install Now\"<\/li>\n<li>Activate the plugin<\/li>\n<li>Add the Custom Captcha field to your form in the Fluent Forms editor<\/li>\n<\/ol>\n\n<!--section=changelog-->\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Security: challenge answers are no longer stored in a publicly readable file; each challenge is now a single-use, expiring token stored via WordPress transients<\/li>\n<li>Security: removed eval() from math captcha validation<\/li>\n<li>Added: transparent captcha background (new default) and customizable text\/background colors<\/li>\n<li>Added: refresh button on the captcha image<\/li>\n<li>Added: captcha auto-renews after AJAX submissions and on page load, so it works with page caching<\/li>\n<li>Added: optional time-trap \u2014 reject submissions completed faster than a configurable minimum (default 3 seconds) or carrying a tampered timestamp<\/li>\n<li>Added: optional disposable email blocking for the whole form (filterable via ffc_captcha_blocked_email_domains)<\/li>\n<li>Fixed: compatible with Fluent Forms 5+ hook names (validation no longer relies on a deprecated hook)<\/li>\n<li>Fixed: math challenges no longer produce negative answers<\/li>\n<li>Fixed: text captcha comparison is now trimmed and case-insensitive<\/li>\n<li>Fixed: field renamed from \"Recaptcha\" to \"Custom Captcha\" (this plugin is not related to Google reCAPTCHA)<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<\/ul>","raw_excerpt":"Lightweight, self-hosted captcha field for Fluent Forms \u2014 image, math and question\/answer challenges. No external services, no tracking.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/199265","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=199265"}],"author":[{"embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/pyrobd"}],"wp:attachment":[{"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=199265"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=199265"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=199265"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=199265"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=199265"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=199265"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}