Ananyoo Accessible Forms Plugin

Accessible Forms · WordPress plugin

Accessible Forms — built to get the errors right, too.

Most form plugins are accessible right up until something goes wrong — then they fail silently: a red border a screen reader never announces, an error message no one can find, focus left stranded at the bottom. Accessible Forms is built the opposite way: real labels, an error summary that takes focus and is announced, inline messages tied to each field, and entries stored safely in your own database. The result is accessible forms that keep working when it matters most.

Free · GPLv2 · No tracking · WordPress 6.5+ · PHP 7.4+

Why it’s different

What Accessible Forms gets right

  • Real labels and grouped fields — never a placeholder standing in for one.
  • Errors are announced to screen readers, not just shown in red.
  • Full keyboard support with a clear, visible focus ring.
  • Entries stay in your own database — no third-party service.
  • No forced tracking, and no squint-at-the-letters CAPTCHA — Turnstile and Akismet stay optional.

2 ways

Block + shortcode

WCAG AA

Built to

Your DB

Entries stored locally

Optional

Trackers · external calls

Why this exists

Forms are where accessibility quietly breaks.

A form can look perfect and still lock people out the moment it matters. Placeholder text used instead of a real label, so the field is unnamed for a screen reader. Required fields flagged only by a red outline — invisible to anyone who can’t see colour. An error message that appears visually but is never announced, with focus left at the submit button instead of moving to the problem. These are among the most common accessibility failures on the entire web, and they all happen at the worst possible moment: when someone is trying to reach you. Accessible forms have to handle that moment, not just the easy path.

Accessible Forms is built so the error path is as accessible as the happy path.

The part most plugins get wrong

Errors that everyone can find and fix.

When a submission fails, the plugin follows the pattern accessibility specialists recommend — an error summary at the top, plus a clear message beside every field that needs attention.

  • A summary box takes focus and is announced, so the problem is heard, not just shown.
  • Each summary item is a link that jumps focus straight to the field it’s about.
  • Every field message is tied to its input with aria-describedby and marked aria-invalid.
  • Errors are never colour-only — there’s an icon and wording too.
  • Fix a field and its message clears, and it drops out of the summary, as you go.

Two ways to add a form.

Build accessible forms visually in the editor, or drop one anywhere with a shortcode — the accessible markup is identical either way.

In the editor

The Accessible Forms block

Add the block, then add fields — text, email, number, message, dropdown, checkboxes and radio groups — each with a real label. Group choices get a proper fieldset and legend automatically.

// Block inserter
+ → “Accessible Form” → add fields → publish
Anywhere

A simple shortcode

Already built a form? Reuse it anywhere — a widget area, a template, or another page — by id. Same accessible output, no duplication.

// Any post, page or widget
[ananyoo_form id=“42”]

In the editor

Build the form right in WordPress.

Add fields, set which are required, and write your help text — all from the block, with no separate settings screen and no code.

The Accessible Forms block in the WordPress editor — building accessible forms with required fields, labels and help text
An illustration of the Accessible Forms block in the editor — add fields, mark them required, and set labels and help text from the sidebar.

Built on the parts most forms skip.

Every feature of Accessible Forms maps to a real WCAG success criterion — because it was designed by an accessibility consultant, not retrofitted.

Real labels, properly grouped

Every field has a visible <label> tied to its input — never a placeholder standing in for one. Radio and checkbox choices are wrapped in a fieldset with a legend, so the group’s question is announced with each option.

WCAG 1.3.1 · 3.3.2 · 4.1.2

Errors that are announced, not just shown

On a failed submit, a focus-managed summary is announced and links to each problem; every field message is wired to its input and carries an icon and wording, so no error depends on seeing a colour. Focus moves to the summary (or straight to the field, if there’s only one).

WCAG 3.3.1 · 3.3.3 · 1.4.1 · 4.1.3

Full keyboard, visible focus

Every field, the submit button and every summary link is reachable and operable by keyboard, in a logical order, with a clear focus ring. Controls and tap targets are sized for people who find small targets hard to hit.

WCAG 2.1.1 · 2.4.7 · 2.5.8

Your data stays yours

Submissions are saved as entries in your own WordPress database and emailed to you — readable in the admin with a keyboard-friendly quick view. No third-party form service, no tracking by default, and no external request unless you switch on the optional Cloudflare Turnstile or Akismet.

Private by default

Spam stopped without a barrier

A hidden honeypot field and a timing check catch most bots invisibly — no squint-at-the-letters CAPTCHA that locks people out. If you need more, two accessible options can be switched on: Cloudflare Turnstile for a real-time challenge, or Akismet to check submissions and quietly quarantine suspected spam under Entries.

No inaccessible CAPTCHA

Robust — even with JavaScript off

The script is a progressive enhancement. With JavaScript disabled, the server still validates the submission, re-shows the form with the values kept, and renders the same error summary and inline messages — so the form always works.

Robust by design

Standards-based

Built on the W3C’s accessible-forms guidance.

Rather than inventing custom behaviour, Accessible Forms follows the W3C’s published “Forms” tutorial and the WAI-ARIA practices for labelling, grouping and error handling — the same references accessibility specialists test against. The success criteria it’s built around:

1.3.1 Info & Relationships 1.4.1 Use of Color 1.4.3 Contrast 2.1.1 Keyboard 2.4.7 Focus Visible 2.5.8 Target Size 3.3.1 Error Identification 3.3.2 Labels or Instructions 3.3.3 Error Suggestion 4.1.2 Name, Role, Value 4.1.3 Status Messages

Frequently asked questions

How are validation errors shown?

Two ways, together. On a failed submit, an error summary appears at the top of the form, takes focus and is announced to screen readers, with a link to each field that needs fixing. Beside every affected field there’s also an inline message, tied to the input with aria-describedby and marked aria-invalid, with an icon and wording so nothing relies on colour. Fix a field and its message clears and leaves the summary automatically.

Block or shortcode — which should I use?

Either. Build the form with the Accessible Forms block in the editor, then place it on the page directly, or reuse it anywhere with the [ananyoo_form id="…"] shortcode — in a widget, a template, or another page. The accessible markup is identical both ways.

Where do submissions go?

Into your own WordPress database, saved as entries you can read in the admin, and emailed to the address you choose. Accessible Forms keeps your submissions on your own site — there’s no third-party form service in the middle, so your visitors’ data stays with you.

How is spam handled without an inaccessible CAPTCHA?

By default, a hidden honeypot field and a submission-timing check stop most bots without asking a real person to do anything — so there’s no distorted-text puzzle to fail. If you want a stronger layer, two accessible options can be switched on: Cloudflare Turnstile for a real-time challenge, or Akismet for content-based filtering that quietly keeps suspected spam under Entries so real users are never bounced.

Does it work without JavaScript?

Yes. The client-side checks are an enhancement; the server always validates. With JavaScript off, a failed submission reloads the form with your values intact and the same accessible error summary and inline messages — nothing is lost.

Will it track visitors or slow my site?

No. There’s no tracking and no phone-home by default, scripts are vanilla JavaScript with no build step, and assets load only on pages with a form. The only external requests possible are Cloudflare Turnstile and Akismet, and only if you turn them on.

Add accessible forms in minutes.

It’s free on WordPress.org. Install from Plugins → Add New, search for Accessible Forms, add the block (or use the shortcode), and you have a form that works for everyone — errors and all.

GPLv2 or later · Free · No registration · No tracking

Built by Shivaji Mitra — Accessibility Consultant since 2003 · Kolkata, India

Part of the Ananyoo collection of WordPress accessibility plugins.