Accessibility on WordPress is no longer optional. The European Accessibility Act became enforceable in June 2025, US ADA lawsuits against websites keep climbing every year, and Google now uses accessibility signals as a soft ranking input.
Most “accessibility plugins” you see advertised — the ones with a floating icon that adds a toolbar — do not fix compliance. They add UI noise on top of an inaccessible site. Real accessibility is fixed in your markup, your theme, and your Elementor widgets.
This is the 30-point audit I run before shipping any client site in 2026. It maps to WCAG 2.2 Level AA, which is the practical target for commercial sites.
Section 1: Perceivable (10 checks)
- Every image has meaningful alt text — or
alt=""if purely decorative. Not “image1.jpg”. Not the filename. - Text contrast is ≥ 4.5:1 for body copy, 3:1 for large text (≥18pt or ≥14pt bold). Test with the Stark or WAVE browser extension.
- Non-text UI has 3:1 contrast — button borders, form field outlines, icon buttons. This is where most Elementor sites fail.
- Text can zoom to 200% without content loss or horizontal scroll. Fixed-width containers are the usual culprit.
- Content works in both orientations on mobile.
- No information conveyed by color alone — form errors need an icon or text, not just red.
- Videos have captions (WCAG 1.2.2, Level A). Auto-captions from YouTube are a starting point, not a finish line.
- Audio content has a transcript.
- Page has proper heading hierarchy — exactly one H1, no skipped levels (H2 → H4 is a fail).
- Landmarks are used —
<header>,<nav>,<main>,<footer>. Elementor Pro Theme Builder gets this right; classic themes often don’t.
Section 2: Operable (10 checks)
- Every interactive element is keyboard-reachable. Tab through the entire page — you should hit every button, link, form field, menu item.
- Focus is visible at all times. If your theme has
outline: nonewithout a replacement style, that’s an instant fail. - Focus order matches visual order. Elementor absolute-positioned widgets can break this.
- Skip-to-content link exists and is visible on focus.
- No keyboard traps — modals must close on Escape, and focus must return to the trigger element.
- Dropdowns work on hover AND focus. Pure-hover mega menus fail WCAG.
- Target size ≥ 24×24 CSS pixels (WCAG 2.2, new in 2.5.8). Small social icons and pagination arrows commonly fail this.
- No auto-playing carousels longer than 5 seconds without pause. Better: no auto-play at all.
- Page titles are unique and descriptive. Set them in Rank Math per-page, not just “Home | Site Name” everywhere.
- Link text makes sense out of context. “Read more” alone fails; “Read more about our pricing” passes.
Section 3: Understandable (5 checks)
- HTML
langattribute is set correctly —<html lang="en">orlang="ur-PK". WordPress sets this from the site language; verify it made it to the front-end. - Form fields have visible labels. Placeholder-only labels fail. WPForms and Elementor Forms both support proper
<label>— use it. - Form errors are announced — associated with the field, described clearly (“Email must include an @ symbol”, not just “Invalid”).
- Required fields are marked both visually (asterisk + legend) and programmatically (
aria-required="true"). - Consistent navigation and identification across the site. Menu items don’t reorder from page to page.
Section 4: Robust (5 checks)
- Valid HTML — run the page through the W3C validator. Duplicate IDs are the most common Elementor issue.
- ARIA is used correctly, not decoratively.
role="button"on a<div>is worse than a real<button>. - Custom widgets have accessible names — icon buttons need
aria-labelor visually-hidden text. - Status messages use
role="status"oraria-live— for form submission confirmations, cart updates, search-result counts. - Dynamic content updates are announced — AJAX-loaded content, filter results, pagination changes.
Tools that actually catch problems
- axe DevTools (browser extension) — catches ~40% of WCAG issues automatically. Best free scanner.
- WAVE by WebAIM — visual overlay, easier for non-developers to interpret.
- Lighthouse accessibility audit — built into Chrome, gives you a score and a starting checklist.
- NVDA (Windows) or VoiceOver (Mac) — actual screen readers. Free. If you’ve never tested with one, do it once and you’ll never ship a site the same way again.
- Keyboard alone — unplug your mouse, navigate the full site. It reveals more than any tool.
Elementor-specific traps
- Icon Box widget: the icon and heading are wrapped separately — if you link the icon, add
aria-hidden="true"to it so screen readers don’t announce it twice. - Image Carousel: turn off autoplay, or set pause-on-hover AND pause-on-focus.
- Nav Menu (Pro): sub-menu keyboard support was buggy pre-3.20. On 3.35+ it’s fixed — verify with Tab / Arrow keys.
- Popup Builder: set “Close on ESC key” ON. Set the popup role to
dialogin Advanced. - Form Widget: turn on “Mark required fields” and set error position to “inline” — this associates the error with the field programmatically.
What “accessibility overlay” plugins actually do
They inject a widget that lets users toggle high contrast, larger text, etc. That’s not compliance. WCAG is about the underlying markup — an overlay cannot fix an image with no alt text, a form with no labels, or a menu that fails keyboard navigation.
US lawsuits have specifically named sites using these overlays — the widget is not a legal defense. Fix the site, not the surface.
What a real audit deliverable looks like
When I audit a client site, the output is:
- A spreadsheet of every issue mapped to a WCAG success criterion.
- Severity (blocker / major / minor).
- Exact page + element + screenshot.
- Recommended fix — code snippet, widget setting, or content change.
- Retest column, dated.
Getting to WCAG 2.2 AA on a typical WordPress site takes 8–20 hours of focused work if the theme is decent. If the theme itself is inaccessible (many free themes are), you’re rebuilding — not auditing.
Start with the ten checks in Section 1. They cover most legal exposure and most real-user impact. The rest is polish — important polish, but Section 1 is where the fires are.





