{"id":331046,"date":"2026-06-28T12:18:41","date_gmt":"2026-06-28T12:18:41","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/accessible-forms-contact-form-entry-storage\/"},"modified":"2026-07-15T10:55:30","modified_gmt":"2026-07-15T10:55:30","slug":"ananyoo-accessible-forms","status":"publish","type":"plugin","link":"https:\/\/es-ec.wordpress.org\/plugins\/ananyoo-accessible-forms\/","author":7479496,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.3.1","stable_tag":"1.3.1","tested":"7.0.1","requires":"6.5","requires_php":"7.4","requires_plugins":null,"header_name":"Ananyoo Accessible Forms \u2013 Contact Form & Entry Storage","header_author":"Shivaji Mitra (Ananyoo)","header_description":"Accessibility-first WordPress forms built to WCAG 2.2 AA by construction: labelled fields, error summary with managed focus, accessible anti-spam, entries stored as a post type, and any-SMTP delivery. Block and shortcode.","assets_banners_color":"757886","last_updated":"2026-07-15 10:55:30","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/ananyoo.com","header_plugin_uri":"https:\/\/ananyoo.com\/ananyoo-accessible-forms-plugin\/","header_author_uri":"https:\/\/ananyoo.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":193,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.1.1":{"tag":"1.1.1","author":"anblik","date":"2026-06-28 12:18:06"},"1.1.2":{"tag":"1.1.2","author":"anblik","date":"2026-06-28 15:06:56"},"1.2.0":{"tag":"1.2.0","author":"anblik","date":"2026-07-08 11:25:58"},"1.3.0":{"tag":"1.3.0","author":"anblik","date":"2026-07-15 10:32:13"},"1.3.1":{"tag":"1.3.1","author":"anblik","date":"2026-07-15 10:55:30"}},"upgrade_notice":{"1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3588733,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3588733,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3588733,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3588733,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3588733,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"ananyoo\/accessible-form":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"ananyoo\/accessible-form","version":"1.0.0","title":"Accessible Form","category":"widgets","icon":"feedback","description":"Embed a WCAG 2.2 AA accessible form by Ananyoo.","keywords":["form","contact","accessible","wcag","a11y"],"textdomain":"ananyoo-accessible-forms","editorScript":"ananyoo-aaf-editor","render":"file:.\/render.php","supports":{"html":false,"multiple":true},"attributes":{"formId":{"type":"number","default":0}}}},"tagged_versions":["1.1.1","1.1.2","1.2.0","1.3.0","1.3.1"],"block_files":[],"assets_screenshots":{"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3588766,"resolution":"1","location":"assets","locale":"","width":1280,"height":1257},"screenshot-2.jpg":{"filename":"screenshot-2.jpg","revision":3588766,"resolution":"2","location":"assets","locale":"","width":1280,"height":1580},"screenshot-3.jpg":{"filename":"screenshot-3.jpg","revision":3588766,"resolution":"3","location":"assets","locale":"","width":1274,"height":743},"screenshot-4.jpg":{"filename":"screenshot-4.jpg","revision":3588766,"resolution":"4","location":"assets","locale":"","width":1280,"height":393},"screenshot-5.jpg":{"filename":"screenshot-5.jpg","revision":3588766,"resolution":"5","location":"assets","locale":"","width":1280,"height":558},"screenshot-6.jpg":{"filename":"screenshot-6.jpg","revision":3588766,"resolution":"6","location":"assets","locale":"","width":1280,"height":580},"screenshot-7.jpg":{"filename":"screenshot-7.jpg","revision":3588766,"resolution":"7","location":"assets","locale":"","width":1280,"height":761}},"screenshots":{"1":"The accessible form on the front end: real visible labels, helpful hint text and large, easy-to-tap fields, with each behaviour mapped to its WCAG 2.2 AA success criterion.","2":"Accessible validation: an error summary that takes focus, plus inline messages tied to each field and announced to screen readers, never by colour alone.","3":"The accessible success state after a valid submission: a clear confirmation announced through a polite live region (SC 4.1.3), with focus moved to it so keyboard users are never left guessing.","4":"Every submission is saved as a native WordPress entry. The list shows the sender, subject, form, date and IP, with Quick View, View and Trash actions.","5":"A stored entry opened in the admin: every submitted field and value in a semantic table, with checkbox answers shown as Yes or No and the received time and IP set apart below.","6":"Quick View opens any entry in an accessible modal dialog without leaving the list: focus moves into the dialog, Escape closes it, and focus returns to the link afterwards.","7":"Build a form visually with the Accessible Form block, or drop its shortcode anywhere; both render the identical accessible markup."}},"plugin_section":[],"plugin_tags":[1447,1953,269241,358,1956],"plugin_category":[34],"plugin_contributors":[85416],"plugin_business_model":[],"class_list":["post-331046","plugin","type-plugin","status-publish","hentry","plugin_tags-a11y","plugin_tags-accessibility","plugin_tags-accessible-forms","plugin_tags-contact-form","plugin_tags-wcag","plugin_category-accessibility","plugin_contributors-anblik","plugin_committers-anblik"],"banners":{"banner":"https:\/\/ps.w.org\/ananyoo-accessible-forms\/assets\/banner-772x250.png?rev=3588733","banner_2x":"https:\/\/ps.w.org\/ananyoo-accessible-forms\/assets\/banner-1544x500.png?rev=3588733","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/ananyoo-accessible-forms\/assets\/icon.svg?rev=3588733","icon":"https:\/\/ps.w.org\/ananyoo-accessible-forms\/assets\/icon.svg?rev=3588733","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/ananyoo-accessible-forms\/assets\/screenshot-1.jpg?rev=3588766","caption":"The accessible form on the front end: real visible labels, helpful hint text and large, easy-to-tap fields, with each behaviour mapped to its WCAG 2.2 AA success criterion."},{"src":"https:\/\/ps.w.org\/ananyoo-accessible-forms\/assets\/screenshot-2.jpg?rev=3588766","caption":"Accessible validation: an error summary that takes focus, plus inline messages tied to each field and announced to screen readers, never by colour alone."},{"src":"https:\/\/ps.w.org\/ananyoo-accessible-forms\/assets\/screenshot-3.jpg?rev=3588766","caption":"The accessible success state after a valid submission: a clear confirmation announced through a polite live region (SC 4.1.3), with focus moved to it so keyboard users are never left guessing."},{"src":"https:\/\/ps.w.org\/ananyoo-accessible-forms\/assets\/screenshot-4.jpg?rev=3588766","caption":"Every submission is saved as a native WordPress entry. The list shows the sender, subject, form, date and IP, with Quick View, View and Trash actions."},{"src":"https:\/\/ps.w.org\/ananyoo-accessible-forms\/assets\/screenshot-5.jpg?rev=3588766","caption":"A stored entry opened in the admin: every submitted field and value in a semantic table, with checkbox answers shown as Yes or No and the received time and IP set apart below."},{"src":"https:\/\/ps.w.org\/ananyoo-accessible-forms\/assets\/screenshot-6.jpg?rev=3588766","caption":"Quick View opens any entry in an accessible modal dialog without leaving the list: focus moves into the dialog, Escape closes it, and focus returns to the link afterwards."},{"src":"https:\/\/ps.w.org\/ananyoo-accessible-forms\/assets\/screenshot-7.jpg?rev=3588766","caption":"Build a form visually with the Accessible Form block, or drop its shortcode anywhere; both render the identical accessible markup."}],"raw_content":"<!--section=description-->\n<p><strong>Ananyoo Accessible Forms<\/strong> builds contact and lead forms that conform to <strong>WCAG 2.2 Level AA<\/strong> out of the box. Instead of bolting accessibility on afterwards, every form is generated with correct semantics from the start: a real <code>&lt;label&gt;<\/code> for every control, <code>fieldset<\/code>\/<code>legend<\/code> for grouped inputs, an error summary that takes focus, inline errors tied to their field with <code>aria-describedby<\/code> and <code>aria-invalid<\/code>, and a status region that announces success.<\/p>\n\n<p>Developed by Shivaji Mitra (M\/S. Anblik).<\/p>\n\n<p><strong>Live demo:<\/strong> <a href=\"https:\/\/showcase.ananyoo.com\/accessible-forms\/\">Try the accessible forms demo \u00bb<\/a><\/p>\n\n<h4>Why this plugin?<\/h4>\n\n<p>Most popular form plugins can be made accessible, but they do not start that way \u2014 you have to know exactly which settings to change and which markup to fix. This plugin makes the accessible result the default, so a form added by a non-expert is still usable by keyboard and screen-reader visitors, on the smallest phone, in high-contrast mode.<\/p>\n\n<h4>Key features<\/h4>\n\n<ul>\n<li><strong>Accessible by construction<\/strong> \u2014 label per field, fieldset\/legend for radio and checkbox groups, required state exposed to assistive tech.<\/li>\n<li><strong>Error summary with managed focus<\/strong> \u2014 on a failed submit, an <code>role=\"alert\"<\/code> summary lists each problem as a link to the field, and focus moves to it (WCAG 2.2 SC 3.3.1, 2.4.3).<\/li>\n<li><strong>Values kept on error<\/strong> \u2014 visitors never retype a whole form because one field failed (SC 3.3.7 Redundant Entry).<\/li>\n<li><strong>Accessible anti-spam, no puzzles<\/strong> \u2014 an invisible honeypot plus a submission-time trap stop bots without a CAPTCHA, satisfying SC 3.3.8 Accessible Authentication. Optional Akismet and Cloudflare Turnstile support adds more protection when you want it.<\/li>\n<li><strong>Reusable forms<\/strong> \u2014 each form is stored once and can be placed on many pages by ID.<\/li>\n<li><strong>Stored entries<\/strong> \u2014 every submission is saved so nothing is lost if an email fails. List, search, trash and restore using the native WordPress screens.<\/li>\n<li><strong>Spam quarantine<\/strong> \u2014 suspected spam is moved to a recoverable Spam view, not deleted, so false positives can be restored.<\/li>\n<li><strong>Block and shortcode<\/strong> \u2014 insert the Accessible Form block, or use <code>[ananyoo_form id=\"123\"]<\/code> anywhere, just like a classic contact form.<\/li>\n<li><strong>Any-SMTP delivery<\/strong> \u2014 notifications are sent through <code>wp_mail()<\/code>, so any SMTP plugin you already use handles deliverability.<\/li>\n<li><strong>3 px focus ring, 44 \u00d7 44 targets<\/strong> \u2014 meets WCAG 2.2 SC 2.4.11\/2.4.13 and 2.5.8 by default (both adjustable).<\/li>\n<li><strong>Reflows cleanly at 320 px<\/strong>, <strong>respects prefers-reduced-motion<\/strong>, and supports <strong>Windows High Contrast \/ forced-colors<\/strong>.<\/li>\n<li><strong>Works without JavaScript<\/strong> \u2014 the server validates and re-renders; JavaScript only enhances focus handling and adds an early client-side check.<\/li>\n<li><strong>Clean uninstall option<\/strong> \u2014 off by default (your data is kept). Turn it on to remove every form, entry and setting when the plugin is deleted.<\/li>\n<\/ul>\n\n<h4>Links<\/h4>\n\n<ul>\n<li><a href=\"https:\/\/ananyoo.com\/ananyoo-accessible-forms-plugin\/\">Plugin home &amp; documentation<\/a><\/li>\n<li><a href=\"https:\/\/showcase.ananyoo.com\/accessible-forms\/\">Live demo<\/a><\/li>\n<li><a href=\"https:\/\/ananyoo.com\/wordpress-accessibility-plugins\/\">More accessibility plugins from Ananyoo<\/a> \u2014 further WordPress accessibility plugins are in active development.<\/li>\n<li><a href=\"https:\/\/ananyoo.com\/contact-us\/\">Support &amp; contact<\/a><\/li>\n<\/ul>\n\n<h4>Privacy<\/h4>\n\n<p>This plugin stores the entries you receive in your own WordPress database and sends notification emails through your site's own mail system (the standard <code>wp_mail()<\/code> function). Out of the box it sends your data to no third-party service and adds no tracking or front-end links of its own.<\/p>\n\n<p>Two optional extras change this, and both are your choice:<\/p>\n\n<ul>\n<li><strong>Akismet<\/strong> (off until you switch it on). When enabled, the submitted values, along with the sender's IP address and browser user agent, are sent to Akismet to be checked for spam. This uses the Akismet plugin's own connection and API key, under <a href=\"https:\/\/automattic.com\/privacy\/\">Automattic's privacy policy<\/a>. Please mention this in your own privacy policy before switching it on.<\/li>\n<li><strong>Cloudflare Turnstile<\/strong>. The separate companion plugin you choose handles that request under its own terms.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to the <code>\/wp-content\/plugins\/<\/code> directory, or install it from the Plugins screen.<\/li>\n<li>Activate it. Three ready-to-use example forms are created automatically: an enquiry form (showing every field type), a newsletter sign-up, and a quick feedback form.<\/li>\n<li>Go to <strong>Ananyoo Accessible Forms<\/strong> to edit fields, or create a new form.<\/li>\n<li>Copy the form's shortcode (e.g. <code>[ananyoo_form id=\"123\"]<\/code>) into any page or post, or add the <strong>Accessible Form<\/strong> block and choose your form.<\/li>\n<li>Set the notification email under <strong>Ananyoo Accessible Forms \u2192 Settings<\/strong>. For reliable delivery, use any SMTP plugin.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20a%20captcha%3F\"><h3>Do I need a CAPTCHA?<\/h3><\/dt>\n<dd><p>No. The built-in honeypot and submission-time trap stop most bots without asking visitors to solve a puzzle, which keeps the form accessible. The plugin deliberately does not bundle a CAPTCHA, and never uses image-puzzle CAPTCHAs, which create barriers for many disabled visitors.<\/p>\n\n<p>If your forms attract heavy, targeted spam and you want an extra layer, the most accessible choice is <strong>Cloudflare Turnstile<\/strong> \u2014 in its \"Managed\" \/ interaction-only mode it verifies most visitors invisibly, with no puzzle to solve. Add it with a dedicated Turnstile plugin (for example, \"Simple CAPTCHA Alternative with Cloudflare Turnstile\"). See the next question for connecting it to these forms.<\/p><\/dd>\n<dt id=\"how%20do%20i%20add%20cloudflare%20turnstile%20%28or%20another%20captcha%29%20to%20these%20forms%3F\"><h3>How do I add Cloudflare Turnstile (or another CAPTCHA) to these forms?<\/h3><\/dt>\n<dd><p>The easiest way is automatic. Install the free \"Simple CAPTCHA with Cloudflare Turnstile\" plugin (by RelyWP) and add your Turnstile keys. These forms then detect it and show the Turnstile challenge by themselves \u2014 no code, no shortcode. A failed or missing challenge is reported through the same accessible error summary as any other field, with the visitor's answers kept. You can switch this off under Ananyoo Accessible Forms \u2192 Settings.<\/p>\n\n<p>Importantly, this plugin still loads no third-party script itself; the companion plugin renders and enqueues the Turnstile widget. So this plugin makes no external requests on its own.<\/p>\n\n<p>Prefer a different CAPTCHA, or want full control? Two hooks are also available:<\/p>\n\n<ul>\n<li><code>do_action( 'ananyoo_aaf_before_submit', $form_id, $uid, $errors )<\/code> \u2014 fires just before the submit button, inside the form. Use it to output a verification widget.<\/li>\n<li><code>apply_filters( 'ananyoo_aaf_validation_errors', $errors, $raw, $fields, $form_id )<\/code> \u2014 return a non-empty <code>name =&gt; message<\/code> array to reject a submission. The message then appears in the accessible error summary and beside the form.<\/li>\n<\/ul>\n\n<p>Developers can also disable the built-in Turnstile integration with the <code>ananyoo_aaf_use_turnstile<\/code> filter (return <code>false<\/code>).<\/p><\/dd>\n<dt id=\"how%20do%20i%20add%20akismet%20spam%20filtering%20to%20these%20forms%3F\"><h3>How do I add Akismet spam filtering to these forms?<\/h3><\/dt>\n<dd><p>Install the Akismet plugin, add your API key under Settings \u2192 Akismet Anti-spam, then tick \"Add Akismet spam filtering when the Akismet plugin is active\" under Accessible Forms \u2192 Settings. It stays off until you tick it.<\/p>\n\n<p>Akismet adds nothing to the form itself, so there is no puzzle and nothing changes for keyboard or screen-reader users. A submission Akismet thinks is spam is saved quietly under Entries with the Spam status \u2014 the visitor is never blocked and never shown an error. This is deliberate: if Akismet guesses wrong, a real person still gets through, and you simply find their message in the Spam view. If Akismet cannot be reached, the entry is saved as normal.<\/p>\n\n<p>Please note that when this is on, the submitted values are sent to Akismet, an outside service, to be checked. Please make sure your privacy policy says so.<\/p>\n\n<p>Developers can disable the integration with the <code>ananyoo_aaf_use_akismet<\/code> filter (return <code>false<\/code>), or adjust what is sent with the <code>ananyoo_aaf_akismet_request<\/code> filter.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20make%20external%20requests%20or%20track%20anything%3F\"><h3>Does the plugin make external requests or track anything?<\/h3><\/dt>\n<dd><p>No. By itself the plugin makes no external\/HTTP requests and includes no analytics or tracking. Two optional extras are the exception, and only if you switch them on: the Akismet check sends the submission to Akismet for a verdict (through the Akismet plugin's own connection and key), and a third-party CAPTCHA plugin such as Cloudflare Turnstile handles its own requests. Both are covered by their own privacy terms.<\/p><\/dd>\n<dt id=\"are%20submissions%20stored%20if%20the%20email%20fails%3F\"><h3>Are submissions stored if the email fails?<\/h3><\/dt>\n<dd><p>Yes. Every valid submission is saved as an entry before the email is sent, so a mail problem never loses a message.<\/p><\/dd>\n<dt id=\"will%20deleting%20the%20plugin%20remove%20my%20data%3F\"><h3>Will deleting the plugin remove my data?<\/h3><\/dt>\n<dd><p>Only if you choose to. The clean-uninstall option is off by default, so your forms and entries are kept. Enable it under Settings if you want everything removed on delete.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.3.1<\/h4>\n\n<ul>\n<li>Fixed: the \"Settings\" link on the Plugins screen showed \"Cannot load ananyoo-accessible-forms.\" It still pointed at the old settings address from before the 1.2.0 menu change. It now opens the Settings page correctly. Sorry about that.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>New: optional Akismet spam filtering. Switch it on under Accessible Forms \u2192 Settings when the Akismet plugin is active and holds an API key. It is off until you switch it on.<\/li>\n<li>Suspected spam is kept quietly under Entries with the Spam status, so a wrong guess never blocks a real visitor or shows them an error. If Akismet cannot be reached, the entry is saved as normal.<\/li>\n<li>Akismet adds nothing to the form, so there is no puzzle and nothing changes for keyboard or screen-reader users.<\/li>\n<li>Note: when this is on, the submitted values are sent to Akismet, an outside service. Please mention this in your privacy policy. The readme Privacy section explains what is sent.<\/li>\n<li>New filters for developers: <code>ananyoo_aaf_use_akismet<\/code> and <code>ananyoo_aaf_akismet_request<\/code>.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>New: the \"Accessible Forms\" menu now opens on a branded Dashboard (the former Getting Started screen) with the blue header, logo, quick start, WCAG conformance statement and version details. All Forms, Add New Form, Entries and Settings sit neatly below it.<\/li>\n<li>The Settings screen now carries the same branded header for a consistent look.<\/li>\n<li>No changes to your forms, entries, stored data or the front end.<\/li>\n<\/ul>\n\n<h4>1.1.2<\/h4>\n\n<ul>\n<li>Shortened the admin sidebar menu label to \"Accessible Forms\" for a cleaner menu, consistent with the other Ananyoo accessibility plugins. The directory name is unchanged.<\/li>\n<li>Readme: linked the live demo and added Links and Privacy sections. No functional changes.<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Coding-standards: unified all custom identifiers under the distinct \"ananyoo_aaf\" prefix. The two custom post types, the spam post status, the entry-manager capability, the Quick View admin-ajax action and its nonce, and all post-meta keys now use the full prefix, avoiding any short or inconsistent names that could collide with other plugins.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Renamed the plugin to \"Ananyoo Accessible Forms \u2013 Contact Form &amp; Entry Storage\" so the name leads with the Ananyoo brand and is distinctive (slug: ananyoo-accessible-forms).<\/li>\n<li>Coding-standards: the \"Add New\" rule on the Entries screen is now served from the enqueued admin stylesheet instead of an inline style block.<\/li>\n<li>Hardening: POST data passed to the ananyoo_aaf_validation_errors filter is now sanitised before any third-party callback receives it.<\/li>\n<li>Hardening: the sender name shown in the Entries list (via the the_title filter) is now escaped at the source.<\/li>\n<\/ul>\n\n<h4>1.0.9<\/h4>\n\n<ul>\n<li>Notification email subject is now \"Form Name: Subject\" \u2014 the form's title followed by the value of the submission's subject field (for example, \"Enquiry Form: General enquiry\"), replacing the old \"[Site] New form entry: \u2026\" line. When a form has no subject field, or it is left blank, the subject is just the form name.<\/li>\n<li>The three sample forms created on a fresh install are now titled in Title Case \u2014 \"Enquiry Form\" (previously \"Enquiry form \u2014 every field type\"), \"Newsletter Sign-up\" and \"Quick Feedback\". Existing forms are unaffected.<\/li>\n<li>No accessibility, settings or visual changes.<\/li>\n<\/ul>\n\n<h4>1.0.8<\/h4>\n\n<ul>\n<li>Accessibility (WCAG 3.3.1 \/ 2.4.3): on a failed submission, keyboard focus now moves to the FIRST field with an error \u2014 never to the error summary \u2014 so the screen reader announces that field's own message (via aria-invalid + aria-describedby) and the visitor lands exactly where they can fix it. On a form with many fields, this avoids making the user step past a long list of errors before reaching the first one. Applies to both the client-side check and the server-rendered result after a no-JavaScript submit.<\/li>\n<li>The error summary at the top is now a plain, visible overview with jump-links to each field, rather than an assertive alert that takes focus. It still appears only after a failed submission, lists every error, and updates live as fields are corrected \u2014 it just no longer competes with, or delays, the announcement of the field that focus lands on.<\/li>\n<li>No settings or visual-design changes.<\/li>\n<\/ul>\n\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>Accessibility: error-summary links now move keyboard focus to the matching field on every path. The server-rendered summary previously only scrolled (focus moved only on the JS-built summary); a single delegated handler now covers both, and grouped radio\/checkbox fields focus their first option.<\/li>\n<li>Accessibility: the group <\/li>\n<\/ul>\n\n<p>&lt;<\/p>\n\n<p>fieldset&gt; now carries the field id, so the summary link for a radio\/checkbox group resolves correctly (it pointed at a non-existent target before).\n* Accessibility: correcting a field now updates the error summary live \u2014 the fixed field's line is removed from the summary (and the summary disappears once all errors are resolved), matching the inline message that already cleared.\n* No settings, markup-structure or visual changes beyond the fieldset id.<\/p>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Getting Started screen: added a \"Managing your entries\" section covering the entries list columns, the Quick View \/ View \/ Trash actions, and the Yes\/No display, so the in-plugin help reflects the current features.<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Single checkbox \/ consent values now display as \"Yes\" (or \"No\") instead of \"1\" in the entry view, the Quick View popup and the email notification, so they read clearly.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>The Sender column now shows the submitter's name computed from the submission data, so existing entries read cleanly too (not only newly titled ones).<\/li>\n<li>New: a \"Quick View\" row action opens the entry in an accessible modal dialog without leaving the list. Focus moves into the dialog, Escape closes it, focus is trapped while open and returned to the link afterwards, and it falls back to the full View page when JavaScript is unavailable.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Entries list improved: the read-only Edit and Quick Edit row actions are replaced by a clear View action (Trash is kept); the first column now shows the Sender name and links to the entry; and new Subject and IP columns are added, with the form name kept in its own column.<\/li>\n<li>New submissions are now titled by the sender's name rather than \"Form name \u2014 value\", so the entries list reads more cleanly.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Improved: in the single-entry admin view, the \"Received ... from IP ...\" submission metadata is now shown as a centred band, set apart from the field\/value table with space above and below, so it reads clearly as information about the submission rather than a submitted value. (The entry-view styles now load on the entry screen too.)<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fixed: the URL\/website field rejected valid web addresses. Validation now checks the address format instead of performing a live host lookup, so addresses such as https:\/\/www.example.com are accepted.<\/li>\n<li>Fixed: required and format error messages no longer show a stray full stop when a field label is written as a sentence (for example a consent line), so the wording reads cleanly.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Accessible forms built to WCAG 2.2 AA by construction: a real label per field, fieldset\/legend for radio and checkbox groups, and the required state exposed to assistive technology.<\/li>\n<li>Error handling with managed focus: a <code>role=\"alert\"<\/code> summary that links to each field, plus an inline message under every invalid field tied to it with <code>aria-describedby<\/code> and <code>aria-invalid<\/code>. Focus moves to the single field when there is one error, or to the summary when there are several.<\/li>\n<li>Specific, action-led messages, including format suggestions for email, web address and number fields (WCAG 2.2 SC 3.3.3).<\/li>\n<li>On-blur checking that validates a field once the visitor has used it and clears the message live as it is fixed; the form still validates fully on submit and on the server, and works with JavaScript disabled.<\/li>\n<li>Values kept on error (SC 3.3.7), a 3 px focus ring and 44 x 44 targets by default (both adjustable), clean reflow at 320 px, and reduced-motion and forced-colors support.<\/li>\n<li>Accessible anti-spam with no puzzles: an invisible honeypot and a submission-time trap, plus a recoverable spam quarantine. Optional, automatic Cloudflare Turnstile when the free \"Simple CAPTCHA with Cloudflare Turnstile\" plugin is active (this plugin loads no third-party script itself); hooks (<code>ananyoo_aaf_before_submit<\/code>, <code>ananyoo_aaf_validation_errors<\/code>) allow any other CAPTCHA.<\/li>\n<li>Reusable forms placed by ID via the Accessible Form block or the <code>[ananyoo_form id=\"123\"]<\/code> shortcode; submissions stored as entries; notifications through <code>wp_mail()<\/code> for any-SMTP delivery; and an optional clean uninstall.<\/li>\n<li>Three ready-to-use example forms created on activation: an enquiry form (every field type), a newsletter sign-up, and a quick feedback form.<\/li>\n<\/ul>","raw_excerpt":"Accessible, WCAG 2.2 AA contact forms: labelled fields, focus-managed error summary, accessible anti-spam and stored entries.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/es-ec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/331046","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/es-ec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/es-ec.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/es-ec.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=331046"}],"author":[{"embeddable":true,"href":"https:\/\/es-ec.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/anblik"}],"wp:attachment":[{"href":"https:\/\/es-ec.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=331046"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/es-ec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=331046"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/es-ec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=331046"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/es-ec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=331046"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/es-ec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=331046"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/es-ec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=331046"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}