Description
Oorly adds an accessibility widget to your WordPress site and scans your pages against WCAG. Visitors adapt the page to how they read; your team gets a list of what to fix in the code.
The widget gives visitors seventeen controls they switch on for themselves — text size, spacing, contrast, reading guide, read aloud and more. The report crawls your site on a schedule and hands your developers the exact CSS selector for every WCAG failure it finds.
This plugin puts the widget on your WordPress site. Install it, paste your site code, done. No theme changes, no header.php override, no build step.
A widget changes how a page is presented, not what it is made of. It cannot write your alt text or label your form fields. If you believe a widget alone makes a site accessible, please do not install this one — the report is the part that gets a site fixed.
What this plugin does
One settings form and one script tag. The site code you save is stored as a WordPress option, so it survives a theme switch, and what reaches the browser is:
<script src="https://widget.oorly.com/widget.js?c=SITE_CODE" id="oorly-widget-js" defer></script>
The script is registered with wp_enqueue_script() on the wp_enqueue_scripts hook, with in_footer false so it lands in <head>, and the defer loading strategy so the browser keeps parsing the document while the file downloads. Nothing is printed by hand, so the tag is subject to the same filters as any other enqueued script and other plugins can dequeue it by its oorly-widget handle.
No ver query argument is added. The file is versioned by Oorly on their own CDN, and appending this plugin’s version would only cache-bust an asset that is not ours.
Requirements
- WordPress 6.3 or later, PHP 7.4 or later
- An Oorly account and site code — free tier, no card, does not expire: https://oorly.com
widget.oorly.comallowed in your CSP, if you send one- A publicly reachable site, if you want the report as well
No libraries, no dependencies, no database tables.
Validation and security
The value entered on the settings page is reduced to the [A-Za-z0-9_-] character set before it is stored; if anything was stripped, a warning appears after saving. A malformed or deliberately crafted value pasted into the field therefore cannot inject HTML into <head>. The URL is assembled with add_query_arg() and passed through esc_url() before printing.
Viewing and saving the settings page requires the manage_options capability. The form runs through the WordPress Settings API, so nonce verification and option allowlisting are handled as standard.
External services
This plugin loads a script from Oorly, a third-party service operated by Drupart.
The script https://widget.oorly.com/widget.js is requested by the visitor’s browser on every front-end page once a site code is saved, with that code as the c query parameter. The request tells Oorly the visitor’s IP address, user agent and the page they are on — the same information any browser sends when fetching a file. The plugin itself sends nothing: it neither hosts the script nor alters its contents, and it makes no server-side calls to Oorly.
What the widget does once it runs, and what it stores, is governed on Oorly’s side and keyed to the site code. Clearing the site code and saving stops the script from being added at all.
- Site: https://oorly.com
- Terms: https://oorly.com/terms-of-service
- Privacy: https://oorly.com/privacy-policy
Interface languages
The plugin is fully translatable. Translations are managed by the community on translate.wordpress.org and delivered through the standard WordPress update system; WordPress picks the language from the site setting, or from the per-user language under Users > Profile.
Additional information
There is one option row and nothing else. The plugin creates no database tables, schedules no cron events, registers no REST routes, and prints no admin notices or dashboard widgets. Deactivating it takes the script off your pages and leaves the saved code alone; deleting it clears the code as well.
The script is enqueued under the handle oorly-widget, so it can be taken off selected pages without deactivating anything:
add_action( 'wp_enqueue_scripts', function () { if ( is_page( 'checkout' ) ) { wp_dequeue_script( 'oorly-widget' ); } }, 20 );
On multisite the setting belongs to the site, not the network. Every site stores its own code and can be switched off on its own, so network activation is safe — but each site needs its code entered once.
This plugin is the widget half of Oorly. The report needs no plugin at all: it crawls your site from the outside, so it runs whether or not this is installed. If you only want the report, you do not need this.
The widget script is served from Oorly’s servers. This plugin neither hosts it nor alters its contents — what the widget does once it runs is governed on Oorly’s side and keyed to your site code. Clearing the field stops the script from being requested at all.
Nothing here is minified, compiled or generated. The plugin is one readable PHP file and its translations, so what you install is what was written.
Questions and bug reports belong in the support forum for this plugin. Anything about your Oorly account, your site code or the report belongs at https://oorly.com.
Installation
- Upload the
oorlyfolder to/wp-content/plugins/, or install the plugin from the Plugins screen. - Activate Oorly Accessibility Widget.
- Create a free account at https://oorly.com and add your domain.
- Copy the code from the Implementation tab.
- Paste it at Settings > Oorly and save.
That is the whole plugin — one settings form.
After saving, the same page shows the script tag being printed into the header. You can also confirm it from the front end: view the page source and search for widget.oorly.com.
FAQ
-
Do I have to touch my theme?
-
No. The script is enqueued on
wp_enqueue_scriptsand printed bywp_head, which every properly built theme calls. There is noheader.phpto edit and nothing to re-apply after a theme update. -
What happens if I leave the code field empty?
-
No script is added. To switch the widget off temporarily you do not need to deactivate the plugin; clearing the field and saving is enough.
-
Does the script load in the admin area as well?
-
No. The script is enqueued on
wp_enqueue_scripts, which runs on the front end only. -
Can I configure more than one site code?
-
No. The plugin stores a single code and uses it site-wide.
-
My code contains dots or colons, why are they removed?
-
Validation accepts only letters, digits, hyphens and underscores. If your code contains anything else, first check that you copied it correctly; if the problem persists, contact us and the validation set will be widened.
-
Is the setting left in the database when I delete the plugin?
-
No.
uninstall.phpdeletes theoorly_site_codeoption. Deactivating the plugin keeps the setting; deleting it clears it. -
I changed the code but the old one is still in the page source
-
Clear your full-page cache (Varnish, LiteSpeed, WP Rocket and the like). The tag is generated server-side, so cached HTML keeps serving the old code until the cache is purged.
-
Does the widget make my site accessible?
-
No, and no widget does. It changes how a page is presented, not what it is made of — it cannot write your alt text or label your form fields. Use the report to fix the markup; the widget is what your visitors get in the meantime.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“Oorly Accessibility Widget” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “Oorly Accessibility Widget” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
2.0.0
- Renamed from “Oorly Integration” to Oorly Accessibility Widget; the directory, main file and text domain are now
oorly. - The widget is enqueued with
wp_enqueue_script()and thedeferloading strategy instead of being printed by hand onwp_head. Other plugins can now dequeue it by theoorly-widgethandle. - Minimum WordPress version raised to 6.3, which is where the
deferloading strategy arrived. - All functions and constants use the
oorly_prefix. - The stored option moved from
oorly_integration_client_codetooorly_site_code. - Dropped the
load_plugin_textdomain()call; WordPress loads the bundled translations on its own. - The plugin name is no longer a translatable string — “Oorly” is spelled the same in every language.
- readme rewritten: what the widget does and does not do, and a full disclosure of the external service.
1.1.0
- Menu entry and page title made translatable.
- Explanation of what Oorly does, and a “Get your site code” link to the dashboard, added to the settings page.
- Interface translated into Turkish (tr_TR) and German (de_DE).
- Field label renamed from “Client code” to “Site code”.
1.0.0
- Initial release.
- Site code field under Settings.
- Widget script added via
wp_headwith thedeferattribute. - Input sanitization and a live preview of the saved tag.
- Setting removed from the database when the plugin is deleted.
