{"id":367381,"date":"2026-09-22T06:03:18","date_gmt":"2026-09-22T06:03:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/oorly-accessibility-widget\/"},"modified":"2026-09-22T06:02:50","modified_gmt":"2026-09-22T06:02:50","slug":"oorly","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/oorly\/","author":23564306,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.0.0","stable_tag":"trunk","tested":"7.1.2","requires":"6.3","requires_php":"7.4","requires_plugins":null,"header_name":"Oorly Accessibility Widget","header_author":"seyfettinkahveci","header_description":"Adds the Oorly accessibility widget to the front end of your site, using the site code entered on the settings page.","assets_banners_color":"2c3b58","last_updated":"2026-09-22 06:02:50","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/oorly.com","header_author_uri":"https:\/\/drupart.com.tr","rating":0,"author_block_rating":0,"active_installs":0,"downloads":35,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"seyfettinkahveci","date":"2026-09-22 06:02:50","revision":3706654}},"upgrade_notice":{"2.0.0":"<p>The plugin folder and its stored option are renamed, and WordPress 6.3 is now the minimum. Enter your site code again at Settings &gt; Oorly after upgrading, and delete the old <code>oorly_integration<\/code> folder if it is still present.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3706654,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3706654,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3706654,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500-de.png":{"filename":"banner-1544x500-de.png","revision":3706654,"resolution":"1544x500","location":"assets","locale":"de","width":1544,"height":500},"banner-1544x500-tr.png":{"filename":"banner-1544x500-tr.png","revision":3706654,"resolution":"1544x500","location":"assets","locale":"tr","width":1544,"height":500},"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3706654,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250-de.png":{"filename":"banner-772x250-de.png","revision":3706654,"resolution":"772x250","location":"assets","locale":"de","width":772,"height":250},"banner-772x250-tr.png":{"filename":"banner-772x250-tr.png","revision":3706654,"resolution":"772x250","location":"assets","locale":"tr","width":772,"height":250},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3706654,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Settings &gt; Oorly \u2014 the site code field, with the link to the Oorly dashboard.","2":"The saved script tag, shown back to you exactly as it is printed into the header.","3":"The widget as visitors see it on the front end."}},"plugin_section":[],"plugin_tags":[1447,1953,23713,1956,162],"plugin_category":[34,43],"plugin_contributors":[281957],"plugin_business_model":[],"class_list":["post-367381","plugin","type-plugin","status-publish","hentry","plugin_tags-a11y","plugin_tags-accessibility","plugin_tags-contrast","plugin_tags-wcag","plugin_tags-widget","plugin_category-accessibility","plugin_category-customization","plugin_contributors-seyfettinkahveci","plugin_committers-seyfettinkahveci"],"banners":{"banner":"https:\/\/ps.w.org\/oorly\/assets\/banner-772x250.png?rev=3706654","banner_2x":"https:\/\/ps.w.org\/oorly\/assets\/banner-1544x500.png?rev=3706654","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/oorly\/assets\/icon.svg?rev=3706654","icon":"https:\/\/ps.w.org\/oorly\/assets\/icon.svg?rev=3706654","icon_2x":false,"generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>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.<\/p>\n\n<p>The <strong>widget<\/strong> gives visitors seventeen controls they switch on for themselves \u2014 text size, spacing, contrast, reading guide, read aloud and more. The <strong>report<\/strong> crawls your site on a schedule and hands your developers the exact CSS selector for every WCAG failure it finds.<\/p>\n\n<p>This plugin puts the widget on your WordPress site. Install it, paste your site code, done. No theme changes, no <code>header.php<\/code> override, no build step.<\/p>\n\n<p>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 \u2014 the report is the part that gets a site fixed.<\/p>\n\n<h4>What this plugin does<\/h4>\n\n<p>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:<\/p>\n\n<pre><code>&lt;script src=\"https:\/\/widget.oorly.com\/widget.js?c=SITE_CODE\" id=\"oorly-widget-js\" defer&gt;&lt;\/script&gt;\n<\/code><\/pre>\n\n<p>The script is registered with <code>wp_enqueue_script()<\/code> on the <code>wp_enqueue_scripts<\/code> hook, with <code>in_footer<\/code> false so it lands in <code>&lt;head&gt;<\/code>, and the <code>defer<\/code> 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 <code>oorly-widget<\/code> handle.<\/p>\n\n<p>No <code>ver<\/code> 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.<\/p>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li>WordPress 6.3 or later, PHP 7.4 or later<\/li>\n<li>An Oorly account and site code \u2014 free tier, no card, does not expire: https:\/\/oorly.com<\/li>\n<li><code>widget.oorly.com<\/code> allowed in your CSP, if you send one<\/li>\n<li>A publicly reachable site, if you want the report as well<\/li>\n<\/ul>\n\n<p>No libraries, no dependencies, no database tables.<\/p>\n\n<h4>Validation and security<\/h4>\n\n<p>The value entered on the settings page is reduced to the <code>[A-Za-z0-9_-]<\/code> 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 <code>&lt;head&gt;<\/code>. The URL is assembled with <code>add_query_arg()<\/code> and passed through <code>esc_url()<\/code> before printing.<\/p>\n\n<p>Viewing and saving the settings page requires the <code>manage_options<\/code> capability. The form runs through the WordPress Settings API, so nonce verification and option allowlisting are handled as standard.<\/p>\n\n<h4>External services<\/h4>\n\n<p>This plugin loads a script from Oorly, a third-party service operated by Drupart.<\/p>\n\n<p>The script <code>https:\/\/widget.oorly.com\/widget.js<\/code> is requested by the visitor's browser on every front-end page once a site code is saved, with that code as the <code>c<\/code> query parameter. The request tells Oorly the visitor's IP address, user agent and the page they are on \u2014 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.<\/p>\n\n<p>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.<\/p>\n\n<ul>\n<li>Site: https:\/\/oorly.com<\/li>\n<li>Terms: https:\/\/oorly.com\/terms-of-service<\/li>\n<li>Privacy: https:\/\/oorly.com\/privacy-policy<\/li>\n<\/ul>\n\n<h4>Interface languages<\/h4>\n\n<p>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 &gt; Profile.<\/p>\n\n<h4>Additional information<\/h4>\n\n<p>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.<\/p>\n\n<p>The script is enqueued under the handle <code>oorly-widget<\/code>, so it can be taken off selected pages without deactivating anything:<\/p>\n\n<pre><code>add_action( 'wp_enqueue_scripts', function () { if ( is_page( 'checkout' ) ) { wp_dequeue_script( 'oorly-widget' ); } }, 20 );\n<\/code><\/pre>\n\n<p>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 \u2014 but each site needs its code entered once.<\/p>\n\n<p>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.<\/p>\n\n<p>The widget script is served from Oorly's servers. This plugin neither hosts it nor alters its contents \u2014 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.<\/p>\n\n<p>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.<\/p>\n\n<p>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.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>oorly<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install the plugin from the Plugins screen.<\/li>\n<li>Activate <strong>Oorly Accessibility Widget<\/strong>.<\/li>\n<li>Create a free account at https:\/\/oorly.com and add your domain.<\/li>\n<li>Copy the code from the <strong>Implementation<\/strong> tab.<\/li>\n<li>Paste it at <strong>Settings &gt; Oorly<\/strong> and save.<\/li>\n<\/ol>\n\n<p>That is the whole plugin \u2014 one settings form.<\/p>\n\n<p>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 <code>widget.oorly.com<\/code>.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20have%20to%20touch%20my%20theme%3F\"><h3>Do I have to touch my theme?<\/h3><\/dt>\n<dd><p>No. The script is enqueued on <code>wp_enqueue_scripts<\/code> and printed by <code>wp_head<\/code>, which every properly built theme calls. There is no <code>header.php<\/code> to edit and nothing to re-apply after a theme update.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20leave%20the%20code%20field%20empty%3F\"><h3>What happens if I leave the code field empty?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"does%20the%20script%20load%20in%20the%20admin%20area%20as%20well%3F\"><h3>Does the script load in the admin area as well?<\/h3><\/dt>\n<dd><p>No. The script is enqueued on <code>wp_enqueue_scripts<\/code>, which runs on the front end only.<\/p><\/dd>\n<dt id=\"can%20i%20configure%20more%20than%20one%20site%20code%3F\"><h3>Can I configure more than one site code?<\/h3><\/dt>\n<dd><p>No. The plugin stores a single code and uses it site-wide.<\/p><\/dd>\n<dt id=\"my%20code%20contains%20dots%20or%20colons%2C%20why%20are%20they%20removed%3F\"><h3>My code contains dots or colons, why are they removed?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"is%20the%20setting%20left%20in%20the%20database%20when%20i%20delete%20the%20plugin%3F\"><h3>Is the setting left in the database when I delete the plugin?<\/h3><\/dt>\n<dd><p>No. <code>uninstall.php<\/code> deletes the <code>oorly_site_code<\/code> option. Deactivating the plugin keeps the setting; deleting it clears it.<\/p><\/dd>\n<dt id=\"i%20changed%20the%20code%20but%20the%20old%20one%20is%20still%20in%20the%20page%20source\"><h3>I changed the code but the old one is still in the page source<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"does%20the%20widget%20make%20my%20site%20accessible%3F\"><h3>Does the widget make my site accessible?<\/h3><\/dt>\n<dd><p>No, and no widget does. It changes how a page is presented, not what it is made of \u2014 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.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Renamed from \"Oorly Integration\" to <strong>Oorly Accessibility Widget<\/strong>; the directory, main file and text domain are now <code>oorly<\/code>.<\/li>\n<li>The widget is enqueued with <code>wp_enqueue_script()<\/code> and the <code>defer<\/code> loading strategy instead of being printed by hand on <code>wp_head<\/code>. Other plugins can now dequeue it by the <code>oorly-widget<\/code> handle.<\/li>\n<li>Minimum WordPress version raised to 6.3, which is where the <code>defer<\/code> loading strategy arrived.<\/li>\n<li>All functions and constants use the <code>oorly_<\/code> prefix.<\/li>\n<li>The stored option moved from <code>oorly_integration_client_code<\/code> to <code>oorly_site_code<\/code>.<\/li>\n<li>Dropped the <code>load_plugin_textdomain()<\/code> call; WordPress loads the bundled translations on its own.<\/li>\n<li>The plugin name is no longer a translatable string \u2014 \"Oorly\" is spelled the same in every language.<\/li>\n<li>readme rewritten: what the widget does and does not do, and a full disclosure of the external service.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Menu entry and page title made translatable.<\/li>\n<li>Explanation of what Oorly does, and a \"Get your site code\" link to the dashboard, added to the settings page.<\/li>\n<li>Interface translated into Turkish (tr_TR) and German (de_DE).<\/li>\n<li>Field label renamed from \"Client code\" to \"Site code\".<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Site code field under Settings.<\/li>\n<li>Widget script added via <code>wp_head<\/code> with the <code>defer<\/code> attribute.<\/li>\n<li>Input sanitization and a live preview of the saved tag.<\/li>\n<li>Setting removed from the database when the plugin is deleted.<\/li>\n<\/ul>","raw_excerpt":"Adds the Oorly accessibility widget to your site. Paste your site code; visitors get controls to adapt the page to how they read.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/367381","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=367381"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/seyfettinkahveci"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=367381"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=367381"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=367381"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=367381"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=367381"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=367381"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}