{"id":303401,"date":"2026-08-30T15:41:47","date_gmt":"2026-08-30T15:41:47","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/dlit-wp-math-captcha\/"},"modified":"2026-08-30T15:41:20","modified_gmt":"2026-08-30T15:41:20","slug":"dlit-easy-math-captcha","status":"publish","type":"plugin","link":"https:\/\/sah.wordpress.org\/plugins\/dlit-easy-math-captcha\/","author":23485784,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.5.2","stable_tag":"1.5.2","tested":"7.1","requires":"5.0","requires_php":"7.4","requires_plugins":null,"header_name":"Dlit Easy Math Captcha","header_author":"Daileit","header_description":"A simple WordPress plugin that applies math captcha on comments, product reviews, login page, sign up page, and CF7 forms. Configurable difficulty (number of digits, operation type).","assets_banners_color":"","last_updated":"2026-08-30 15:41:20","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/daileit\/dlit-wp-math-captcha","header_author_uri":"https:\/\/github.com\/daileit","rating":0,"author_block_rating":0,"active_installs":10,"downloads":54,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.5.2":{"tag":"1.5.2","author":"dlit","date":"2026-08-30 15:41:20","revision":3672783}},"upgrade_notice":{"1.5.0":"<p>Security release: fixes captcha bypasses on comments and WooCommerce reviews. Update recommended.<\/p>"},"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.5.2"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[362,107,144425,2419,286],"plugin_category":[44,45],"plugin_contributors":[278358],"plugin_business_model":[],"class_list":["post-303401","plugin","type-plugin","status-publish","hentry","plugin_tags-captcha","plugin_tags-comments","plugin_tags-math-captcha","plugin_tags-spam-protection","plugin_tags-woocommerce","plugin_category-discussion-and-community","plugin_category-ecommerce","plugin_contributors-dlit","plugin_committers-dlit"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/dlit-easy-math-captcha.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Dlit Easy Math Captcha adds configurable math captcha protection to:<\/p>\n\n<ul>\n<li>WordPress comments<\/li>\n<li>Login form<\/li>\n<li>Registration form<\/li>\n<li>WooCommerce product reviews<\/li>\n<li>Contact Form 7 forms via [math_captcha]<\/li>\n<\/ul>\n\n<p>Features:<\/p>\n\n<ul>\n<li>Answer-digit based difficulty (1-3 digits)<\/li>\n<li>Configurable operations: addition, subtraction, multiplication<\/li>\n<li>Question style: digits, emoji (1\ufe0f\u20e33\ufe0f\u20e3 \u2795 7\ufe0f\u20e3), or mixed<\/li>\n<li>Per-integration simple one-line mode to minimize UI impact<\/li>\n<li>Stateless HMAC-signed single-use token verification (no database writes on page render)<\/li>\n<li>Nonce verification for submissions<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to \/wp-content\/plugins\/.<\/li>\n<li>Activate the plugin in WordPress.<\/li>\n<li>Go to Settings &gt; Math Captcha.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20do%20i%20use%20it%20with%20contact%20form%207%3F\"><h3>How do I use it with Contact Form 7?<\/h3><\/dt>\n<dd><p>Add this tag in your CF7 form (the name, e.g. <code>captcha-1<\/code>, lets CF7 show the validation error next to the field):<\/p>\n\n<p>[math_captcha captcha-1]<\/p>\n\n<p>Optional flags (no colons):<\/p>\n\n<p>[math_captcha captcha-1 simple]            - force compact one-line layout\n[math_captcha captcha-1 full]              - force full layout with description\n[math_captcha captcha-1 light]             - force light text mode\n[math_captcha captcha-1 dark]              - force dark text mode\n[math_captcha captcha-1 id:my-id]          - set a custom HTML id on the input\n[math_captcha captcha-1 id:my-id simple]   - combine id + compact layout\n[math_captcha captcha-1 simple light]      - combine compact + light text mode\n[math_captcha captcha-1 id:my-id full dark] - combine id + full + dark text mode<\/p><\/dd>\n<dt id=\"does%20it%20support%20redis%20or%20memcached%3F\"><h3>Does it support Redis or Memcached?<\/h3><\/dt>\n<dd><p>Yes, automatically. Tokens are stored via the WordPress Transients API, so if your site uses a persistent object-cache drop-in (for example the \"Redis Object Cache\" plugin), tokens live in Redis\/Memcached instead of the database with no configuration. The Settings &gt; Math Captcha page shows which storage is currently in use.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20page%20caching%3F\"><h3>Does it work with page caching?<\/h3><\/dt>\n<dd><p>Each captcha embeds a single-use token in the page HTML. If a full-page cache serves the same cached page to many visitors, only the first successful submission is accepted; later visitors must reload past the cache. Exclude pages with comment forms from full-page caching, or keep cache lifetimes short (under 30 minutes).<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.5.1<\/h4>\n\n<ul>\n<li>Added: Question style option (Digits \/ Emoji \/ Mixed) \u2014 emoji questions like 1\ufe0f\u20e33\ufe0f\u20e3 \u2795 7\ufe0f\u20e3 break the simplest text-parsing spam bots. Display only; verification is unchanged.<\/li>\n<li>Fixed: Contact Form 7 no longer burns the captcha token when another field fails validation \u2014 the token is consumed only after the whole form passes, so corrected resubmits work without reloading.<\/li>\n<li>Improved: dead tokens (expired or already used) now show \"please reload the page\" instead of the misleading \"incorrect answer\".<\/li>\n<li>Fixed: the answer input stays readable on dark themes and in the CF7 light text mode (it no longer inherits light text onto its white background).<\/li>\n<li>Fixed: valid HTML in the simple layout (the question is no longer a div inside a span).<\/li>\n<li>Improved accessibility: the answer input references the math question via aria-describedby, numeric keyboards are requested on mobile, and the info tooltip is keyboard-reachable.<\/li>\n<li>Improved: number-input spinner arrows are hidden and the tooltip wraps instead of overflowing on small screens.<\/li>\n<li>Improved: the stylesheet now loads only on pages where a captcha is rendered instead of site-wide.<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Improved: redesigned settings screen \u2014 protect\/layout toggles combined into one Protected Forms table with inline dependency status, corrected difficulty wording (the digit setting controls the answer; operands are auto-generated with up to one extra digit), and a live preview of both captcha layouts.<\/li>\n<li>Added: Settings link on the plugin row of the Plugins screen.<\/li>\n<li>Added: Token Storage status panel on the settings page \u2014 shows whether replay-protection tokens are stored in a persistent object cache (Redis\/Memcached\/APCu) or the database, and suggests enabling one when the server supports it.<\/li>\n<li>Improved: captcha tokens are now stateless HMAC-signed values \u2014 rendering no longer writes to the database; a single transient is written only on successful verification to prevent replay. Wrong answers no longer consume the token, so visitors can retry.<\/li>\n<li>Security: comment captcha can no longer be bypassed by spoofing review POST fields; product reviews are now detected from the target post type on the server.<\/li>\n<li>Security: WooCommerce review submissions now have their math answer verified (previously only the nonce was checked).<\/li>\n<li>Fixed: pingbacks and trackbacks are no longer blocked by comment captcha validation.<\/li>\n<li>Fixed: front-end login forms built with wp_login_form() now render the captcha instead of locking users out.<\/li>\n<li>Fixed: consolidated to a single plugin main file (dlit-easy-math-captcha.php).<\/li>\n<li>Improved: multiplication questions no longer degenerate to the trivial \"N x 1\" pattern.<\/li>\n<li>Improved: captcha is no longer rendered for logged-in users who can moderate comments.<\/li>\n<\/ul>\n\n<h4>1.4.5<\/h4>\n\n<ul>\n<li>Improved simple layout alignment and theming behavior.<\/li>\n<li>Updated text domain to match plugin slug.<\/li>\n<\/ul>\n\n<h4>1.4.4<\/h4>\n\n<ul>\n<li>Added CF7 text mode flags: <code>light<\/code> and <code>dark<\/code>.<\/li>\n<li>Removed external front-end link from captcha output.<\/li>\n<\/ul>\n\n<h4>1.4.3<\/h4>\n\n<ul>\n<li>Added CF7 shortcode layout flags: <code>simple<\/code> and <code>full<\/code>.<\/li>\n<li>Added one-line compact captcha display mode.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Added optional setting defaults for core integrations.<\/li>\n<li>Updated activation behavior and admin settings flow.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Added answer-digit based difficulty generation.<\/li>\n<li>Added per-integration simple one-line display mode.<\/li>\n<li>Improved comments and WooCommerce review validation flow.<\/li>\n<\/ul>","raw_excerpt":"A simple math captcha plugin for comments, login, registration, WooCommerce reviews, and Contact Form 7.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/sah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/303401","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/sah.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/sah.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=303401"}],"author":[{"embeddable":true,"href":"https:\/\/sah.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/dlit"}],"wp:attachment":[{"href":"https:\/\/sah.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=303401"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/sah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=303401"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/sah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=303401"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/sah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=303401"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/sah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=303401"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/sah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=303401"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}