Ananyoo Accessible Forms builds contact and lead forms that conform to WCAG 2.2 Level AA out of the box. Instead of bolting accessibility on afterwards, every form is generated with correct semantics from the start: a real <label> for every control, fieldset / legend for grouped inputs, an error sum
PricingFree downloadThe WordPress.org download is free. Pro versions, add-ons or external services may cost extra.
CompatibilityRequires WordPress 6.5 and PHP 7.4.
SourceWordPress plugins · Nov 13, 2026
01 / Source details
Aboutthistool.
Ananyoo Accessible Forms builds contact and lead forms that conform to WCAG 2.2 Level AA out of the box. Instead of bolting accessibility on afterwards, every form is generated with correct semantics from the start: a real <label> for every control, fieldset / legend for grouped inputs, an error summary that links to each problem and moves focus to the first field to fix, inline errors tied to their field with aria-describedby and aria-invalid , and a status region that announces success.
Developed by Shivaji Mitra (M/S. Anblik).
Live demo: Try the accessible forms demo »
Why this plugin?
Most popular form plugins can be made accessible, but they do not start that way — you have to know exactly which settings to change and which markup to fix. This plugin makes the accessible result the default, so a form added by a non-expert is still usable by keyboard and screen-reader visitors, on the smallest phone, in high-contrast mode.
Key features
Accessible by construction — label per field, fieldset/legend for radio and checkbox groups, required state exposed to assistive tech.
Error summary with managed focus — on a failed submit, a summary lists each problem as a link to its field, and focus moves to the first field that needs fixing, where its own message is announced (WCAG 2.2 SC 3.3.1, 2.4.3).
Values kept on error — visitors never retype a whole form because one field failed (SC 3.3.7 Redundant Entry).
Accessible anti-spam, no puzzles — an invisible honeypot plus a submission-time trap stop bots without a CAPTCHA, satisfying SC 3.3.8 Accessible Authentication. Optional Akismet and Cloudflare Turnstile support adds more protection when you want it.
Multi-step forms — split a long form into short, numbered steps with a “Step break”. Each step is announced, focus is managed, and the form still works as one page without JavaScript.
File uploads, off by default — add a File upload field, but nothing can be uploaded until you switch uploads on. Per-field size and allowed-type limits, with strict server-side checks on size, extension and real content.
Live accessibility health check — a panel beside the builder reviews the form as you edit and flags issues (missing labels, empty steps, choice fields without options, and more) with a symbol and a word, never colour alone.
Accessible email notifications — the admin notification and the visitor’s confirmation are built as accessible HTML email: a real data table with row headings, an alt-text logo and a plain-text alternative for every inbox. Pick one of six ready-made palettes (every band WCAG AAA) or set your own header, body and footer colours with a live contrast check, choose HTML or plain text only, and set the wording on each form.
Know where a submission came from — an optional sender & device details section adds the time, the sender’s IP address (linked to a location look-up you can click), browser, operating system, device type, language and the pages involved to the notification you receive. Off until you switch it on, never added to the visitor’s confirmation, and no data leaves your site.
Count submissions in Google Analytics, without code — give a form an event name (for example contact_form_submit ) and every stored submission is reported to Google Analytics 4 under that name, through gtag.js or Google Tag Manager, whichever the site already has. Quarantined spam is never counted. Every stored submission also raises a JavaScript event on the page ( ananyoo_aaf_submitted ) and a PHP action ( ananyoo_aaf_after_submission ) for your own integrations.
Reusable forms — each form is stored once and can be placed on many pages by ID.
Stored entries — every submission is saved so nothing is lost if an email fails. List, search, trash and restore using the native WordPress screens.
Resend a notification — if a notification never arrived, re-send it from the entry screen or straight from the Entries list. It is rebuilt from the stored entry through the same code as the original, so it arrives identical; the person who submitted is not emailed again.
The dashboard matches the inbox — the entry screen shows the same sender & device details as the email, so there is one version of the truth.
Spam quarantine — suspected spam is moved to a recoverable Spam view, not deleted, so false positives can be restored.
Block and shortcode — insert the Accessible Form block, or use [ananyoo_form id="123"] anywhere, just like a classic contact form.
Any-SMTP delivery — notifications are sent through wp_mail() , so any SMTP plugin you already use handles deliverability.
Brand it from the admin screen — set the submit button, focus ring and example-text colours under Form appearance. Every pair is contrast-checked live at the right threshold (4.5:1 for text, 3:1 for the focus ring), and the hover shade is derived for you. Under the surface each one is a CSS custom property on .aaf-form , so a theme can restyle the form by redeclaring tokens rather than fighting the stylesheet with !important .
Example text that behaves — an optional placeholder on free-text fields, fenced so it cannot do harm: never on a field without a label, never the accessible name, and set to a colour that passes contrast instead of the browser’s pale grey. The health panel warns if it repeats the label or reads as an instruction.
3 px focus ring, 44 × 44 targets — meets WCAG 2.2 SC 2.4.11/2.4.13 and 2.5.8 by default (both adjustable).
Reflows cleanly at 320 px , respects prefers-reduced-motion , and supports Windows High Contrast / forced-colors .
Works without JavaScript — the server validates and re-renders; JavaScript only enhances focus handling and adds an early client-side check.
Clean uninstall option — off by default (your data is kept). Turn it on to remove every form, entry and setting when the plugin is deleted.
Links
Plugin home & documentation
Live demo
More accessibility plugins from Ananyoo — further WordPress accessibility plugins are in active development.
Support & contact
Privacy
This plugin stores the entries you receive in your own WordPress database and sends notification emails through your site’s own mail system (the standard wp_mail() function). Out of the box it sends your data to no third-party service and adds no tracking or front-end links of its own. If you give a form an Analytics event name, the plugin calls the Google Analytics or Tag Manager code that is already on your site; it loads no Google script itself and passes only the form’s ID, name and page path, never the visitor’s answers.
Two optional extras change this, and both are your choice:
Akismet (off until you switch it on). When enabled, the submitted values, along with the sender’s IP address and browser user agent, are sent to Akismet to be checked for spam. This uses the Akismet plugin’s own connection and API key, under Automattic’s privacy policy . Please mention this in your own privacy policy before switching it on.
Cloudflare Turnstile . The separate companion plugin you choose handles that request under its own terms.
See it in action
Screenshots & previews.
The accessible form on the front end: real visible labels, helpful hint text and large, easy-to-tap fields, with each behaviour mapped to its WCAG 2.2 AA success criterion.Accessible validation: an error summary that links to each problem, focus moved to the first field to fix, plus inline messages tied to each field and announced to screen readers, never by colour alone.The accessible success state after a valid submission: a clear confirmation announced through a polite live region (SC 4.1.3), with focus moved to it so keyboard users are never left guessing.Every submission is saved as a native WordPress entry. The list shows the sender, subject, form, date and IP, with Quick View, View and Trash actions.A stored entry opened in the admin: every submitted field and value in a semantic table, with checkbox answers shown as Yes or No and the received time and IP set apart below.Quick View opens any entry in an accessible modal dialog without leaving the list: focus moves into the dialog, Escape closes it, and focus returns to the link afterwards.Build a form visually with the Accessible Form block, or drop its shortcode anywhere; both render the identical accessible markup.Multi-step forms: add a "Step break" and a long form becomes short, numbered steps with a progress indicator, Previous/Next buttons, a spoken "Step X of N", and focus moved to each step — and it still works as one page without JavaScript.A File upload field with its own maximum size and allowed file types. Uploads are off site-wide by default, so the field stays disabled with a clear note until you switch uploads on — safe by design.The live accessibility health check beside the form builder: missing labels, empty steps, choice fields without options and more are flagged as you edit, each with a symbol and a word, never colour alone.Accessible email design under Settings: a logo, six ready-made palettes and a background and text colour for the header, body and footer, each checked live for WCAG contrast so the email is readable in every inbox.The accessible HTML notification: a real data table with row headings, an alt-text logo, a clearly labelled button to the stored entry, and the optional sender & device details section at the bottom. A matching plain-text copy is always included.Six ready-made email palettes, each contrast-checked so every band reaches WCAG AAA (7:1 or better). Choosing one fills the colour pickers below, which stay editable and are re-checked live.Choose the message format — accessible HTML with a plain-text alternative, or plain text only — and switch on the optional sender & device details section, which is added to your notification and never to the visitor's confirmation.
02 / Source details
Gettingstarted.
01Upload the plugin to the /wp-content/plugins/ directory, or install it from the Plugins screen.
02Activate it. Four ready-to-use example forms are created automatically: an enquiry form (showing every field type), a newsletter sign-up, a quick feedback form, and an advanced contact form that showcases every feature.
03Go to Ananyoo Accessible Forms to edit fields, or create a new form.
04Copy the form’s shortcode (e.g. [ananyoo_form id="123"] ) into any page or post, or add the Accessible Form block and choose your form.
05Set the notification email (and optional email logo) under Ananyoo Accessible Forms → Settings . Emails send out of the box; for the best inbox delivery we recommend — but do not require — a free SMTP plugin such as WP Mail SMTP or FluentSMTP.
03 / Source details
Frequently asked questions.
What does the sender & device details section show, and is it private?
If you switch on Sender & device details (Settings > Email), the notification you receive also lists the sender’s IP address, browser, operating system, device type, language and referring page – all read from the request itself and already stored with the entry. An IP address is personal data in the EU and UK, so please mention this in your privacy policy before enabling it. Nothing is sent anywhere: the location link beside the IP is an ordinary link that your browser opens only when you click it. The look-up service can be changed with the ananyoo_aaf_ip_lookup_url filter.
Do I need a CAPTCHA?
No. The built-in honeypot and submission-time trap stop most bots without asking visitors to solve a puzzle, which keeps the form accessible. The plugin deliberately does not bundle a CAPTCHA, and never uses image-puzzle CAPTCHAs, which create barriers for many disabled visitors.
If your forms attract heavy, targeted spam and you want an extra layer, the most accessible choice is Cloudflare Turnstile — in its “Managed” / interaction-only mode it verifies most visitors invisibly, with no puzzle to solve. Add it with a dedicated Turnstile plugin (for example, “Simple CAPTCHA Alternative with Cloudflare Turnstile”). See the next question for connecting it to these forms.
How do I add Cloudflare Turnstile (or another CAPTCHA) to these forms?
The easiest way is automatic. Install the free “Simple CAPTCHA with Cloudflare Turnstile” plugin (by RelyWP) and add your Turnstile keys. These forms then detect it and show the Turnstile challenge by themselves — no code, no shortcode. A failed or missing challenge is reported through the same accessible error summary as any other field, with the visitor’s answers kept. You can switch this off under Ananyoo Accessible Forms → Settings.
Importantly, this plugin still loads no third-party script itself; the companion plugin renders and enqueues the Turnstile widget. So this plugin makes no external requests on its own.
Prefer a different CAPTCHA, or want full control? Two hooks are also available:
do_action( 'ananyoo_aaf_before_submit', $form_id, $uid, $errors ) — fires just before the submit button, inside the form. Use it to output a verification widget.
apply_filters( 'ananyoo_aaf_validation_errors', $errors, $raw, $fields, $form_id ) — return a non-empty name => message array to reject a submission. The message then appears in the accessible error summary and beside the form.
Developers can also disable the built-in Turnstile integration with the ananyoo_aaf_use_turnstile filter (return false ).
How do I add Akismet spam filtering to these forms?
Install the Akismet plugin, add your API key under Settings → Akismet Anti-spam, then tick “Add Akismet spam filtering when the Akismet plugin is active” under Accessible Forms → Settings. It stays off until you tick it.
Do I need an SMTP plugin for the emails to arrive?
Not to make it work , but it is strongly recommended for deliverability . This plugin sends every email through WordPress’s own wp_mail() , so notifications and confirmations send with no extra setup. However, default server mail is often marked as spam. For emails to land reliably in the inbox we recommend a free SMTP plugin such as WP Mail SMTP or FluentSMTP . It is optional — nothing here requires it — and the plugin shows a gentle, dismissible tip on its Settings screen if none is detected. Because delivery goes through wp_mail() , whichever SMTP plugin you already use handles it automatically.
Do I need Cloudflare Turnstile or another CAPTCHA?
No — and that is deliberate. Accessible anti-spam is built in (an invisible honeypot plus a submission-time trap, satisfying SC 3.3.8 Accessible Authentication), with optional Akismet, so most sites need no CAPTCHA at all and visitors never face a puzzle. Cloudflare Turnstile is offered only as an optional extra layer for sites hit by heavy, targeted spam; in its invisible “Managed” mode it verifies most people with no interaction. It is never required, and leaving it off keeps the form as accessible as possible.
Akismet adds nothing to the form itself, so there is no puzzle and nothing changes for keyboard or screen-reader users. A submission Akismet thinks is spam is saved quietly under Entries with the Spam status — the visitor is never blocked and never shown an error. This is deliberate: if Akismet guesses wrong, a real person still gets through, and you simply find their message in the Spam view. If Akismet cannot be reached, the entry is saved as normal.
Please note that when this is on, the submitted values are sent to Akismet, an outside service, to be checked. Please make sure your privacy policy says so.
Developers can disable the integration with the ananyoo_aaf_use_akismet filter (return false ), or adjust what is sent with the ananyoo_aaf_akismet_request filter.
How do I let visitors upload a file, and is it safe?
Add a File upload field to your form in the builder. On its own that changes nothing on the front end yet: file uploads are off for the whole site by default , on purpose. Until you switch them on under Settings → File uploads , the field shows as disabled with a short note, and nothing can be uploaded — so a form is never an open door for unwanted files until you decide to accept them.
When you are ready, tick “Allow visitors to upload files”. Each File upload field has its own maximum size (2 MB by default) and its own list of allowed file types (PDF, DOC, DOCX, JPG, PNG, GIF, WEBP to begin with — change these on the field). Every uploaded file is checked on the server for size, extension and its real content type before it is saved, files are kept in a separate uploads folder, and each one appears as a link on the stored entry.
How do I make a long form into steps?
In the form builder, add a Step break where you want one step to end and the next to begin. The form is then shown one step at a time, with a numbered progress indicator, Previous/Next buttons, a spoken “Step X of N”, and focus moved to each step as it opens. “Next” checks only the current step. If a visitor has JavaScript turned off, the whole form still appears and works as a single page, so nobody is ever locked out.
How do I count form submissions in Google Analytics?
Open the form, and in the settings box on the right fill in Analytics event name , for example contact_form_submit (letters, digits and underscores, starting with a letter, up to 40 characters). From then on every stored submission of that form is reported to Google Analytics 4 under that name, with form_id , form_name and form_page as parameters. The plugin uses whatever Google code your site already has: gtag.js (Site Kit, or a tag added by hand) when present, otherwise Google Tag Manager’s dataLayer , where you add a Custom Event trigger with the same name. In GA4, open Admin > Events, find the event after the first submission and mark it as a key event to count it as a conversion. A submission that the anti-spam quarantines shows the visitor the same thank-you message but is never reported, so spam does not inflate your numbers. Leave the field blank and nothing is sent to Google.
Every stored submission also dispatches a JavaScript event on the page, whether or not an Analytics event name is set:
document.addEventListener( 'ananyoo_aaf_submitted', function ( e ) { console.log( e.detail.formId, e.detail.formName, e.detail.page ); } );
And on the server, the ananyoo_aaf_after_submission action runs once the entry is stored:
add_action( 'ananyoo_aaf_after_submission', function ( $entry_id, $form_id, $data, $status, $reason ) { /* pass $data to a CRM or webhook; skip when $status is ANANYOO_AAF_STATUS_SPAM */ }, 10, 5 );
Does the plugin make external requests or track anything?
No. By itself the plugin makes no external/HTTP requests and includes no analytics or tracking. The optional Analytics event name calls the Google Analytics or Tag Manager code already on your site and passes only the form’s ID, name and page path. Two optional extras are the exception, and only if you switch them on: the Akismet check sends the submission to Akismet for a verdict (through the Akismet plugin’s own connection and key), and a third-party CAPTCHA plugin such as Cloudflare Turnstile handles its own requests. Both are covered by their own privacy terms.
Are submissions stored if the email fails?
Yes. Every valid submission is saved as an entry before the email is sent, so a mail problem never loses a message.
Will deleting the plugin remove my data?
Only if you choose to. The clean-uninstall option is off by default, so your forms and entries are kept. Enable it under Settings if you want everything removed on delete.
FinderPress Media Auditor helps site administrators scan for broken images, missing Media Library files, unreachable media URLs, and other media issues across WordPress content. Use it to audit images, video, audio, PDFs, featured images, and attachment files without sending scan data to an external
The Accepted Payment Methods plugin is a straightforward, lightweight solution that enhances your website by displaying visually appealing icons of the payment methods you accept. This plugin is ideal for a variety of websites, including e-commerce platforms, service-oriented websites, and informati