DigitalPlugsADA Compliance Documentation
Buy Now (opens in a new window)
Documentation

Everything DigitalPlugs ADA Compliance checks, fixes, and reports on.

This page covers how to use the plugin day to day, every one of the 57 automated checks it runs, the fixes it can make safely on its own, and the developer hooks, REST routes and WP-CLI commands for anyone building on top of it.

Getting Started

Using the plugin day to day

Everything from your first install through the three places you'll actually see issues while you write — the Classic Editor, the block editor, and Elementor.

Install & Activate

Install DigitalPlugs ADA Compliance (the free plugin) the way you'd install any WordPress plugin — search for it under Plugins → Add New, or upload the zip, then activate it. It starts scanning immediately; no account or setup step required.

Pro is a separate plugin that extends the free one, so the free plugin has to be installed and active first. Once Pro is active, go to ADA Compliance → License and paste in the key from your purchase receipt or your account at digital-plugs.com. If you're testing on a local or staging domain (anything ending in .test, .local, or a staging. subdomain), activation is recognized automatically and doesn't use up one of your licensed sites.

Your First Scan

You don't have to start a scan manually. The moment you publish or update a post or page, it's checked automatically — that's what powers the panels described below. To see everything already on your site before you've touched it, go to ADA Compliance → Dashboard and click Start Scan. It works through your published posts and pages in the background and the Issue Summary fills in as it goes.

Real-time scanning on save can be turned off under Settings if you'd rather only scan on demand.

Your Score & WCAG Level

The ring on the Dashboard is the percentage of your scanned posts and pages that currently have zero open issues — not a percentage of individual checks passed. The WCAG level badge next to it (A, AA, or AAA, or "does not yet meet Level A") is the highest level where nothing site-wide is failing at that level or any level below it — WCAG conformance requires every lower level to be clean first, so a single Level A failure anywhere caps the whole site at "not yet Level A" even if everything else is spotless.

Inside the editor panels you'll see a different, smaller number: Checks Passed, the percentage of the 57 rules with no open issue on that one specific post. It's deliberately not called a "score" anywhere in the editor, so it's never confused with the Dashboard's site-wide one.

Scanning While You Edit

Wherever you write content, there's a live accessibility panel for that post specifically:

  • Classic Editor — an "Accessibility" box appears below the content editor, with a Recheck button and a "View Accessibility Report" link back to the Dashboard.
  • Block editor — an Accessibility panel lives in the document sidebar (the icon next to Preview/Publish); it fetches this post's issues over the REST API and can recheck without a full save.
  • Elementor — see the next section; it works the same way but adds markers directly on the canvas.

All three show the same thing: how many Warnings and Alerts are open, a Checks Passed percentage, and each issue with its WCAG citation, level, and a plain-English "How to fix" explanation.

Editing With Elementor PRO

Open the Accessibility panel from the floating button in the Elementor editor and, alongside the same issue list described above, every issue that has a matching element gets a numbered marker placed directly on the live preview. Click a marker to jump to and highlight its row in the panel; click a row to scroll the preview to that element and flash a highlight box around it.

Markers work by scanning the preview iframe's actual current HTML each time you open the panel or hit Recheck — not a cached location from an earlier scan — so they stay accurate even though Elementor rebuilds its preview constantly. That also means markers reflect the page as of your last recheck, not edits you've made since; hit Recheck after a round of changes to bring them back in sync.

Rechecking a Page

Every editor panel has a Recheck button that rescans just that one post without a full page reload. On the Dashboard, each row in the Issues table has its own Recheck action for when the page might have changed since the last full scan.

Ignoring an Issue

If a flagged issue is a deliberate choice rather than a mistake, use the Ignore action on its row in the Dashboard's Issues table. Ignored issues move to the "Ignored" view (switch to it from the View dropdown above the table) and stop counting toward your score, but stay visible so the decision is never silently lost.

Choosing a Compliance Standard

Under ADA Compliance → Settings, pick which standard every scan, citation, and the Guidelines Reference page is framed around: WCAG 2.2 Level AA, Section 508, or the European Accessibility Act (EAA). Rules that only apply under a standard you're not using are skipped by scans and hidden from the reference list, so the plugin only ever shows you checks that are actually relevant to what you picked.

There's also an optional toggle for Focus Appearance (WCAG 2.4.13), a Level AAA criterion stricter than any of the three standards above requires — off by default, since it's a stricter bar than what you're being held to, not something every site needs.

Full-Site Scanning PRO

The free plugin scans posts and pages. Pro's full-site scan additionally covers widgets, menus, theme templates, taxonomy terms, shortcode output, and your active theme's own CSS — plus, where applicable, Elementor Floating Elements and saved templates, WooCommerce products, EDD downloads, and any custom listing post type your site registers. Start it from the Dashboard's Full Site Scan button, or on a schedule (see below).

The Front-End Checker PRO

An "Accessibility Checker" toggle appears in the admin bar (and as a floating button) on the live front end, visible only to logged-in staff with permission. Turn it on and every issue on that exact page gets a numbered marker, plus a panel with the page's score, WCAG level, and a Warnings/Alerts breakdown. Click a marker for its fix and citation, tab through every marker in reading order with the keyboard alone, or use Disable Styles to check your raw reading order without any CSS.

Visitor Accessibility Toolbar PRO

A separate, optional feature from the checker above: a small floating widget your site's actual visitors can use to adjust text size, contrast, link underlining, and focus visibility. Preferences are stored in their own browser only — nothing is sent to your server. Turn it on under Settings.

This toolbar can genuinely help some visitors, but it doesn't fix anything underlying, and it doesn't make a site legally compliant on its own — we say this on the setting itself, not just here.

Screen Reader Simulator

Inside the front-end checker's issue popup, a speaker button reads that element's accessible name and description aloud using your browser's own built-in text-to-speech. It's a fast way to hear what assistive technology would announce without switching to a dedicated screen reader — nothing is recorded or sent anywhere.

Scheduled Scans & Email Digests PRO

Under Settings, set a scan frequency (off by default) to run the full-site scan automatically in the background on a schedule. Add one or more digest recipients — the site admin email always receives it too — and you'll get an email only when a scan finds a new warning-severity issue, not a notification for every routine scan.

Free vs. Pro Site Counts

The free plugin has no site limit at all. Pro is licensed by how many sites one key covers — Professional (1 site), Small Business (5 sites), and Agency (25 sites) — and every tier unlocks the exact same set of features. The only thing that changes between them is how many sites your license activates on, so pick based on how many sites you manage, not which features you think you need.

If Scanning Isn't Working

  • Check Settings → Post types to scan actually includes the content type you're editing.
  • Check real-time scanning is switched on, if you're expecting it to fire on save.
  • For the front-end checker or visitor toolbar not appearing: confirm your Pro license shows Active, and that your user role has the relevant permission under Settings → Permissions.
  • For Elementor markers that seem stale: they reflect your last recheck, not unsaved edits — click Recheck after making changes.
Pro Add-ons

What Pro adds on top of the free plugin

Everything below requires an active Pro license. None of it changes what the free plugin already does — it's purely additive.

Client Reports

Generate a signed, read-only link to today's compliance summary — branded with your white-label settings, viewable without a login, and revocable any time. Give each one its own label and expiry date.

VPAT / ACR Report

A criterion-by-criterion table — Supports, Partially Supports, Does Not Support, or Not Evaluated — generated from your live scan data and downloadable as a dated PDF. Supporting evidence for a conformance evaluation, not a guarantee of one.

Excel Export

Every open issue exported to a real .xlsx file, for anyone on your team who works from a spreadsheet instead of wp-admin.

WooCommerce Product Images

Every published product's featured and gallery image missing alt text, listed with an inline field that saves as you type. It never invents wording for you — only a real description you write counts.

Multisite Network Rollup

A network admin dashboard summarizing every subsite's score and open-issue count in one place, instead of checking each site individually.

White-Label Branding

Put your own agency name, logo, and accent color on client report links, and optionally rebrand the admin menu itself for every role except Administrator.

Webhooks

Notify Slack or any external system within moments of a new warning-severity issue. Every request is signed with HMAC-SHA256 so the receiving end can verify it genuinely came from your site.

REST API & WP-CLI

Pull a site summary, list issues, or trigger a full scan headlessly — from CI, a cron job, or a script — over REST or the command line. Full reference below.

Reference

What DigitalPlugs ADA Compliance tests for

65 automated checks, in two severities. Warnings are things that must be corrected to meet Section 508 or WCAG Level A/AA. Alerts are best-practice issues — worth fixing, but not themselves a conformance failure. Every check links to the exact WCAG success criterion it enforces.

65 of 65 checks shown

Aria Label Empty
Add text to the aria-label, or remove the attribute if it isn't needed.
WCAG 4.1.2A
Aria Reference Invalid
Fix the attribute to reference an id that exists, or add the missing element.
WCAG 4.1.2A
Content List Malformed
Wrap the list item in a proper <ul> or <ol> element.
WCAG 1.3.1A
Content Title Blank
Give the post or page a descriptive title.
WCAG 2.4.2A
Content Title Duplicate
Give this post a title that distinguishes it from another post using the same one.
WCAG 2.4.2A
Contrast Inline Low
Choose a darker foreground or lighter background so the contrast ratio is at least 4.5:1.
WCAG 1.4.3AA
Focus Not Obscured
When this element receives keyboard focus, at least part of it must stay visible on screen.
WCAG 2.4.11AA
Form Label Empty
Add text to the label describing the field it belongs to.
WCAG 3.3.2A
Form Label For Mismatch
Fix the for attribute to match the field's actual id, or add the missing id.
WCAG 1.3.1A
Form Label Missing FIX
Wrap the field in a <label>, add a for attribute, or add an aria-label.
WCAG 4.1.2A
Heading Empty FIX
Add descriptive text to the heading, or remove the empty heading tag.
WCAG 2.4.6AA
Heading Multiple H1
Keep a single h1 per page and demote the others to h2 or lower.
WCAG 1.3.1A
Heading No H1
Add a single h1 that names the page or the piece of content.
WCAG 2.4.6AA
Heading Skipped Level
Use the next heading level down (h3 after h2) so the outline has no gaps.
WCAG 1.3.1A
Image Alt Invalid
Replace filename-style or "image of…" alt text with a description of what the image conveys.
WCAG 1.1.1A
Image Alt Missing
Add an alt attribute describing the image, or alt="" if it's purely decorative.
WCAG 1.1.1A
Image Aria-Hidden Alt Conflict
Either remove aria-hidden so the description reaches assistive technology, or clear the alt text if it's truly decorative.
WCAG 4.1.2A
Image Map Area Alt Missing
Add an alt attribute describing the destination of each clickable area.
WCAG 1.1.1A
Keyboard JS Jump Menu
Add a "Go" submit button next to the select instead of navigating automatically on change.
WCAG 3.2.2A
Keyboard Meta Refresh
Remove the meta refresh tag; use a server-side redirect, or let the user choose when to move on.
WCAG 2.2.1A
Keyboard Pointer-Only Handler
Add an onkeydown/onkeypress handler alongside onclick, or use a real button or link element.
WCAG 2.1.1A
Keyboard Tabindex Abuse FIX
Use tabindex="0" or remove the attribute; reorder the markup instead of forcing tab order with a positive value.
WCAG 2.4.3A
Lang Missing FIX
Set the site language under Settings → General, or in a custom template's html tag.
WCAG 3.1.1A
Link Empty
Add link text, or add alt text to an image inside the link.
WCAG 2.4.4A
Link New Window No Warning FIX
Add visible or screen-reader-only text noting the link opens in a new window.
WCAG 3.2.5AAA
Link Text Redundant, Different Destination
Give each link distinct text describing its own destination, or add a visually-hidden suffix.
WCAG 2.4.4A
Media Autoplay No Stop
Remove autoplay, or add the controls attribute so visitors can pause or stop playback.
WCAG 1.4.2A
Media Embed Object No Fallback
Add fallback text inside the object tag, or an aria-label/title on the embed tag.
WCAG 1.1.1A
Table Headers Orphan Reference
Fix the headers attribute to reference the correct header cell ids.
WCAG 1.3.1A
Table TH Empty
Add text to the header cell describing the row or column it labels.
WCAG 1.3.1A
Table TH Missing
Mark the header row or column's cells as <th> instead of <td>.
WCAG 1.3.1A
Target Size
Make this element at least 24 by 24 CSS pixels, so it's easy to activate with a pointer or a touchscreen.
WCAG 2.5.8AA
iframe Missing Title
Add a title attribute describing this frame's content, so assistive technology users know what it is before they enter it.
WCAG 4.1.2A
Dragging Movements
Provide a way to trigger this action with a single click or tap, not just a drag gesture.
WCAG 2.5.7AA
Auth Paste Blocked
Remove the paste-blocking handler on this field, or offer another way to complete authentication without retyping.
WCAG 3.3.8AA
Elementor Autoplay Carousel
This carousel starts playing automatically with no visible way to pause it.
WCAG 2.2.2A
Elementor Background Video
This section's background video plays automatically with no visible way to pause it.
WCAG 2.2.2A
Elementor Toggle Accordion
This toggle/accordion header isn't a real button and has no aria-expanded or aria-controls.
WCAG 4.1.2A
Elementor Table of Contents
This table-of-contents link targets a heading id that no longer exists on the page.
WCAG 4.1.2A
Empty Button
Add visible text or an aria-label so the button announces what it does.
WCAG 4.1.2A
Link Anchor Broken
Fix the href fragment, or add the missing id it's supposed to jump to.
WCAG 2.4.1A
Link Improper Use
Use a real <button> for this action instead of a link with href="#" and a click handler.
WCAG 4.1.2A
Content Viewport Not Scalable
Remove user-scalable=no and any maximum-scale below 2, so visitors can zoom in. Only checked on full-page scans (Pro's full-site and front-end checks) — the viewport tag lives in <head>, which an ordinary per-post scan never sees.
WCAG 1.4.4AA
Content Blink/Marquee
Remove the deprecated <blink> or <marquee> element, or replace it with content that has a visible pause control.
WCAG 2.2.2A
Content Fake Spacing (br)
Use separate paragraph tags with normal spacing instead of stacked line breaks.
WCAG 1.3.1A
Content Font Size in Viewport Units
Use a relative unit such as em or rem instead of a viewport unit for font-size.
WCAG 1.4.4AA
Table Summary Duplicates Caption
Remove the summary attribute, or give it text that adds information beyond the caption.
WCAG 1.3.1A
Title Attribute Redundant FIX
Remove the title attribute, or give it text that adds information beyond what's already visible.
WCAG 4.1.2A
Font Size Absolute
Use a relative unit such as em, rem or % so text scales with the user's preferences.
WCAG 1.4.4AA
Form Fieldset Ungrouped
Wrap the related options in a <fieldset> with a <legend> describing the group.
WCAG 1.3.1A
Heading Missing
Break the content up with headings so its structure is available to assistive technology and sighted skimmers alike.
WCAG 1.3.1A
Image Alt Empty
Empty alt text is correct for purely decorative images — confirm that's the case here, or add real alt text.
WCAG 1.1.1A
Image Alt/Title Redundant
Remove the title attribute, or give it text that adds information beyond the alt text.
WCAG 1.1.1A
Image Self-Linked, No Text
Add visible or screen-reader-only text explaining what following this link does, or remove it.
WCAG 2.4.4A
Link Adjacent Duplicate
Combine the two links into one, or mark the redundant one aria-hidden so it's skipped by assistive technology.
WCAG 1.1.1A
Link Bare URL as Text
Replace the raw URL with text that describes the destination.
WCAG 2.4.4A
Link Email Unlinked
Wrap the email address in a mailto: link so it can be activated directly.
WCAG 1.1.1A
Link New Window, No Noopener FIX
Add rel="noopener" so the page it opens can't use window.opener to redirect this tab.
WCAG 3.2.5AAA
Link Text Ambiguous
Rewrite the link text to describe where it goes, instead of "click here."
WCAG 2.4.4A
Table Layout Role Missing
If this table is layout-only, add role="presentation"; if it holds real data, add proper header cells.
WCAG 1.3.1A
Table Scope Invalid
Add scope="col" or scope="row" to make the header's association with its cells explicit.
WCAG 1.3.1A
Redundant Entry
These fields may ask for the same information twice — auto-populate the later one, or let the user re-select a previous answer.
WCAG 3.3.7A
Form Label Duplicate
Give each label distinct text so visitors navigating by label name can tell the fields apart.
WCAG 3.3.2A
Image Longdesc Invalid
Fix the longdesc fragment to point at an id that exists, or add the missing long description. Only checked for same-page (#id) references — an external longdesc URL can't be verified without fetching it.
WCAG 1.1.1A
Media Transcript Missing
Link to a transcript near the player, if one exists — or add one. This is a heuristic: it only checks for the word "transcript" nearby, and can't confirm one is actually accurate or present.
WCAG 1.2.1A
Reference

Accessibility Fixes PRO

Auto-fix is deliberately narrow: it only ever makes a mechanical correction where nothing has to be invented. It never writes alt text, never guesses at a page title, and never fabricates content — if there's nothing safe to do, it says so instead of guessing.

Every fix is verified, not just applied. After fixing an issue, the plugin immediately rechecks that exact spot against the same rule that flagged it. If it's still failing, the issue is reopened for you to look at instead of being marked fixed anyway — the fix is never just trusted on its own say-so.

Redundant title attributes removed

When an element's title attribute exactly duplicates its own visible text, the attribute is removed — it wasn't adding information a sighted or assistive-technology user didn't already have.

Empty headings removed

A heading tag with no real content inside it is removed entirely, rather than left as a confusing stop in the page's outline.

Site language set automatically

If no site language is configured, it's set from your site's own current locale — a real, already-known fact about the site, never a guess.

rel="noopener" added to new-window links

Any link that opens in a new tab gets rel="noopener" added automatically, closing a real security gap alongside the accessibility one.

Positive tabindex clamped to zero

A tabindex value greater than zero (which forces an arbitrary tab order) is clamped down to tabindex="0", keeping the element focusable in its natural document position.

New-window warning text added

A visually-hidden "(opens in a new window)" notice is appended to links that open in a new tab without saying so, using the same convention already used across the plugin's own admin screens.

Missing form labels added

An unlabeled field is wrapped in a real <label>, using the field's own placeholder text if it has one, or a readable version of its name attribute. If a field has neither, nothing is invented — it's left for you to label by hand.

Fix one issue at a time from its row in the Dashboard, or click Fix All Safe Issues to run every applicable fix across your site in one batch. Every fix is logged with a full before/after, and can be undone with one click.

On the roadmap

Not shipped yet. Listed here on purpose instead of left unmentioned, so it's clear what's live today (above) versus planned.

dir attribute alongside lang PLANNED

WordPress core already outputs a correct dir attribute for any theme that calls language_attributes() — the same function lang-missing's fix relies on. A missing dir almost always means the active theme isn't calling it, which isn't something a plugin can patch inside someone else's theme file. Detecting and naming the specific theme file to check is the realistic version of this, not a one-click fix.

Focus outline restored PLANNED

Full-site CSS scanning already detects an @media rule that strips focus-outline visibility. Adding the fix itself — re-adding a visible outline where one was removed — is the natural next step.

File size & type added to links PRO PLANNED

Appends a visually-hidden note like "(PDF, 2.3 MB)" to links pointing at downloadable files. Needs to resolve the real file (a Media Library lookup, or a request for external links) rather than guess — real I/O, not just a DOM edit.

Block links opening new windows PLANNED

A site-wide setting to strip target="_blank" from links at render time, rather than fixing each one individually.

Block PDF uploads PRO PLANNED

An upload-time guard rather than a scan/fix — warns or blocks when a PDF (often inaccessible without extra work) is uploaded to the Media Library.

Skip link PLANNED

Injecting the link itself is easy; reliably finding where "main content" begins in an arbitrary theme is not. This ships once there's a version that doesn't risk jumping to the wrong place on some themes.

Error on empty search submission PLANNED

Needs to hook into however the active theme's search form is actually built, which varies a lot theme to theme — the compatibility work, not the validation logic, is the real scope here.

Force link underline PLANNED

A site-wide toggle that underlines inline links via CSS, so links aren't distinguished by color alone. The simplest item on this list — no content is touched, just a stylesheet rule.

Label comment fields PLANNED

The comment form lives in the active theme's template, not in post content — neither the per-post scanner nor the full-site scanner reads it today. This needs a new scan source, not just a new rule.

Label search fields PLANNED

Same gap as comment fields: the search form is theme template output, out of reach of today's scan sources.

Make viewport scalable — the fix PLANNED

The detection already ships today. The viewport meta tag lives in the theme's header, never in post content, so this needs its own site-level override mechanism — the same shape as how the language fix works — rather than the normal per-post fix path.

Adding a missing page title isn't planned, on purpose. Auto-generating a page title means inventing content, which is exactly what this feature deliberately never does (see this section's opening paragraph). The check for a blank title stays — the auto-fix for it doesn't. This one stays a manual-review item.
Developer Documentation

Building on top of DigitalPlugs ADA Compliance

Every hook, REST route, and CLI command below is real and currently shipping — pulled directly from the plugin's own source, not aspirational.

Adding a Custom Rule

Every check is a small class extending DPWPADAC_Rule, registered through the dpwpadac_register_rules filter. This is exactly how every one of the 57 built-in checks is registered — there's no separate "custom rule" API, just the same one the plugin uses for itself.

functions.php
class My_Custom_Rule extends DPWPADAC_Rule {

	public function get_id() {
		return 'my-custom-rule';
	}

	public function get_severity() {
		return 'warning'; // or 'alert'
	}

	public function get_wcag_ref() {
		return '1.1.1';
	}

	public function get_help_text() {
		return __( 'Plain-English fix instructions.', 'my-textdomain' );
	}

	public function check( DOMXPath $xpath ) {
		$issues = [];
		foreach ( $xpath->query( '//div[@data-broken]' ) as $node ) {
			$issues[] = new DPWPADAC_Issue(
				$this->get_id(),
				$this->get_severity(),
				$node->getNodePath(),
				__( 'Description of what is wrong.', 'my-textdomain' ),
				$this->get_wcag_ref()
			);
		}
		return $issues;
	}
}

add_filter( 'dpwpadac_register_rules', function ( $rules ) {
	$rules[] = 'My_Custom_Rule';
	return $rules;
} );

Overriding fix( DOMNode $node ) as well makes your rule eligible for the auto-fix engine automatically — the plugin discovers auto-fixable rules by checking which ones override that method, not from a separate list you'd have to keep in sync.

Filters & Actions

HookTypePluginWhat it's for
dpwpadac_register_rulesfilterFreeRegister a custom rule class (see above).
dpwpadac_map_capabilityfilterFreeOverride which WordPress capability a given plugin ability requires.
dpwpadac_issue_createdactionFreeFires whenever a scan records a brand-new issue.
dpwpadac_full_scan_availablefilterFree/ProWhether the "Full Site Scan" button should appear. Pro hooks this to true.
dpwpadac_bulk_fix_availablefilterFree/ProWhether "Fix All Safe Issues" should appear. Pro hooks this to true once licensed.
dpwpadac_pro_reports_availablefilterFree/ProWhether Email/Export/VPAT buttons should appear on the Dashboard.
dpwpadac_pro_autofixable_rulesfilterFree/ProThe list of rule ids the auto-fix engine currently supports.
dpwpadac_pro_fix_action_htmlfilterFree/ProRenders the "Fix" / "Undo Fix" row action link on the Issues table.
dpwpadac_guidelines_after_introactionFreeFires after the intro text on the Guidelines Reference admin page.
dpwpadac_help_after_cardsactionFreeFires after the Documentation/Pro cards on the Help admin page.
dpwpadac_after_code_snippetactionFreeFires after the "View Code" modal's raw-HTML snippet.
dpadacpro_full_scan_completedactionProFires once a full-site scan finishes.
dpadacpro_full_site_issue_createdactionProFires per new issue found outside posts/pages (widgets, menus, templates, etc.).
dpadacpro_full_scan_excluded_shortcodesfilterProShortcodes the full-site scanner should never render/evaluate.

REST API

Everything lives under the dpwpadac/v1 namespace. The routes below are split by what they're for — the first group is what the editor panels themselves call, scoped to a capability check on that one post; the second is Pro's headless/CI-facing group, authenticated separately.

MethodRouteDescription
GET/posts/{id}/issuesThis post's currently open issues, shaped for the editor panels.
POST/posts/{id}/scanRescans the post from its saved content and returns the updated issue list.
POST/scan-htmlScans an arbitrary HTML snapshot (e.g. a live preview iframe) and returns issues with node paths valid against that exact snapshot.
GET/site-summaryPRO Site-wide score, WCAG level, and issue counts.
GET/issuesPRO Paginated, filterable by status, severity, rule_id.
POST/scan/fullPRO Triggers a full-site scan headlessly.

The first group authenticates like any other WordPress REST route (a logged-in session with edit rights on that specific post). Pro's headless group additionally accepts a bearer token equal to your site's own activated license key — the same credential a CI pipeline would already hold to run the WP-CLI commands below, so it doesn't need a separate application password just to poll a status.

cURL — headless site summary
curl -H "Authorization: Bearer YOUR_LICENSE_KEY" \
  https://yoursite.com/wp-json/dpwpadac/v1/site-summary

WP-CLI

All three commands run synchronously in the CLI process itself — no waiting on a WP-Cron batch chain — so they're safe to call from a CI pipeline with a normal exit code.

Scan the site
# Posts and pages only
wp ada-compliance scan --format=json

# Posts, pages, widgets, menus, templates, terms, shortcodes and theme CSS (Pro)
wp ada-compliance scan --full
Generate a report (Pro)
wp ada-compliance report --format=vpat --file=/tmp/vpat.pdf
wp ada-compliance report --format=excel --file=/tmp/issues.xlsx
List stored issues
wp ada-compliance list-issues --status=open --severity=warning --format=json
FAQ

Honest answers to the questions that matter

Does passing every check mean my site is legally compliant?

No, and we won't tell you otherwise. Automated scanning — ours or anyone else's — can only catch what's mechanically detectable. Things like whether alt text is actually accurate, whether a keyboard flow genuinely makes sense, or whether a PDF is readable, still need a human to check. Treat a clean scan as a strong, evidenced starting point, not a certificate. The VPAT/ACR report says this explicitly, in writing, on the report itself.

Does the visitor accessibility toolbar make my site compliant on its own?

No. It can genuinely help some visitors adjust the page to their needs, but it doesn't change your site's actual markup, and toolbar-only "solutions" are explicitly not considered sufficient by most accessibility guidance. Use it as a nice-to-have on top of actually fixing issues, never instead of it.

What happens if my Pro license expires?

Every check the free plugin runs keeps running — scanning never stops. You lose access to auto-fix, exports, scheduled scans, the front-end checker and visitor toolbar, and updates/support, until it's renewed.

Will testing on a staging copy of my site use up an activation?

No. Local and staging domains (localhost, .test, .local, any staging. subdomain) are recognized automatically and skip the remote activation call entirely, so cloning your site for testing never costs you a licensed site slot.

Still stuck on something?

This page covers the plugin end to end, but if something here doesn't match what you're seeing, it's worth a second look before assuming it's expected — accessibility tooling should never ask you to just take its word for it.