{"id":349361,"date":"2026-08-11T18:26:48","date_gmt":"2026-08-11T18:26:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/accessibility-audit\/"},"modified":"2026-08-11T18:26:15","modified_gmt":"2026-08-11T18:26:15","slug":"klarum-accessibility-scanner","status":"publish","type":"plugin","link":"https:\/\/ky.wordpress.org\/plugins\/klarum-accessibility-scanner\/","author":23542943,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.1.0","stable_tag":"0.1.0","tested":"7.0.3","requires":"6.4","requires_php":"8.1","requires_plugins":null,"header_name":"Klarum Accessibility Scanner","header_author":"Klarum","header_description":"Scans posts, pages and the media library against WCAG 2.1 AA and shows exactly where to fix each finding. Adds nothing to the public side of your site.","assets_banners_color":"18233d","last_updated":"2026-08-11 18:26:15","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/profiles.wordpress.org\/arkhangel1\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":27,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.1.0":{"tag":"0.1.0","author":"arkhangel1","date":"2026-08-11 18:26:15"}},"upgrade_notice":{"0.1.0":"<p>First release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3642382,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3642382,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3642382,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3642382,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.1.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3642382,"resolution":"1","location":"assets","locale":"","width":1280,"height":1000},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3642382,"resolution":"2","location":"assets","locale":"","width":1280,"height":1000},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3642382,"resolution":"3","location":"assets","locale":"","width":1280,"height":1000},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3642382,"resolution":"4","location":"assets","locale":"","width":1280,"height":1000}},"screenshots":{"1":"Overview: findings grouped by severity, with what changed since the last check.","2":"Findings: every problem with its impact, how to fix it, and a direct link to the right screen.","3":"Bulk alt text editor: image, field and controls on one screen.","4":"Rule catalogue: every rule with its WCAG criterion, EN 301 549 clause and verification status."}},"plugin_section":[],"plugin_tags":[1447,1953,2682,17214,1956],"plugin_category":[34],"plugin_contributors":[275243],"plugin_business_model":[],"class_list":["post-349361","plugin","type-plugin","status-publish","hentry","plugin_tags-a11y","plugin_tags-accessibility","plugin_tags-ada","plugin_tags-alt-text","plugin_tags-wcag","plugin_category-accessibility","plugin_contributors-arkhangel1","plugin_committers-arkhangel1"],"banners":{"banner":"https:\/\/ps.w.org\/klarum-accessibility-scanner\/assets\/banner-772x250.png?rev=3642382","banner_2x":"https:\/\/ps.w.org\/klarum-accessibility-scanner\/assets\/banner-1544x500.png?rev=3642382","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/klarum-accessibility-scanner\/assets\/icon-128x128.png?rev=3642382","icon_2x":"https:\/\/ps.w.org\/klarum-accessibility-scanner\/assets\/icon-256x256.png?rev=3642382","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/klarum-accessibility-scanner\/assets\/screenshot-1.png?rev=3642382","caption":"Overview: findings grouped by severity, with what changed since the last check."},{"src":"https:\/\/ps.w.org\/klarum-accessibility-scanner\/assets\/screenshot-2.png?rev=3642382","caption":"Findings: every problem with its impact, how to fix it, and a direct link to the right screen."},{"src":"https:\/\/ps.w.org\/klarum-accessibility-scanner\/assets\/screenshot-3.png?rev=3642382","caption":"Bulk alt text editor: image, field and controls on one screen."},{"src":"https:\/\/ps.w.org\/klarum-accessibility-scanner\/assets\/screenshot-4.png?rev=3642382","caption":"Rule catalogue: every rule with its WCAG criterion, EN 301 549 clause and verification status."}],"raw_content":"<!--section=description-->\n<p>Klarum Accessibility Scanner scans your posts, pages and media library against WCAG 2.1 AA criteria and points you to the exact screen where each problem can be fixed \u2014 the media item, the post editor, the theme setting.<\/p>\n\n<p><strong>This plugin adds nothing to your public site.<\/strong> No JavaScript, no widget, no toolbar. Accessibility overlays that promise to \"fix\" a site from the visitor's browser are widely rejected by accessibility practitioners, and this plugin deliberately does not work that way. It finds problems; you fix them at the source.<\/p>\n\n<h4>What it checks<\/h4>\n\n<ul>\n<li>Images \u2014 missing alternative text, alt text that is just a filename, redundant \"image of\u2026\" prefixes, overly long descriptions<\/li>\n<li>Headings \u2014 empty headings, skipped levels, multiple H1s<\/li>\n<li>Links \u2014 empty links, uninformative text (\"read more\", \"click here\"), bare URLs, identical text pointing to different destinations<\/li>\n<li>Tables \u2014 missing header cells<\/li>\n<li>Embedded frames \u2014 missing title attribute<\/li>\n<li>Form fields \u2014 missing labels<\/li>\n<li>Video \u2014 flags embedded media so you can confirm captions exist<\/li>\n<li>Site \u2014 missing language attribute on the page<\/li>\n<\/ul>\n\n<h4>One standard, many laws<\/h4>\n\n<p>WCAG 2.1 level AA is the technical criterion that nearly every accessibility law points to. This plugin checks against WCAG and tells you which criterion each finding relates to, which is what matters whichever framework applies to you:<\/p>\n\n<ul>\n<li><strong>ADA<\/strong> (United States) \u2014 courts and the DOJ treat WCAG as the practical yardstick for web accessibility<\/li>\n<li><strong>Section 508<\/strong> (US federal agencies and their contractors) \u2014 incorporates WCAG 2.0 AA by reference<\/li>\n<li><strong>EAA \/ EN 301 549<\/strong> (European Union) \u2014 the harmonised standard points to WCAG 2.1 AA<\/li>\n<li><strong>AODA<\/strong> (Ontario), and other national frameworks built on the same criteria<\/li>\n<\/ul>\n\n<p>The plugin does not certify compliance with any of them, and says so on every screen. What it gives you is the technical evidence and the exact criterion reference, so you or your lawyer can reason about the rest.<\/p>\n\n<h4>Page builders<\/h4>\n\n<p>Elementor and Divi content is read directly from where the builder stores it, so pages built with them are checked like any other. Elementor takes image alt text from the media library, which means the bulk alt editor fixes those pages too.<\/p>\n\n<p>Builders whose format is not supported (Beaver Builder, Bricks, WPBakery, Oxygen, Brizy) are detected and reported as a coverage notice. An empty result on such a page means \"not checked\", never \"no problems\" \u2014 and the plugin says so instead of staying silent.<\/p>\n\n<h4>Settings<\/h4>\n\n<p>Choose which post types and statuses to scan, how many objects to process per request (lower it on a slow host), and which role may use the tool. Every setting is also a filter, so an agency can deploy the same configuration across sites from a must-use plugin.<\/p>\n\n<h4>WP-CLI<\/h4>\n\n<pre><code>wp klarum scan                       # run a scan\nwp klarum scan --porcelain           # just the number, for scripts\nwp klarum issues --severity=critical\nwp klarum issues --new --format=csv  # regressions since the last scan\nwp klarum alt --format=count\nwp klarum rules\n<\/code><\/pre>\n\n<h4>Bulk alt text editor<\/h4>\n\n<p>Describing several hundred images through the standard media library takes hours. This plugin puts the image, the input field and the controls on one screen: type, press Enter, focus moves to the next image.<\/p>\n\n<p>It also lets you mark an image as <strong>decorative<\/strong>. WordPress cannot distinguish \"alt was never filled in\" from \"alt is intentionally empty\" \u2014 both are stored as an empty value. Without an explicit marker, decorative images would be suggested for description forever.<\/p>\n\n<h4>Accessibility statement generator<\/h4>\n\n<p>Builds a draft accessibility statement following the section structure of the European model form (Directive (EU) 2016\/2102): conformance status, non-accessible content, preparation method, feedback channel and enforcement procedure. Required for public sector bodies in the EU.<\/p>\n\n<p>The page is always created as a <strong>draft<\/strong>. Many countries publish a mandatory template in their national language, and the text must be checked against it before publishing.<\/p>\n\n<h4>Honest about its limits<\/h4>\n\n<p>Automated testing finds only a portion of accessibility problems. This plugin says so on every screen, and includes a \"Rule catalogue\" page listing every rule, the WCAG criterion it relies on, the corresponding EN 301 549 clause, and whether that reference has been verified against the primary source.<\/p>\n\n<p>It also distinguishes what kind of claim each finding makes:<\/p>\n\n<ul>\n<li><strong>Documented W3C failure<\/strong> \u2014 the finding matches a failure listed by the W3C on the criterion page, with its own number such as F30.<\/li>\n<li><strong>Criterion requirement<\/strong> \u2014 the finding breaks the wording of the criterion or one of its sufficient techniques.<\/li>\n<li><strong>Best practice<\/strong> \u2014 the finding makes the site worse but is not a WCAG violation. A skipped heading level is the clearest example: the sufficient techniques for 1.3.1 do not require unbroken level order.<\/li>\n<\/ul>\n\n<p>Six of the twenty rules turned out to be best practices rather than violations. The plugin labels them as such instead of attaching a criterion they do not actually breach.<\/p>\n\n<p>It does <strong>not<\/strong> check: whether alt text is meaningful, keyboard focus order, colour contrast of rendered pages, PDF accessibility, caption quality, or content produced by shortcodes, page builders and theme templates.<\/p>\n\n<p>It does <strong>not<\/strong> certify legal compliance. Full WCAG conformance is established by combining automated checks with manual testing, including testing with people who use assistive technology.<\/p>\n\n<h4>Languages<\/h4>\n\n<p>The interface is written in English and fully prepared for translation. Any language can be added by the community at translate.wordpress.org, and WordPress delivers those translations automatically.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>The plugin sends nothing anywhere. All analysis runs on your own server. There is no telemetry, no external API, no account required.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to <code>\/wp-content\/plugins\/<\/code> or install it through the Plugins screen.<\/li>\n<li>Activate it.<\/li>\n<li>Open <strong>Accessibility \u2192 Overview<\/strong> and press <strong>Check the site<\/strong>.<\/li>\n<\/ol>\n\n<p>Requires PHP 8.1 with the <code>mbstring<\/code> and <code>dom<\/code> extensions. Both are standard on virtually every host; if either is missing the plugin tells you instead of failing silently.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20make%20my%20site%20accessible%20automatically%3F\"><h3>Does this make my site accessible automatically?<\/h3><\/dt>\n<dd><p>No, and be sceptical of anything that claims otherwise. Accessibility is a property of your markup, content and design. This plugin finds problems and shows you where to fix them.<\/p><\/dd>\n<dt id=\"why%20is%20there%20no%20accessibility%20widget%20for%20visitors%3F\"><h3>Why is there no accessibility widget for visitors?<\/h3><\/dt>\n<dd><p>Overlay widgets are widely criticised by accessibility practitioners and by people who actually use screen readers, because they attempt to guess semantics at runtime and frequently interfere with assistive technology. This plugin takes the opposite approach.<\/p><\/dd>\n<dt id=\"will%20it%20slow%20down%20my%20site%3F\"><h3>Will it slow down my site?<\/h3><\/dt>\n<dd><p>No. The plugin registers no hooks on the public side of the site at all. Scanning runs only in the admin area, in batches, and only when you start it.<\/p><\/dd>\n<dt id=\"zero%20issues%20found%20%E2%80%94%20is%20my%20site%20accessible%3F\"><h3>Zero issues found \u2014 is my site accessible?<\/h3><\/dt>\n<dd><p>Not necessarily. Automated checks cover a limited set of criteria. A clean report means the automated checks found nothing, not that the site is accessible.<\/p><\/dd>\n<dt id=\"can%20i%20exclude%20a%20finding%3F\"><h3>Can I exclude a finding?<\/h3><\/dt>\n<dd><p>Yes, with a written justification. The reason, the author and the date are recorded, and the entry appears in the report as a documented decision rather than disappearing.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>First release. Content, media library and site-level checks; bulk alt text editor; accessibility statement generator; rule catalogue.<\/li>\n<\/ul>","raw_excerpt":"WCAG, ADA, Section 508 and EAA. Finds what is broken, shows where to fix it, and never claims compliance it cannot prove.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/349361","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=349361"}],"author":[{"embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/arkhangel1"}],"wp:attachment":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=349361"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=349361"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=349361"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=349361"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=349361"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=349361"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}