{"id":380008,"date":"2026-10-12T13:10:18","date_gmt":"2026-10-12T13:10:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/a11yfix\/"},"modified":"2026-10-14T12:03:01","modified_gmt":"2026-10-14T12:03:01","slug":"yodsira-accessibility-markup-audit","status":"publish","type":"plugin","link":"https:\/\/ewe.wordpress.org\/plugins\/yodsira-accessibility-markup-audit\/","author":23566278,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.2.4","stable_tag":"0.2.4","tested":"7.1.3","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Yodsira Accessibility Markup Audit","header_author":"Yodsira","header_description":"Accessibility audit with real markup fixes: find missing alt text, heading skips, unlabeled form fields \u2014 preview and apply safe DOM fixes. No overlay widgets.","assets_banners_color":"373b40","last_updated":"2026-10-14 12:03:01","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/yodsira-accessibility-markup-audit\/","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":138,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.2.0":{"tag":"0.2.0","author":"yodsira","date":"2026-10-12 13:10:03","revision":3741626},"0.2.1":{"tag":"0.2.1","author":"yodsira","date":"2026-10-13 11:55:09","revision":3743807},"0.2.2":{"tag":"0.2.2","author":"yodsira","date":"2026-10-14 04:11:00","revision":3745251},"0.2.3":{"tag":"0.2.3","author":"yodsira","date":"2026-10-14 10:49:43","revision":3746081},"0.2.4":{"tag":"0.2.4","author":"yodsira","date":"2026-10-14 12:03:01","revision":3746264}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3741626,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3741626,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3741626,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.2.0","0.2.1","0.2.2","0.2.3","0.2.4"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3746272,"resolution":"1","location":"assets","locale":"","width":1440,"height":900}},"screenshots":{"1":"The audit report: findings grouped by severity, each with a concrete \"how to fix\" hint.","2":"Preview before repair: the exact markup change is shown before anything goes live.","3":"Repairs screen: every auto-fix category is a separate toggle."}},"plugin_section":[],"plugin_tags":[1953,2682,8533,241427,1956],"plugin_category":[34],"plugin_contributors":[281339],"plugin_business_model":[],"class_list":["post-380008","plugin","type-plugin","status-publish","hentry","plugin_tags-accessibility","plugin_tags-ada","plugin_tags-audit","plugin_tags-eaa","plugin_tags-wcag","plugin_category-accessibility","plugin_contributors-yodsira","plugin_committers-yodsira"],"banners":{"banner":"https:\/\/ps.w.org\/yodsira-accessibility-markup-audit\/assets\/banner-772x250.png?rev=3741626","banner_2x":"https:\/\/ps.w.org\/yodsira-accessibility-markup-audit\/assets\/banner-1544x500.png?rev=3741626","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/yodsira-accessibility-markup-audit\/assets\/icon-128x128.png?rev=3741626","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/yodsira-accessibility-markup-audit\/assets\/screenshot-1.png?rev=3746272","caption":"The audit report: findings grouped by severity, each with a concrete \"how to fix\" hint."}],"raw_content":"<!--section=description-->\n<p>Yodsira Accessibility Markup Audit does not add widgets to your site. It finds real markup problems \u2014 and, for safe categories, fixes the actual DOM after showing you exactly what will change.<\/p>\n\n<p><strong>The audit<\/strong> scans your homepage, latest posts and one static page (on a schedule or on demand) and reports:<\/p>\n\n<ul>\n<li>images without alt text<\/li>\n<li>skipped heading levels (h2 \u2192 h4) and multiple h1<\/li>\n<li>links and buttons with no accessible name (icon-only links)<\/li>\n<li>form fields without labels<\/li>\n<li>pages that do not declare their language (<code>&lt;html lang&gt;<\/code>)<\/li>\n<li>missing or empty <code>&lt;title&gt;<\/code><\/li>\n<li>generic link text (\"read more\", \"click here\")<\/li>\n<\/ul>\n\n<p>Every issue comes with a severity and a one-phrase \"how to fix\" \u2014 the report is useful on its own, even if you fix everything by hand.<\/p>\n\n<p><strong>The repairs<\/strong> (each is a separate toggle):<\/p>\n\n<p>Safe, on by default:<\/p>\n\n<ul>\n<li>fill missing <code>alt<\/code> from the media library title\/alt field<\/li>\n<li>declare the page language on <code>&lt;html&gt;<\/code><\/li>\n<li>add <code>scope<\/code> to table headers<\/li>\n<\/ul>\n\n<p>Risky, off by default \u2014 review the preview first:<\/p>\n\n<ul>\n<li>accessible names for unlabeled controls (from URL slugs \/ placeholders)<\/li>\n<li>titles for untitled iframes<\/li>\n<\/ul>\n\n<p><strong>Preview before anything goes live.<\/strong> The plugin records every attribute it would add \u2014 target, attribute, new value \u2014 and shows the list before you enable a repair. Nothing is ever removed from your markup; repairs only add attributes. When a repair has nothing to change, the page is served byte-for-byte unchanged.<\/p>\n\n<p><strong>Honest scope:<\/strong> automated checks catch a part of WCAG issues (roughly the mechanical 20\u201340%); contrast, focus order and ARIA patterns still need a human expert. Use it to keep the floor high and the report short.<\/p>\n\n<p><strong>Why not an overlay?<\/strong> Overlay widgets that inject toolbars and rewrite the page at runtime are rejected by the accessibility community: they don't fix markup, sometimes break assistive tech, and create false confidence. Yodsira Accessibility Markup Audit is the opposite approach: find problems, fix the markup, show your work.<\/p>\n\n<h3>Pro Version<\/h3>\n\n<p>An optional companion plugin adds (one license = one site, 12 months of updates):<\/p>\n\n<ul>\n<li>Client-ready compliance report \u2014 printable PDF with your findings and fixes<\/li>\n<li>Weekly automatic rescans with a change digest<\/li>\n<li>Agency white-label for reports<\/li>\n<\/ul>\n\n<p>The free version is fully functional on its own and never limited.\nDetails: https:\/\/yodsira.com\/product\/a11yfix\/<\/p>\n\n<h3>Yodsira Accessibility Markup Audit Pro<\/h3>\n\n<p>The companion plugin adds the client-facing layer on top of the free audit:<\/p>\n\n<ul>\n<li>client-ready compliance report (print to PDF) with an agency white-label<\/li>\n<li>weekly rescans of up to 25 pages with change digests<\/li>\n<li>an honest \"what automation does not cover\" section<\/li>\n<\/ul>\n\n<p><a href=\"https:\/\/yodsira.com\/en\/product\/a11yfix\/\">Buy Pro \u2014 $99\/year<\/a><\/p>\n\n<h3>External Services<\/h3>\n\n<p>This plugin can send notifications ONLY to the service you configure in its\nown settings. The only connection to the developer's own service is the\noptional, off-by-default error telemetry described below \u2014 nothing is sent\nuntil you enable it yourself.<\/p>\n\n<p>-- Telegram notifications --\n* What the service is: Telegram Bot API (api.telegram.org), used to deliver\n  instant alerts to your own bot and chat.\n* What data is sent and when: a short alert text with your site name and the\n  event details - sent only when the monitored event fires or when you press\n  the test button in settings.\n* Opt-in: the feature is fully disabled until you enter your own bot token\n  and chat id; clearing them switches it off.\n* Terms: https:\/\/telegram.org\/tos\n* Privacy: https:\/\/telegram.org\/privacy<\/p>\n\n<ul>\n<li>Optional, off by default: anonymous error reports. If the admin enables\nthe checkbox on the Audit page, a daily batch of sanitized scanner error\nsignatures (message, file name:line, versions, site address) is sent to\nhttps:\/\/yodsira.com\/api\/telemetry so scan failures get fixed faster.\nNothing is sent while the checkbox is off.\nWhy: I am an independent developer, and this is the only way I learn about\nbugs I cannot reproduce myself. The free plugin makes no requests at all\nuntil you enable this option; when an error happens, an anonymous\nsignature is sent to yodsira.com so I can fix it in the next release.\nNothing else ever leaves your site, and you can switch it off at any\nmoment. Every report is read by a human.\nExample of exactly what one report looks like (sanitized):<\/li>\n<\/ul>\n\n<p>`message: \"Call to a member function get_id() on null\" \u2014 file: file.php:123 \u2014 culprit: plugin other-plugin \u2014 versions: plugin 0.2.3, WordPress 6.8, PHP 8.2\nThat is the whole payload \u2014 no content, no user data, no usage tracking.\n  Disabling telemetry clears any queued reports immediately.\n  Developer service terms: https:\/\/yodsira.com\/en\/terms\/\n  Privacy policy: https:\/\/yodsira.com\/en\/privacy\/<\/p>\n\n<h3>How the scan works<\/h3>\n\n<p>The daily scan fetches your site's own pages over HTTP (the same way a\nvisitor's browser would) and checks each page against nine concrete\nrules, for example: images without meaningful alt text, links that\ncontain only an icon with no accessible name, buttons and toggles\nmissing state attributes, and headings that skip levels. The scan runs\nfrom your own admin dashboard - no external service is involved and no\npage content leaves the site. Findings are listed with the exact URL,\nthe rule that matched and a suggested fix you can preview before\napplying.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>yodsira-accessibility-markup-audit<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install the zip via Plugins \u2192 Add New \u2192 Upload Plugin.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Open the Audit menu \u2192 press \"Run scan now\".<\/li>\n<li>Review the report; enable repairs one by one, using Preview first.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20it%20slow%20my%20site%20down%3F\"><h3>Will it slow my site down?<\/h3><\/dt>\n<dd><p>The scan runs on a cron request, never on a visitor's page load. With only safe repairs on, enabled fixes run through native WordPress filters; the output-buffered DOM pass activates only when you enable DOM-level repairs, and pages without needed changes are returned untouched.<\/p><\/dd>\n<dt id=\"can%20it%20break%20my%20layout%3F\"><h3>Can it break my layout?<\/h3><\/dt>\n<dd><p>Repairs only add attributes (alt, lang, scope, aria-label, title, value) and never touch tags, classes or styles. The preview shows every change before you enable a repair, and the front-end fixes have a master switch.<\/p><\/dd>\n<dt id=\"is%20my%20site%20compliant%20after%20this%3F\"><h3>Is my site compliant after this?<\/h3><\/dt>\n<dd><p>No automated tool can promise compliance. The plugin fixes mechanical issues and produces a clear report; a full audit needs a specialist. Anything promising \"one-click compliance\" is selling you a lawsuit risk.<\/p><\/dd>\n<dt id=\"where%20is%20my%20data%20stored%3F\"><h3>Where is my data stored?<\/h3><\/dt>\n<dd><p>Scan results live in your own database and the scanner crawls only your own site. The only outgoing connection is the optional, off-by-default error telemetry described in \"External Services\" \u2014 nothing is sent until you enable it.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.2.4<\/h4>\n\n<ul>\n<li>Update: \"Send anonymous report to developer\" \u2014 confirmation dialog,\nsending once never enables telemetry; disabling telemetry clears any\nqueued reports immediately.<\/li>\n<li>Fix: admin menu and page titles now use the plugin's real name\n(Yodsira Accessibility) instead of the legacy short label.<\/li>\n<li>Update: telemetry transparency \u2014 developer rationale in the settings block\nand readme, a sanitized example of exactly one report, and an always-visible\n\"Send error report now\" button (manual, conscious sending).<\/li>\n<\/ul>\n\n<h4>0.2.3<\/h4>\n\n<ul>\n<li>New: optional, OFF by default anonymous error telemetry (daily batch of\nsanitized signatures to yodsira.com\/api\/telemetry, disclosed in External\nServices; nothing is sent until the admin opts in).<\/li>\n<li>Readme: privacy wording aligned with the optional telemetry.<\/li>\n<\/ul>\n\n<h4>0.2.2<\/h4>\n\n<ul>\n<li>New: Yodsira Admin UI Standard \u2014 design tokens, WCAG-checked palette\n(brand mint decor-only), collapsible settings, quiet Pro side card.<\/li>\n<li>New: a one-time contextual notice on the plugin's own pages (day 7, at most\ntwice ever) inviting a wp.org rating or a support-forum report; fully\ndismissible, no tracking.<\/li>\n<\/ul>\n\n<h4>0.2.1<\/h4>\n\n<ul>\n<li>New: a \"Pro\" screen in the admin menu describing the optional Yodsira\nAccessibility Markup Audit Pro companion (client-ready PDF report, weekly rescans, agency white-label).<\/li>\n<li>Readme: new Pro Version section listing the concrete companion features.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Directory preparation release: POT template added for translate.wordpress.org.<\/li>\n<li>Screenshots section and changelog cleanup for the plugin directory page.<\/li>\n<li>Admin CSS\/JS moved to the enqueue API (wp_enqueue_style, wp_add_inline_style, wp_localize_script) \u2014 directory review feedback.<\/li>\n<li>Verified on WordPress 7.1 and PHP 7.4-8.4 (Plugin Check: 0 errors).<\/li>\n<\/ul>\n\n<h4>0.1.3<\/h4>\n\n<ul>\n<li>Platform digest deferred scheduling; dev artifacts removed.<\/li>\n<\/ul>\n\n<h4>0.1.2<\/h4>\n\n<ul>\n<li>Load the shared Yodsira family components (family status endpoint).<\/li>\n<\/ul>\n\n<h4>0.1.1<\/h4>\n\n<ul>\n<li>Added: Pro banner \u2014 the compliance-report companion plugin is now available.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>First release: audit (9 rules), safe repairs with per-repair toggles, change preview, daily scheduled scan, clean uninstall.<\/li>\n<\/ul>","raw_excerpt":"Accessibility audit with real markup fixes \u2014 and a preview before anything goes live. No overlay widgets.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ewe.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/380008","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ewe.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ewe.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ewe.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=380008"}],"author":[{"embeddable":true,"href":"https:\/\/ewe.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/yodsira"}],"wp:attachment":[{"href":"https:\/\/ewe.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=380008"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ewe.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=380008"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ewe.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=380008"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ewe.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=380008"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ewe.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=380008"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ewe.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=380008"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}