=== Perfmatters ===
Contributors:
Donate link: https://perfmatters.io
Tags: perfmatters
Requires at least: 5.5
Requires PHP: 8.1
Tested up to: 7.0.1
Stable tag: 2.6.6
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Perfmatters is a lightweight performance plugin developed to speed up your WordPress site.

== Description ==

[Perfmatters](https://perfmatters.io/) is a lightweight web performance plugin designed to help increase Google Core Web Vitals scores and fine-tune how assets load on your site.

= Features =

* Easy quick toggle options to turn off resources that shouldn't be loading. 
* Disable scripts and plugins on a per post/page or sitewide basis with the Script Manager.
* Add and optimize code snippets (PHP, CSS, JS, and HTML), only load where needed.
* Defer and delay JavaScript, including third-party scripts.
* Automatically remove unused CSS.
* Minify JavaScript and CSS.
* Preload resources, critical images, and prerender links for quicker load times.
* Lazy load images and enable click-to-play thumbnails on videos.
* Host Google Analytics and Google Fonts locally.
* Change your WordPress login URL. 
* Disable and limit WordPress revisions.
* Add code to your header, body, and footer.
* Optimize your database.

= Documentation =

Check out our [documentation](https://perfmatters.io/docs/) for more information on how to use Perfmatters.

== Changelog ==

= 2.6.6 - 07.09.2026 =
* Improved code snippet docblock parsing to use UTF-8 aware regex when reading snippet metadata.
* Improved reliability of snippet metadata parsing across different server environments.
* Fixed an issue with multiline code snippet descriptions not saving properly. 
* Fixed an issue where the database optimization process button spinner was getting stuck without reloading the page.
* Translation updates.

= 2.6.5 - 06.30.2026 =
* Added new perfmatters_rucss_delay_stylesheets filter which allows you to delay a specific stylesheet already excluded from used CSS.
* Added new load behavior option to delay CSS code snippets using the file print method.
* Added new code snippet URL-based conditions for path contains, path equals and path regex.
* Added additional support to code snippet search to allow the search value to match on the code input itself.
* Added default sort order controls to code snippet screen options.
* Made a change to allow an image tag with a missing src attribute to still be able to lazy load if it has a valid srcset attribute.
* Adjusted main code menu behavior to return to return to the base code view if selected while viewing a single code snippet.
* Fixed utility attribute encoding so certain characters are preserved instead of being converted to HTML entities.
* Fixed a possible JavaScript conflict with minimal analytics declaring variables in the global scope. The script is now wrapped in an IIFE for compatibility.
* Security update to improve escaping of Code Snippets list table admin links built from the current request URL.
* Security updates to add domain verification and content type validation to local Google fonts feature when downloading remote files.
* Translation updates.

= 2.6.4 - 06.01.2026 =
* Security updates to improve PMCS admin output sanitization and query handling across snippet editor and list views.
* Translation updates.

= 2.6.3 - 05.27.2026 =
* Added new Shortcode option when choosing a location for HTML code snippets.
* Added new code option to select the Editor Theme along with the ability to upload a custom CodeMirror 5 theme stylesheet.
* Added base64 encoding to exported code snippets to prevent import requests from being blocked by certain firewalls. Previously exported code snippet JSON files can still be imported.
* Added new Location helper class to store shared logic to parse and match string based location input fields throughout the plugin.
* Added the ability to use the 'front' keyword in location input fields to always match the front page of the site.
* Added additional lazy loading compatibility styles specifically for iframes placed inside Elementor text and HTML elements.
* Adjusted Script Manager Global View rows to always display multiple post IDs in ascending order.
* Multiple styling adjustments and fixes throughout the plugin UI.
* Made some changes to how certain UI elements trigger a forced reload in response to specific actions to make things less jarring.
* Fixed an issue where our compatibility styles for a lazy loaded video inside a responsive embed could break the layout if the core block library stylesheet was disabled. 
* Fixed an issue where code type selection for individual code snippets was still visible even after saving.
* Fixed an issue where the next page buttons in the snippets table was still showing as active even when viewing the last page.
* Fixed an issue where stylesheets with protocol-relative URLs were not getting parsed for used CSS.
* Disabled lint markers for HTML code snippets, as they do not currently work for combined HTML and inline PHP code.
* Removed unnecessary instances of perfmatters-lazy-youtube class from lazy loading inline styles. All lazy loading video features are now using a shared perfmatters-lazy-video class.
* Removed unnecessary development directories from plugin files.
* Translation updates.

= 2.6.2 - 04.29.2026 =
* Added support to automatically optimize and lazy load Elementor Atomic YouTube elements and legacy video widgets when Perfmatters iframe lazy loading is turned on. YouTube preview thumbnails are also supported, as well as Elementor image overlays if set for the video.
* Added request-level caching to excluded and forced lazy loading attribute arrays to prevent unnecessary calls.
* Added multiple stripos and str_contains (PHP 8) checks in lazy loading image and iframe functions to prevent expensive regex scans if tags don't exist on the page.
* Added new should_skip_request method in core LazyLoad class with request-level caching to prevent duplicate checks for WooCommerce pages and post-specific meta options.
* Added support to various General class functions to respect ?perfmattersoff.
* Added filters back to turn off WordPress' lazy loading and auto sizing styles when Perfmatters lazy loading is turned on.
* Added built-in JS and CSS exclusions for Woocommerce's dynamically added woocommerce-js body class.
* Refactored LazyLoad class into multiple subclasses for better maintainability.
* Removed duplicate list normalization step before replacement across LazyLoad classes to reduce loop overhead.
* Renamed previous Images class to ImageDimensions to make room for new Images lazy loading subclass.
* Fixed an issue where certain lazy loaded tags were getting replaced globally in the document instead of only at the specific tag match instance.
* Translation updates.

= 2.6.1 - 04.10.2026 =
* Made additional plugin UI styles adjustments in preparation for WordPress 7.
* Made some adjustments to our code snippets error handler initialization logic to avoid unnecessary handling if no relevant code snippets are active.
* Updated our exception_handler method with more specific error logging when our handler is dealing with an error outside of our code snippets.
* Updated Disable RSS Feeds tooltip text to reflect the recent header changes in the previous update.
* Fixed an error that would occur when UTF-8 stylesheets with specific multibyte characters were parsed for used CSS.
* Fixed multiple incorrect form label IDs that showed up when creating a new code snippet.
* Fixed an issue with Disable Self Pingbacks functionality that was introduced after the functions.php refactor.
* Fixed an issue where a JS or CSS file preloaded dynamically by handle would not serve the minified version of the file in certain cases.
* Fixed an issue where the inline stylesheet fallback was not always converting relative URLs correctly if certain characters were present in the string.
* Translation updates.

= 2.6.0 - 03.25.2026 =
* Increased minimum required PHP version to 8.1 to allow for library updates and support for future codebase performance improvements.
* Added new perfmatters_rucss_logged_in filter.
* Added PHP Scoper to our plugin development workflow to be able to silo specific third-party libraries to prevent conflicts with other plugins.
* Updated PHP CSS Parser library to 9.3.0.
* Added additional logic to used CSS generation to better deal with layer elements that are declared without a content block.
* Removed built-in stylesheet exclusion for Bricks' layer files. We recommend clearing used CSS after updating.
* Added new CSS helper method to rewrite relative URLs in stylesheets that will be printed inline using regex only to prevent having to pass them through the parser.
* Updated code snippets author column to use the user's display name instead of nice name to match the single snippet layout.
* Updated disable RSS feeds function to return a 410 header instead of a 301 when requesting a feed URL.
* Made some adjustments to clean_html regex pattern to avoid potential backtracking which could end up hitting a PCRE limit in some cases.
* Made plugin UI styles adjustments in preparation for WordPress 7.
* Made improvements to visual transitions during hard reloads in the plugin UI.
* Made some changes to plugin UI nav JS to improve compatibility when wrapper elements are added in the HTML from another source.
* Fixed an issue that was causing certain attribute values to conflict with the HTML parent selector matching regex.
* Fixed an issue where specific WooCommerce product types were not getting the built-in product exclusion selector added to generated used CSS.
* Fixed an issue where HTML snippets with a condition mismatch were causing the original content to return blank.
* Fixed an issue where code snippet input preserved in the form after a failed save request was not properly unslashed.
* Fixed an issue where the code snippet code type was no longer visible and the selected value was lost after a failed save request.
* Fixed a possible PHP 8.2+ deprecation warning that could occur in specific server environments during PMCS initialization.
* Code snippet security updates to form submission handling.

= 2.5.9 - 02.27.2026 =
* Fixed a type cast issue in wp_headers filter that was resulting in a PHP error in cases where the headers were already being filtered and returning null.

= 2.5.8 - 02.26.2026 =
* Added new perfmatters_lazyload_data_src filter.
* Added nav selector support for functions that target elements inside parent containers.
* Added additional built-in CSS selector exclusion for Kadence active state class.
* Added is_admin check to disable dashicons function for certain edge cases in the admin UI.
* Added logic to prevent certain redundant options from showing up in the UI when parent disables are already toggled on.
* Added new General, License and Analytics classes to separate out specific functionality.
* Fixed an issue with certain attribute pair formats not being recognized when converting an element's attribute string to an array.
* Fixed an issue where delaying certain duplicate scripts would cause a JavaScript error and prevent remaining delayed assets from loading in.
* Fixed a code snippet issue where targeting the front or blog page of the site by page ID would not match correctly.
* Fixed multiple plugin UI HTML warnings for incorrect label target IDs.
* Made some lazy loading adjustments to let WordPress still add the auto size attribute value when necessary before the Perfmatters output buffer runs.
* Made changes to the way we handle images excluded from lazy loading to ensure they don't have a loading attribute applied.
* Removed previous functions.php file, refactored and migrated the contents to new and existing classes.
* Refactored Utilities class, added a few functions from previous combined file, combined regex passes for clean_html, added memoization to necessary functions to prevent multiple runs.
* Minor update to disable self pingbacks function for better compatibility.
* Removed BETA tag from Code Snippets feature.
* Translation updates.

= 2.5.7 - 02.02.2026 =
* Fixed an issue where the auto size attribute value was being added to images with no specified dimensions which could cause the image to display incorrectly.
* Fixed an issue where the attribute parser would ignore attribute values containing new line characters.
* Fixed an issue with certain attribute characters being disallowed preventing the attribute from migrating to the final element tag.

= 2.5.6 - 01.28.2026 =
* Added new perfmatters_cdn_url filter along with new helper methods in the CDN class.
* Added the ability to completely disable Perfmatters code features using the new PERFMATTERS_DISABLE_CODE constant.
* Added confirmation message when turning on FastClick option.
* Added logic to remove the previous stored author ID when a code snippet is imported.
* Added host name to global settings and code snippet export files.
* Added additional logic to add an auto value to lazy loaded images sizes attributes when needed.
* Added separate used CSS generated files for different WooCommerce product types.
* Added dynamic request check in heartbeat function to prevent a possible PHP error.
* Updated lazy loading class to no longer add noscript tags by default for images and iframes to reduce HTML page size. The perfmatters_lazyload_noscript filter can still be used to turn that behavior back on.
* Updated get_atts_array utility method to use regex instead of wp_kses_hair for better compatibility.
* Reworked code snippet error handling class to work better with other exception handlers and existing error reporting.
* Turned off CSSLint in the code snippet editor, as it is outdated and was leading to false positives.
* Adjusted gutter column layout in the code snippet editor to be more consistent between different code types.
* Adjusted code snippet priority field to allow both negative and zero input values.
* Fixed an issue where CSS code snippets set to run in the footer were not having their conditions checked.
* Fixed an issue where CSS code snippets were not always printing where expected based on the set location and priority.
* Fixed an issue with certain code snippet input fields not being escaped properly in the UI leading to a broken layout in some cases.
* Fixed an issue where YouTube iframes rendered with a preview thumbnail that had autoplay forced off in their query string would require a double click.
* Fixed an issue where the referrerpolicy iframe attribute did not get applied to the generated iframe when using YouTube preview thumbnails.
* Translation updates.

= 2.5.5 - 12.11.2025 =
* Added new Code Settings options to Import and Export Perfmatters code snippets.
* Added support to export individual snippets, a subset of snippets through a bulk action, or all stored snippets from the new Code Settings export button.
* Added code snippets admin bar menu item that will show up if at least one snippet is present.
* Added frontend footer and admin footer locations for CSS code snippets.
* Added new PMMU_PLUGIN_DIR constant to allow for manipulation of the MU plugin file location for specific setups where the standard WPMU_PLUGIN_DIR may be altered.
* Added a REST API exception for Mollie.
* Added additional built-in CSS selector exclusions for Elementor's background slideshow.
* Added support for relative path URLs found inside stylesheets printed inline with our perfmatters_rucss_inline_stylesheets filter.
* Updated previous Separate Block Styles option which will now show up as a Block Style Behavior dropdown for sites running WordPress 6.9+.
* Fixed an issue in the code snippets editor where lint markers were not always correctly displaying for HTML and CSS snippets.
* Fixed an issue where the code snippet editor was pushing new lines off screen in some cases and not automatically scrolling to keep things in view.
* Fixed an issue where HTML code snippets were not able to save a non-default location.
* Fixed an issue with general Perfmatters admin notices not displaying correctly.
* Fixed multiple duplicate ID warnings in the plugin UI.
* Fixed multiple jQuery deprecation warnings in plugin UI JavaScript.
* Translation updates.

= 2.5.4 - 11.20.2025 =
* Moved code snippet storage location out of cache directory and into the uploads folder to prevent data loss in certain environments.
* Fixed a code snippets compatibility issue with servers that don't support PHP OPcache.
* Fixed an issue where the CodeMirror editor was not always initializing correctly when editing an individual code snippet.
* Fixed an issue where the code type tag prefix was not updating when changing the code type while creating a new code snippet.
* Fixed an issue in the error handling class where the exception handler was looping in certain instances and throwing an error.

= 2.5.3 - 11.19.2025 =
* Added new Code Snippets (BETA) feature, which is now the default view in the Code tab. You can now create and manage PHP, JS, CSS, and HTML code snippets from inside Perfmatters. We store and load code snippets using a flat-file method and directly integrate with all of our existing optimization options for the best performance.
* Moved the existing header, body, and footer code boxes to Code > Global Scripts.
* Made style adjustments throughout the plugin UI.
* Added built-in CSS selector exclusion for GeneratePress mobile menu.
* Added new get_file_path utility method for use in various functions that need to determine the local file path for an asset loading on the front end.
* Fixed an issue where missing image dimensions were not getting applied correctly for sites inside a subdirectory.
* Removed BETA tag from Cloudflare Early Hints option.
* Updated EDD plugin updater class to version 1.9.4.

= 2.5.2 - 10.23.2025 =
* Added new perfmatters_rucss_inline_stylesheets filter which allows you to inline any stylesheet already excluded from used CSS.
* Reworked the Script Manager input change event listener for better compatibility with other JavaScript running while the Script Manager is being used.
* Added new delay JS quick exclusion for GenerateBlocks Pro.
* Added built-in CSS selector exclusion for GenerateBlocks mobile menu.
* Added built-in stylesheet exclusion for GeneratePress local fonts.
* Updated WS Form Pro delay JS quick exclusion to fix a console error.
* Fixed some incorrect wording in the clear used CSS tooltip.

= 2.5.1 - 09.29.2025 =
* Added a fetchpriority high attribute on critically preloaded image tags to match the preload link attribute.
* Added new buffer function to check the viewport meta tag position and adjust it if needed when critical image preloads are being used.
* Added logic to populate critical image preload href attribute with the fallback image src if the preload is for a responsive image srcset.
* Added built-in stylesheet exclusion for GeneratePress offside menu.
* Updated delay JS quick exclusion for Elementor to include e-gallery.
* Fixed a PHP warning that could sometimes happen when calculating the root directory path in the Utilities class.
* Fixed a trailing slash validation warning coming from critical image preload tags.
* Disabled Remove Comment URLs toggle when Kadence is active due to an incompatibility.
* Translation updates.

= 2.5.0 - 08.26.2025 =
* Added new WP-CLI subcommands to clear-minified-js, clear-minified-css, and clear-local-fonts.
* Added support for targeting header element when using parent selector matching functions.
* Added support to enable and disable the clean uninstall option in WP-CLI.
* Added a built-in Script Manager rule to prevent dashicons from being dequeued when logged in.
* Fixed a WP-CLI issue where license activation and deactivation subcommands were not working correctly. 
* Translation updates.

= 2.4.9 - 08.12.2025 =
* Rolled back CSS parsing library one version (8.9.0) to fix a conflict with WooCommerce.

= 2.4.8 - 08.11.2025 =
* Added built-in stylesheet exclusion for Bricks layer stylesheets.
* Adjusted emoji_svg_url filter to only return false outside the admin dashboard.
* Updated delay JS quick exclusion for Bricks to include splide.
* Updated delay JS quick exclusion for CookieYes to be more compatible.
* Updated early hint attribute check to include sizes and media attributes.
* Updated CSS parsing library to the latest version (9.0.0). New features, deprecation removals and bug fixes.
* Updated deprecated function in CSS class to use current method.
* Updated minification library to the latest version (1.3.75).
* Updated minimum PHP version requirement to 7.2.
* Updated our staging site license key exception list with additional formats.
* Translation updates.

= 2.4.7 - 07.15.2025 =
* Added support to set the Perfmatters license key via wp-config.php using the PERFMATTERS_LICENSE_KEY constant.
* Added new perfmatters_fetch_priority filter.
* Added integration to send an early hint header for used CSS file when both features are enabled.
* Added additional check for imagesrcset attribute when determining if an image should receive an early hint.
* Added crossorigin and fetchpriority attributes to early hint headers.
* Added additional parameters to excluded page builders array for Thrive Quiz Builder and Etch.
* Added built-in stylesheet exclusions for Elementor and Astra local fonts.
* Cleaned up leftover test file missed in previous update.
* Translation updates.

= 2.4.6 - 06.17.2025 =
* Added new advanced preload option to enable Cloudflare Early Hints (BETA) for Perfmatters preloads along with controls to limit which file types will have early hint link headers sent.
* Added new WP-CLI import-settings subcommand to import a settings configuration from an exported .json file.
* Added new WP-CLI disable and enable subcommands to modify certain plugin options. Available options can be printed out with the new get-options subcommand.
* Added new delay JS quick exclusion for SureCart.
* Added additional logic to disable speculative loading on WooCommerce cart and checkout URLs.
* Added additional logic to allow fallback deferral exclusions as part of an existing delay JS quick exclusion.
* Added built-in exclusion for Gravity Forms to prevent optimization features from running on AJAX form requests.
* Updated CSS parsing library to the latest version (8.8.0). Bug fixes and deprecations.
* Adjusted placement of perfmatters_preloads filter which was running too early and causing some filter snippets to be ignored.
* Increased default delay timeout from 10 to 15 seconds to improve compatibility.
* Fixed an issue with certain parent selector matching functions where a child element selector tag would also be replaced if it had the exact same selector tag HTML as the matched parent tag.
* Fixed multiple redundant calls to retrieve Script Manager settings row when loading the Script Manager UI.

= 2.4.5 - 05.16.2025 =
* Added some compatibility logic to fix an issue with specific caching plugins that were not working correctly with Perfmatters output buffer functions.
* Fixed a PHP translation warning that was coming from some post meta UI functions running too early.
* Translation updates.

= 2.4.4 - 05.08.2025 =
* Added new Exclude Leading option for CSS background images.
* Added new perfmatters_lazyload_parent_exclusions filter.
* Added new perfmatters_css_background_selectors filter.
* Added new speculative loading mode option to disable the feature entirely.
* Refactored lazy element method to be more efficient when searching for multiple element selectors.
* Reworked the perfmatters_critical_image_parent_exclusions and perfmatters_leading_image_parent_exclusions filters to no longer need to process the page HTML through DOMDocument for better stability, faster parsing, and 30% less code.
* Fixed an issue with parent selector matching for fetch priority and lazy loading where only the first image tag would match if it was inside a nested container element.
* Fixed an issue where the CSS Background class would get added to child elements as well if they also contained a matching selector.
* Fixed a compatibility issue when using Perfmatters preloads alongside WP Rocket.
* Fixed a spacing issue with input row checkboxes in the plugin UI.
* Translation updates.

= 2.4.3 - 04.15.2025 =
* Added new preload options to control Speculative Loading mode and eagerness settings for sites running WordPress 6.8+.
* Deprecated Instant Page option throughout the plugin for sites running WordPress 6.8+.
* Added a REST API exception for Slider Revolution.
* Updated delay JS quick exclusions for ShortPixel Adaptive Images and Slider Revolution to be more compatible.

= 2.4.2 - 04.02.2025 =
* Fixed an issue where mobile event handlers were sometimes preventing the delayed click from firing.
* Translation updates.

= 2.4.1 - 03.26.2025 =
* Refactored delay JS inline script, removed pageshow event listener, and uglified final code, reducing the script size by over 15%.
* Added built-in JS deferral exclusion for Cloudflare Turnstile.
* Added new delay JS quick exclusion for Plausible Analytics.
* Updated delay JS quick exclusions for Fluent Forms and Kadence Blocks to be more compatible.
* Adjusted document.write built-in delay exclusion to prevent false positives.
* Adjusted MU Mode documentation links in the Script Manager to go to specific anchor link sections.
* Fixed an issue where encoded data attribute values weren't being preserved correctly when converting an elements attribute string to an array.
* Fixed a multisite issue where the root directory path was not determined correctly when using a custom content directory setup.
* Deployed a secondary API that can be used when the client has issues communicating with our licensing server (usually due to firewalls).
* Removed deprecated SVG duotone filter removal actions from global styles toggle and updated tooltip to reflect changes.
* Translation updates.

= 2.4.0 - 02.26.2025 =
* Added new perfmatters_rucss_async_stylesheets filter which allows you to async any stylesheet already excluded from used CSS.
* Dashicons and Elementor animation stylesheets are now loaded via async for better performance when Removed Unused CSS is turned on.
* Added additional logic to better handle stylesheets with media query attributes when including them in used CSS for increased performance. WooCommerce users may need to clear their used CSS if mobile-specific stylesheets are being loaded as they have been removed from our built-in exclusions.
* Added new built-in stylesheet exclusion for Bricks post-specific CSS.
* Added new Delay JS quick exclusion for WPBakery.
* Added a REST API exception for SureCart.
* Added additional compatibility styles to the Script Manager.
* Made some changes to be able to start our main output buffer a bit earlier in the load for better compatibility with other plugins that modify the HTML document.
* Updated clean uninstall function with current post meta options.
* Fixed an issue where the Clear Used CSS meta button was not working correctly for certain URL types.
* Fixed a PHP warning coming from certain rewrite rule formats when MU Mode was turned on.
* Removed BETA tag from preload lazy elements option.
* Updated our staging site license key exception list with additional formats.

= 2.3.9 - 02.06.2025 =
* Added new perfmatters_preloads_array filter.
* Added new perfmatters_minify_threshold filter.
* Added additional swiper JavaScript file to Elementor quick exclusion.
* Added additional built-in CSS selector exclusion for WP Armour.
* Added a string check to login URL filter function to prevent a possible PHP error.
* Fixed an issue where new user email requests were not being allowed through the redirect block when using a custom login URL.
* Minor adjustment to CDN rewrite regex to fix an issue that was happening when the home URL was different from the site URL.
* Removed Ezoic quick exclusion and moved to built-in deferral and delay exclusions.
* Updated our staging site license key exception list with additional formats.
* Translation updates.

= 2.3.8 - 01.07.2025 =
* Added a REST API exception for SureForms.
* Added a UI button to cancel the current database optimization process.
* Added built-in delay JS exclusion for document.write for compatibility.
* Updated background processing library to the latest version (1.4.0).
* Fixed an issue where some deliberate redirect requests were not being allowed to access the hidden login URL.
* Fixed an issue where the database optimization process was not starting correctly in some cases.
* Fixed a missing anchor link pointing to the license tab in our plugin settings UI.

= 2.3.7 - 01.01.2025 =
* Added additional CSS background image inline styles to account for backgrounds set on pseudo-elements of children inside the targeted container.
* Added WP Rocket filter to disable their critical image optimization when preload critical images is active to prevent conflicts.
* Added new Delay JS quick exclusion for Ezoic.
* Added built-in minify JS exclusion for WP Recipe Maker.
* Updated network default function to preserve the CDN URL if already set on the target subsite.
* Updated admin bar menu items to show clear all used CSS on the front end.
* Updated minify exclusion functions to check the entire attribute string of the script or stylesheet instead of just the source URL.
* Updated CSS parsing library to the latest version (8.7.0). Improves support for PHP 8.4.
* Updated login URL feature with additional check to prevent access to the hidden login slug via an authentication request redirected from a query string.
* Updated buffer class to prevent running on Bricks template URLs.
* Fixed an issue where the Used CSS file was sometimes getting falsely flagged as completely unused on certain speed tests.
* Removed unnecessary documentWrite handling function from delay JS inline script to reduce the size by over 8%.
* Removed older changelog entries in readme.txt file and added link to web version.

= 2.3.6 - 11.21.2024 =
* Fixed an issue where Delay JS wasn't running correctly in some cases.
* Updated EDD plugin updater class to version 1.9.2.

= 2.3.5 - 11.21.2024 =
* Added new local Google Font option to Limit Subsets that are downloaded and included in the stylesheet.
* Added new local Google font option to change the Print Method with options for file and inline.
* Added new Priority option to manual preloads which can be used to add a specific fetchpriority attribute value to individual preload tags.
* Added new perfmatters_lazy_element_selectors filter.
* Removed unnecessary trailing link tag from delayed stylesheets when using Remove Unused CSS.
* Removed crossorigin option for manual preloads. The attribute is now automatically added to fetch and font preload tags.
* Increased action button response message timeout to 10 seconds in plugin UI.
* Fixed a PHP warning coming from Disable Google Maps function if a post ID was not found on a single post URL.
* Fixed an issue with WordPress 6.7.1 where the text domain for translations was loading too early.
* Removed deprecated plugin option to load Google fonts asynchronously.
* Translation updates.

= 2.3.4 - 10.10.2024 =
* Added new perfmatters_lazy_elements filter.
* Added new perfmatters_is_woocommerce filter.
* Added additional built-in stylesheet and selector exclusions for better compatibility with Elementor animations.
* Added WP Rocket filter to disable lazy render when lazy elements feature is active to prevent conflicts.
* Added additional parameter to excluded page builders array for tagDiv Composer.
* Added built-in delay JS exclusion for lazy elements inline script.
* Moved plugin settings logo SVG back to inline to prevent file_get_contents errors in certain environments.
* Adjusted built-in CSS dynamic selector exclusions to fix some minor visual issues with a few page builders.
* Fixed a JavaScript error that would sometimes show up in the console when using Delay JS with click delay enabled.
* Fixed an issue where a used stylesheet path would still attempt to load even if no used styles had been picked up for the URL.
* Fixed an issue where browser-specific stylesheets inside HTML comments were getting parsed by our used CSS library.
* Fixed a MU Mode issue where exceptions would not be applied correctly if a query string was present on the home URL if set to show the latest posts.
* Fixed an issue where preloading a JS file by the handle was not loading the minified version when necessary.

= 2.3.3 - 08.28.2024 =
* Added new lazy loading advanced beta options to manage Lazy Elements which will allow for element chains in the DOM to be lazy loaded until they enter the viewport.
* Separated out built-in CSS selector exclusions by URL type for increased performance on single and front pages.
* Optimized plugin logo and other SVG image files.
* Added fetchpriority high attribute automatically on critically preloaded image links.
* Added support for delaying script modules.
* Added additional jQuery sticky JavaScript file to Elementor quick exclusion.
* Added new Delay JS quick exclusions for Fluent Forms and Fluent Forms Pro.
* Integrated get_atts_array utility function into lazyload class to prevent redundancy.
* Fixed an issue where smaller size files were sometimes not being replaced with the minified version for increased performance.
* Fixed an issue where the preload location label was overlapping the input field for certain languages.
* Made adjustments to option management to prevent autoloading of certain options going forward where it is not needed.
* Removed various manual preload types that are no longer supported by most major browsers.

= 2.3.2 - 07.30.2024 =
* Updated CSS parsing library to the latest version (8.6.0) which should help with correctly parsing mathematical operations inside CSS property values.
* Added additional parameter to excluded page builders array for GenerateBlocks and TranslatePress.
* Added additional built-in deferral exclusion for jqueryParams inline script.
* Added Delay JS quick exclusion for the Kadence menu.
* Fixed a MU Mode issue where home page exceptions would not be applied correctly if a query string was present in the requested URL.
* Fixed an undefined array key warning coming from the minify class.
* Fixed a minify error that would show up when a prospective file did not have any content.
* Fixed an issue where having Remove Unused CSS turned on with no stylesheets loading would return a blank screen.
* Fixed a CSS error that would show up when trying to determine the current page ID when the queried post was null.
* Fixed an issue where the CSS class would attempt to retrieve the contents of a stylesheet even if it didn't exist.
* Fixed an issue where minified files would not get picked up by the CDN rewriter.
* Removed unnecessary minify library .git directories from the plugin.
* Minor style adjustments to the plugin UI.
* Updated our staging site license key exception list with additional formats.
* Translation updates.

= 2.3.1 - 06.27.2024 =
* Added new Minify JS and Minify CSS features along with options to exclude specific files from minification and clear generated minified files when necessary.
* UI Updates: What was previously the Assets tab has now been replaced by three more specific tabs, JavaScript, CSS, and Code. The main Script Manager toggle has been moved to Tools. Additional subheaders have also been added throughout to help with organization.
* Added new perfmatters_minify_js filter.
* Added new perfmatters_minify_js_exclusions filter.
* Added new perfmatters_minify_css filter.
* Added new perfmatters_minify_css_exclusions filter.
* Added a REST API exception for Independent Analytics.
* Added additional request parameter for Divi to excluded page builders array.
* Added built-in critical image exclusion for WPML flag images.
* Added Delay JS quick exclusion for Grow for WordPress.
* Updated used CSS function to generate a separate file for each post type archive instead of a single shared stylesheet.
* Fixed an issue that was causing an incorrect root directory to be returned for some environments.
* Fixed an issue with preload and lazyload parent exclusion filters that was preventing them from excluding images correctly in some cases.
* Translation updates.

= 2.3.0 - 05.23.2024 =
* Added a new function to verify the preferred content type from the HTTP header when determining if JSON is being requested. This should improve compatibility with certain hosting providers.
* Added an additional check when removing unused CSS to avoid parsing print-only stylesheets.
* Updated Delay JS quick exclusion for Termageddon + UserCentrics for better compatibility.
* Removed option to disable wlwmanifest link output as that function was deprecated in WordPress 6.3.
* Fixed an issue that was preventing lazy loaded images from displaying when defer inline scripts was enabled.
* Fixed an issue where responsive styles for YouTube preview thumbnails were not printing on certain themes using responsive embeds.
* Fixed an issue with DOMDocument where HTML entities coming from inline styles would display as their encoded values.
* Fixed a missing tooltip on the scan database option.
* Translation updates.

= 2.2.9 - 05.16.2024 =
* Fixed an issue that could cause a conflict with other JS deferral solutions when running at the same time.

= 2.2.8 - 05.16.2024 =
* Added new Defer JavaScript option to Include Inline Scripts.
* Added new option to Separate Block Styles.
* Added additional built-in CSS selector exclusions for Splide.
* Updated Delay JS quick exclusion for Kadence Blocks with additional scripts.
* Updated our staging site license key exception list with additional formats.
* Updated deferral exclusion check to work with entire tag instead of just src URL.
* Moved to printing responsive embed styles for YouTube preview thumbnails in all cases for better compatibility.
* Fixed an issue where the CDN rewrite was not picking up URLs with a relative protocol.
* Fixed an issue where an existing data-wp-strategy attribute would prevent a script from being able to be deferred.
* Fixed an issue where the Script Manager was not giving the right feedback on save when a new line character was showing up in the AJAX response.
* Fixed an issue on the network settings page where incorrect tab content would show up after saving.
* Fixed an issue where the license tab was showing up at the subsite level if the plugin was not network activated in a multisite environment.
* Translation updates.

= 2.2.7 - 04.19.2024 =
* Added new perfmatters_used_css_below filter.
* Added new perfmatters_defer_js_exclusions filter.
* Added new perfmatters_delay_js_fastclick filter.
* Added additional DOMDocument flag to parent exclusion filters for better compatibility.
* Added GiveWP request parameter to excluded page builders array.
* Updated Delay JS quick exclusion for WooCommerce Single Product Gallery with additional scripts to help with zoom and lightbox functionality.
* Updated Delay JS quick exclusion for Cookie Notice with additional scripts.
* Moved Script Manager CSS to stylesheet printed inline instead of from a PHP file.

= 2.2.6 - 03.18.2024 =
* Added new perfmatters_defer_jquery filter.
* Added Delay JS quick exclusion for Monumetric Ads.
* Updated content URL reference to use content_url function instead of constant when generating root directory path.
* Updated local stylesheet URL replace function to be case insensitive.
* Updated new parent exclusion filters to use DOMDocument instead of regex to allow support for targeting images inside nested containers.
* Fixed an issue where certain scripts were not being deferred properly when delay JavaScript option was also enabled.
* Fixed an issue where abnormal image URLs would sometimes generate a warning when trying to parse for image dimensions.
* Translation updates.

= 2.2.5 - 02.29.2024 =
* Added new perfmatters_critical_image_parent_exclusions filter.
* Added new perfmatters_leading_image_parent_exclusions filter.
* Added new Disable Core Fetch option to disable the fetch priority attribute added by WordPress core.
* Added built-in WooCommerce CSS selector exclusion for better compatibility on single product posts.
* Added Breakdance request parameters to excluded page builders array.
* Added a REST API exception for WP Recipe Maker.
* Added Delay JS quick exclusions for Kadence Blocks and Kadence Blocks Pro.
* Added CSS Background Image support for the footer element.
* Fixed an issue where dynamic preload version numbers would sometimes get added to the wrong resource.
* Fixed an issue with certain multilingual setups where the base URL for generated files was incorrect.
* Updated background processing library to the latest version (1.3.0).
* Updated CSS parsing library to the latest version (8.5.1).
* Minor style updates to plugin UI.

= 2.2.4 - 02.05.2024 =
* Added built-in Image Dimensions exclusion for blank placeholder SVGs.
* Added excluded page builders function check to MU plugin file.
* Changed method of retrieving root directory in certain classes for better compatibility with more file structures.
* Fixed PHP warnings coming from local analytics function.

= 2.2.3 - 01.08.2024 =
* Fixed an issue where Mediavine and Modula Slider quick exclusions were not working properly.

= 2.2.2 - 01.07.2024 =
* Fixed PHP warnings coming from certain local analytics setups.
* Translation updates.

= 2.2.1 - 01.04.2024 =
* Removed deprecated Universal Analytics options which are no longer available and renamed remaining script type labels. If you still haven't updated to Google Analytics 4, make sure to create a new profile and input your new measurement ID.
* Added new tools option to Disable Optimizations for Logged In Users.
* Added new perfmatters_leading_image_exclusions filter.
* Added support for targeting figure elements to CSS Background Images.
* Added REST route exception for Litespeed.
* Added and updated Delay JS quick exclusions for Gravity Forms, Mediavine Trellis, Modula Slider, SHE Media Infuse, Thrive Leads, and WP Recipe Maker.
* Added built-in Delay JS exclusion for Divi link options script.
* Added generic customizer request parameter to excluded page builders array.
* Made some adjustments to classes dealing with cache directory files to support non-traditional folder structures such as Bedrock.
* Fixed a PHP warning related to cache URL declaration that would sometimes display for certain types of requests.
* Fixed an issue where picture elements were not getting excluded from lazy loading when fetchpriority high was set on a child image.
* Removed unnecessary script type attribute from our Delay JS inline script.
* Translation updates.

View the full changelog:
[https://perfmatters.io/docs/changelog/](https://perfmatters.io/docs/changelog/)