{"id":360145,"date":"2026-09-09T00:28:17","date_gmt":"2026-09-09T00:28:17","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/lodestone-accessibility-audit\/"},"modified":"2026-09-09T00:27:57","modified_gmt":"2026-09-09T00:27:57","slug":"lodestone-accessibility-audit","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/lodestone-accessibility-audit\/","author":23555647,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.4","stable_tag":"1.0.4","tested":"7.1","requires":"6.4","requires_php":"7.4","requires_plugins":null,"header_name":"Lodestone Accessibility Audit","header_author":"Francisco Loureiro","header_description":"Accessibility scanner and auditor. Finds WCAG 2.2 issues in your posts and pages with axe-core, explains each one and tracks what you fixed. Not an overlay.","assets_banners_color":"192348","last_updated":"2026-09-09 00:27:57","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":43,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","faq","changelog"],"tags":{"1.0.4":{"tag":"1.0.4","author":"loureiro70","date":"2026-09-09 00:27:57","revision":3687404}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3687404,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3687404,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3687404,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3687404,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3687404,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.4"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3687404,"resolution":"1","location":"assets","locale":"","width":2800,"height":1800},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3687404,"resolution":"2","location":"assets","locale":"","width":2800,"height":2000},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3687404,"resolution":"3","location":"assets","locale":"","width":2800,"height":2000},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3687404,"resolution":"4","location":"assets","locale":"","width":2800,"height":1800},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3687404,"resolution":"5","location":"assets","locale":"","width":2800,"height":2400}},"screenshots":{"1":"The dashboard: open issues by severity and the worst offending pages.","2":"Issue detail: the failing rule, the WCAG success criterion, the element and the markup at fault.","3":"Ignoring an issue, with the required written reason that becomes your evidence trail.","4":"The block editor sidebar, which re-scans the post each time you save.","5":"The generated accessibility statement page."}},"plugin_section":[],"plugin_tags":[1447,1953,2682,241427,1956],"plugin_category":[34],"plugin_contributors":[279793],"plugin_business_model":[],"class_list":["post-360145","plugin","type-plugin","status-publish","hentry","plugin_tags-a11y","plugin_tags-accessibility","plugin_tags-ada","plugin_tags-eaa","plugin_tags-wcag","plugin_category-accessibility","plugin_contributors-loureiro70","plugin_committers-loureiro70"],"banners":{"banner":"https:\/\/ps.w.org\/lodestone-accessibility-audit\/assets\/banner-772x250.png?rev=3687404","banner_2x":"https:\/\/ps.w.org\/lodestone-accessibility-audit\/assets\/banner-1544x500.png?rev=3687404","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/lodestone-accessibility-audit\/assets\/icon.svg?rev=3687404","icon":"https:\/\/ps.w.org\/lodestone-accessibility-audit\/assets\/icon.svg?rev=3687404","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/lodestone-accessibility-audit\/assets\/screenshot-1.png?rev=3687404","caption":"The dashboard: open issues by severity and the worst offending pages."},{"src":"https:\/\/ps.w.org\/lodestone-accessibility-audit\/assets\/screenshot-2.png?rev=3687404","caption":"Issue detail: the failing rule, the WCAG success criterion, the element and the markup at fault."},{"src":"https:\/\/ps.w.org\/lodestone-accessibility-audit\/assets\/screenshot-3.png?rev=3687404","caption":"Ignoring an issue, with the required written reason that becomes your evidence trail."},{"src":"https:\/\/ps.w.org\/lodestone-accessibility-audit\/assets\/screenshot-4.png?rev=3687404","caption":"The block editor sidebar, which re-scans the post each time you save."},{"src":"https:\/\/ps.w.org\/lodestone-accessibility-audit\/assets\/screenshot-5.png?rev=3687404","caption":"The generated accessibility statement page."}],"raw_content":"<!--section=description-->\n<p>Accessibility Audit finds the accessibility problems on your WordPress pages and tells you what\nis wrong, which WCAG 2.2 success criterion it fails, which element is at fault, and how to fix\nit. It is a scanner and a reporter for the person maintaining the site \u2014 not a widget bolted\nonto the front end for visitors.<\/p>\n\n<p>Scanning runs in your own browser using axe-core, the same open-source engine behind most\nprofessional accessibility tooling. Your pages and your results are never sent anywhere. No\naccount, no API key, no scanning service, no setup wizard. Activate the plugin and scan a page\nimmediately.<\/p>\n\n<h4>This is not an accessibility overlay<\/h4>\n\n<p>Overlay widgets promise to \"fix\" accessibility with a line of JavaScript that rewrites your\npage for visitors. They are rejected by the disability community, they have been the subject of\nlawsuits, and they do not work. This plugin adds nothing to your front end at all. It shows you\nwhat is broken so that you can fix it properly, in your content and your theme.<\/p>\n\n<h4>What the free version does, permanently<\/h4>\n\n<ul>\n<li>Scan any post, page or custom post type on demand, from the row action in your lists or from the block editor sidebar.<\/li>\n<li>Re-scan automatically when you save a post in the block editor.<\/li>\n<li>Full detail on every issue: the axe rule, its impact level, the WCAG 2.2 success criterion it maps to, the CSS selector, the offending markup, and a link to the fix documentation.<\/li>\n<li>A dashboard across everything you have scanned: open issues, a breakdown by severity, and the worst offending pages.<\/li>\n<li>Ignore an individual issue, with a required written reason recorded against your name and the date.<\/li>\n<li>Generate a plain accessibility statement page.<\/li>\n<\/ul>\n\n<p>There is no page limit, no scan quota, no trial period, and nothing that switches itself off\nlater. If you never buy the Pro version, nothing you use today stops working.<\/p>\n\n<h4>What Pro adds<\/h4>\n\n<p>Pro is for people who have to <em>prove<\/em> the work was done: a full ignore log with author, date and\nreason, exportable; history and trend lines showing regressions; CSV and printable audit\nexports; and the EN 301 549 statement form the European Accessibility Act expects. It also adds\na full-site scan queue, scheduled re-scans, a small set of genuinely safe server-side fixes (all\noff by default), WP-CLI and a multisite network dashboard.<\/p>\n\n<h4>One notice, and one menu<\/h4>\n\n<p>The plugin shows exactly one dismissible admin notice, ever. It tells you where the plugin\nlives and retires itself the moment you open that screen. It registers one top-level menu and\nnothing else: every screen is a tab inside it. No banners, no countdown timers, no nags on\nother people's screens, no onboarding wizard, and nothing installed or suggested that you did\nnot ask for.<\/p>\n\n<p>There is no activation step and no consent screen in your way. Licensing is handled by the\nFreemius SDK, which starts switched off: nothing is registered and nothing is transmitted\nunless you go and opt in, and everything works whether you ever do or not. The one thing not\nin our hands is that opening the upgrade page adds a Freemius \"Upgrade\" item under the menu\nwhile you are on it.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20make%20my%20site%20wcag%20compliant%3F\"><h3>Does this make my site WCAG compliant?<\/h3><\/dt>\n<dd><p>No, and be sceptical of any tool that says it does. Automated testing detects only a portion of\naccessibility barriers \u2014 commonly estimated at around a third. It is very good at the things\nmachines can check: missing alternative text, insufficient colour contrast, unlabelled form\nfields, broken heading structure, invalid ARIA. It cannot tell you whether your alt text is\n<em>meaningful<\/em>, whether your page makes sense when read aloud in order, or whether a custom\ncomponent actually works with a screen reader. This plugin finds the automatable third and is\nhonest about the rest, including in the statement it generates for you.<\/p><\/dd>\n<dt id=\"is%20this%20an%20accessibility%20overlay%20or%20a%20toolbar%3F\"><h3>Is this an accessibility overlay or a toolbar?<\/h3><\/dt>\n<dd><p>No. It adds nothing to your front end. Overlays inject JavaScript that alters your pages for\nvisitors at runtime, which is a different product with a bad reputation it has earned \u2014 they\nfrequently break the assistive technology they claim to help, and the disability community has\nbeen consistently clear that they are not a substitute for accessible markup. This plugin only\nreads your pages and reports on them.<\/p><\/dd>\n<dt id=\"what%20is%20the%20european%20accessibility%20act%3F\"><h3>What is the European Accessibility Act?<\/h3><\/dt>\n<dd><p>The EAA is EU legislation, in force since June 2025, that requires a range of products and\nservices \u2014 including many websites and e-commerce operations \u2014 to meet accessibility\nrequirements. In practice conformance is assessed against EN 301 549, which incorporates WCAG.\nIt generally expects you to be able to show what you tested, when, what you found, and what you\ndecided about anything you did not fix. That evidence trail is what the ignore log and the audit\nexport exist to produce.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20send%20my%20content%20anywhere%3F\"><h3>Does the plugin send my content anywhere?<\/h3><\/dt>\n<dd><p>No. axe-core is bundled with the plugin and runs in your browser, against your own site, on your\nown machine. Your pages, your scan results and your ignore reasons never leave your server.<\/p>\n\n<p>The only component that could is the Freemius SDK, which handles licensing, and it starts\nswitched off. It contacts nothing until you choose to opt in, and if you never do, it never\ndoes. Opting in is offered rather than required, it tells you exactly what it would share\nfirst (your WordPress user's name and email address, your site address and title, your\nWordPress and PHP versions, and the list of plugins and themes installed), and every feature\nworks the same either way.<\/p><\/dd>\n<dt id=\"why%20does%20the%20scan%20open%20my%20page%20in%20a%20hidden%20frame%3F\"><h3>Why does the scan open my page in a hidden frame?<\/h3><\/dt>\n<dd><p>Contrast ratios, computed styles and focus order only exist once a page has actually been laid\nout by a browser. There is no way to evaluate them by parsing HTML on the server, and any tool\nthat claims to will give you wrong answers. So the scanner loads your page in an offscreen frame\nand measures the real rendered result. The frame is only ever created for a logged-in user with\nediting permission, and the scanning script is never loaded for ordinary visitors.<\/p><\/dd>\n<dt id=\"can%20i%20scan%20drafts%3F\"><h3>Can I scan drafts?<\/h3><\/dt>\n<dd><p>Yes. Unpublished posts are scanned through their preview link, and the result is recorded\nagainst the post itself, so its history carries over when you publish.<\/p><\/dd>\n<dt id=\"can%20i%20translate%20it%3F\"><h3>Can I translate it?<\/h3><\/dt>\n<dd><p>Yes, and it will always be free to do so. Every string is translatable and a POT file ships with\nthe plugin.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>The published accessibility statement now reads \"3 pages were tested\" rather than \"3 page(s) were tested\". It is a document you put your own name to, and it should not look like nobody read it.<\/li>\n<li>The same fix in the Pro full-site scan queue and its WP-CLI commands, which counted pages the same way.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Fixed: scanning did not work on sites using WordPress' default \"plain\" permalinks. The scanner built a REST URL that put its argument inside the route name, so every scan failed with a routing error. It now works whichever permalink structure you use.<\/li>\n<li>The plugin's own dashboard is now the first thing you see. Opting in to email updates is offered rather than required, and nothing is transmitted unless you choose it.<\/li>\n<li>The dashboard now keeps a \"Scan another page\" button once you have scanned something, instead of removing every control after the first scan.<\/li>\n<li>Prices are shown in euros per year on the upgrade page, matching the Pro tab, instead of being converted to a monthly figure in dollars.<\/li>\n<li>Authors and contributors are no longer shown the accessibility statement tab, which needs a capability they do not have, or the Pro pitch, which they cannot act on. They keep the dashboard and can scan their own drafts.<\/li>\n<li>Issues are now titled in plain English \u2014 \"Images must have alternative text\" rather than \"image-alt\". The axe rule id is still shown, and still linked to its documentation.<\/li>\n<li>Fixed: the dashboard's \"nothing scanned yet\" button sent Authors and Contributors to the Pages list, which they cannot open. It now points at the list their role can actually use.<\/li>\n<li>Fixed: the block editor sidebar reported \"1 open issues\".<\/li>\n<li>Fixed: \"0 further checks could not be decided automatically\" was printed after every clean scan.<\/li>\n<li>The ignore log, CSV export and printable report now name WCAG success criteria in full (\"1.1.1 Non-text Content (A)\") instead of printing axe's internal tags.<\/li>\n<li>The Pro description no longer lists a safe fix that the Safe fixes screen does not offer.<\/li>\n<li>Clearer wording throughout on what the optional Freemius opt-in prompt is and what it shares.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Ignoring or reopening an accessibility issue now refuses by default. Rulings on issues whose scan is missing, or on a scanned URL that is not a post, previously fell through the per-post check; they now require the Editor capability, and an issue with no scan behind it can be ruled on by nobody.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Site-wide figures, the ignore log, the history chart and the printable report now require the Editor capability. Authors and Contributors see the dashboard scoped to their own content instead of the whole site.<\/li>\n<li>The full-site scan REST endpoints now require the same administrator capability as the screen that drives them.<\/li>\n<li>Class and view loading is restricted to files inside the plugin directory.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Scan any page for accessibility problems, get WCAG 2.2 detail on every issue, and publish a dated accessibility statement. Not an overlay.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/360145","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=360145"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/loureiro70"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=360145"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=360145"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=360145"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=360145"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=360145"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=360145"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}