{"id":167932,"date":"2023-01-04T02:04:34","date_gmt":"2023-01-04T02:04:34","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/lazyload-css\/"},"modified":"2026-08-23T15:58:31","modified_gmt":"2026-08-23T15:58:31","slug":"easy-optimizer","status":"publish","type":"plugin","link":"https:\/\/da.wordpress.org\/plugins\/easy-optimizer\/","author":20532876,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.6.4","stable_tag":"2.6.4","tested":"7.1","requires":"6.4","requires_php":"7.4","requires_plugins":null,"header_name":"Easy Optimizer \u2013 PageSpeed, Cache & Core Web Vitals","header_author":"FluxPress","header_description":"A plugin to lazy-load unnecessary CSS stylesheet files to improve FCP, LCP (Largest Contentful Paint), and overall performance.","assets_banners_color":"695ec6","last_updated":"2026-08-23 15:58:31","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/paypal.me\/uzairwp","header_plugin_uri":"https:\/\/fluxpress.io","header_author_uri":"https:\/\/fluxpress.io","rating":4.5,"author_block_rating":0,"active_installs":700,"downloads":12246,"num_ratings":14,"support_threads":8,"support_threads_resolved":8,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"easywpstuff","date":"2023-07-24 11:42:06"},"1.0.1":{"tag":"1.0.1","author":"easywpstuff","date":"2023-07-24 11:44:48"},"1.0.2":{"tag":"1.0.2","author":"easywpstuff","date":"2023-07-25 05:50:18"},"1.0.3":{"tag":"1.0.3","author":"easywpstuff","date":"2023-07-26 16:06:42"},"1.0.4":{"tag":"1.0.4","author":"easywpstuff","date":"2023-08-06 10:05:11"},"1.0.5":{"tag":"1.0.5","author":"easywpstuff","date":"2023-08-07 08:21:48"},"1.0.6":{"tag":"1.0.6","author":"easywpstuff","date":"2023-08-29 13:14:35"},"1.0.7":{"tag":"1.0.7","author":"easywpstuff","date":"2023-08-31 17:13:39"},"1.0.8":{"tag":"1.0.8","author":"easywpstuff","date":"2023-09-02 13:14:09"},"1.0.9":{"tag":"1.0.9","author":"easywpstuff","date":"2023-11-20 14:04:01"},"1.1.0":{"tag":"1.1.0","author":"easywpstuff","date":"2025-11-17 15:55:15"},"2.0.0":{"tag":"2.0.0","author":"easywpstuff","date":"2026-05-23 15:58:03"},"2.0.1":{"tag":"2.0.1","author":"easywpstuff","date":"2026-05-24 06:35:28"},"2.0.2":{"tag":"2.0.2","author":"easywpstuff","date":"2026-05-24 14:57:04"},"2.1.0":{"tag":"2.1.0","author":"easywpstuff","date":"2026-05-27 19:19:54"},"2.2.0":{"tag":"2.2.0","author":"easywpstuff","date":"2026-05-28 12:33:37"},"2.2.1":{"tag":"2.2.1","author":"easywpstuff","date":"2026-05-29 10:14:34"},"2.2.2":{"tag":"2.2.2","author":"easywpstuff","date":"2026-05-31 06:08:04"},"2.3.0":{"tag":"2.3.0","author":"easywpstuff","date":"2026-06-05 13:39:45"},"2.3.1":{"tag":"2.3.1","author":"easywpstuff","date":"2026-06-11 10:37:53"},"2.3.2":{"tag":"2.3.2","author":"easywpstuff","date":"2026-06-11 17:23:45"},"2.4.0":{"tag":"2.4.0","author":"easywpstuff","date":"2026-06-14 06:15:27"},"2.4.1":{"tag":"2.4.1","author":"easywpstuff","date":"2026-06-15 07:32:53"},"2.4.2":{"tag":"2.4.2","author":"easywpstuff","date":"2026-06-15 11:46:37"},"2.5.0":{"tag":"2.5.0","author":"easywpstuff","date":"2026-07-04 08:33:38"},"2.5.1":{"tag":"2.5.1","author":"easywpstuff","date":"2026-07-05 12:20:36"},"2.5.2":{"tag":"2.5.2","author":"easywpstuff","date":"2026-07-09 18:37:50"},"2.5.3":{"tag":"2.5.3","author":"easywpstuff","date":"2026-07-15 16:49:13"},"2.5.4":{"tag":"2.5.4","author":"easywpstuff","date":"2026-07-21 17:09:23"},"2.5.5":{"tag":"2.5.5","author":"easywpstuff","date":"2026-07-24 17:40:22"},"2.5.6":{"tag":"2.5.6","author":"easywpstuff","date":"2026-07-30 17:42:26"},"2.6.0":{"tag":"2.6.0","author":"easywpstuff","date":"2026-08-03 18:32:47"},"2.6.1":{"tag":"2.6.1","author":"easywpstuff","date":"2026-08-08 17:49:23"},"2.6.2":{"tag":"2.6.2","author":"easywpstuff","date":"2026-08-14 06:35:53"},"2.6.3":{"tag":"2.6.3","author":"easywpstuff","date":"2026-08-21 16:29:17"},"2.6.4":{"tag":"2.6.4","author":"easywpstuff","date":"2026-08-23 15:58:31"}},"upgrade_notice":{"2.6.3":"<p>Fixes the automatic before-and-after speed test, which never ran on any site \u2014 the &quot;After&quot; score only ever appeared if you pressed &quot;Run speed test&quot; yourself. The free Smart Images plan now covers 500 images a month instead of 50.<\/p>","2.6.0":"<p>Important security and correctness fixes: preload requests are now signed, cached pages declare what they vary on, and exported settings no longer contain your credentials. Page caching now works on hosts where it silently never served. Adds the Debug Issues panel and a &quot;What to fix next&quot; dashboard card.<\/p>"},"ratings":{"1":1,"2":1,"3":0,"4":0,"5":12},"assets_icons":{"icon-128x128.gif":{"filename":"icon-128x128.gif","revision":3545305,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.gif":{"filename":"icon-256x256.gif","revision":3545305,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3545305,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3545305,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1","1.0.2","1.0.3","1.0.4","1.0.5","1.0.6","1.0.7","1.0.8","1.0.9","1.1.0","2.0.0","2.0.1","2.0.2","2.1.0","2.2.0","2.2.1","2.2.2","2.3.0","2.3.1","2.3.2","2.4.0","2.4.1","2.4.2","2.5.0","2.5.1","2.5.2","2.5.3","2.5.4","2.5.5","2.5.6","2.6.0","2.6.1","2.6.2","2.6.3","2.6.4"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3552101,"resolution":"1","location":"assets","locale":"","width":1642,"height":1394},"screenshot-10.png":{"filename":"screenshot-10.png","revision":3552101,"resolution":"10","location":"assets","locale":"","width":1653,"height":1395},"screenshot-11.png":{"filename":"screenshot-11.png","revision":3552101,"resolution":"11","location":"assets","locale":"","width":1647,"height":2363},"screenshot-12.png":{"filename":"screenshot-12.png","revision":3552101,"resolution":"12","location":"assets","locale":"","width":1650,"height":1386},"screenshot-13.png":{"filename":"screenshot-13.png","revision":3552101,"resolution":"13","location":"assets","locale":"","width":1649,"height":1958},"screenshot-14.png":{"filename":"screenshot-14.png","revision":3552101,"resolution":"14","location":"assets","locale":"","width":1649,"height":1377},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3552101,"resolution":"2","location":"assets","locale":"","width":1647,"height":1619},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3552101,"resolution":"3","location":"assets","locale":"","width":1648,"height":1371},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3552101,"resolution":"4","location":"assets","locale":"","width":1645,"height":1377},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3552101,"resolution":"5","location":"assets","locale":"","width":1648,"height":1394},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3552101,"resolution":"6","location":"assets","locale":"","width":1650,"height":1371},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3552101,"resolution":"7","location":"assets","locale":"","width":1647,"height":1376},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3552101,"resolution":"8","location":"assets","locale":"","width":1655,"height":1389},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3552101,"resolution":"9","location":"assets","locale":"","width":1646,"height":1898}},"screenshots":{"1":"Dashboard \u2014 performance overview with cache statistics, preload progress, feature status toggles and quick-action buttons for clearing cache and Cloudflare.","2":"Cache settings \u2014 page cache with serving mode selection (PHP or .htaccess), cache lifetime, separate mobile cache, browser caching, Gzip\/Brotli, preload toggle and granular exclusion fields.","3":"JavaScript optimization \u2014 delay until interaction or native defer method, jQuery exclusion, script and URL exclusion lists, inline script externalization.","4":"CSS optimization \u2014 remove unused CSS with inline or file method, stylesheet behavior (delay, async, remove), selector and stylesheet exclusion, per-post-type mode.","5":"Lazy load \u2014 toggle images, iframes and videos independently; add missing dimensions; exclude first N images; class and URL exclusion.","6":"LCP preload \u2014 automatic detection with zero configuration; URL exclusion for edge cases.","7":"Prefetch pages \u2014 speculation rules eagerness, prerender toggle, throttle and limit controls, URL and CSS selector exclusions.","8":"Font optimization \u2014 font-display:swap and lazy-load font stylesheets with exclusion support.","9":"Bloat removal \u2014 15 independent toggles for emojis, embeds, XML-RPC, jQuery Migrate, version meta, RSD\/WLW, shortlinks, RSS, self-pingbacks, REST API, Heartbeat, cart fragments, App Passwords, Dashicons and Block Library CSS.","10":"Cloudflare \u2014 API token and zone ID with test connection button, purge strategy selection.","11":"Database cleanup \u2014 task toggles with item counts, scheduled cleanup, snapshot and restore, chunked processing.","12":"Autoload health \u2014 total autoload size, per-option size breakdown, one-click autoload disable\/enable with core option protection.","13":"Heartbeat &amp; Cron \u2014 heartbeat location and frequency control, WP-Cron throttle, cron event viewer with manual run and delete.","14":"Accessibility &amp; SEO \u2014 eight accessibility audit toggles and two SEO audit toggles with clear Lighthouse audit descriptions."}},"plugin_section":[],"plugin_tags":[146,187460,1513,247,794],"plugin_category":[52],"plugin_contributors":[216909,267028],"plugin_business_model":[],"class_list":["post-167932","plugin","type-plugin","status-publish","hentry","plugin_tags-cache","plugin_tags-core-web-vitals","plugin_tags-pagespeed","plugin_tags-performance","plugin_tags-speed","plugin_category-performance","plugin_contributors-easywpstuff","plugin_contributors-uzairwp","plugin_committers-easywpstuff"],"banners":{"banner":"https:\/\/ps.w.org\/easy-optimizer\/assets\/banner-772x250.png?rev=3545305","banner_2x":"https:\/\/ps.w.org\/easy-optimizer\/assets\/banner-1544x500.png?rev=3545305","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/easy-optimizer\/assets\/icon-128x128.gif?rev=3545305","icon_2x":"https:\/\/ps.w.org\/easy-optimizer\/assets\/icon-256x256.gif?rev=3545305","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/easy-optimizer\/assets\/screenshot-1.png?rev=3552101","caption":"Dashboard \u2014 performance overview with cache statistics, preload progress, feature status toggles and quick-action buttons for clearing cache and Cloudflare."},{"src":"https:\/\/ps.w.org\/easy-optimizer\/assets\/screenshot-2.png?rev=3552101","caption":"Cache settings \u2014 page cache with serving mode selection (PHP or .htaccess), cache lifetime, separate mobile cache, browser caching, Gzip\/Brotli, preload toggle and granular exclusion fields."},{"src":"https:\/\/ps.w.org\/easy-optimizer\/assets\/screenshot-3.png?rev=3552101","caption":"JavaScript optimization \u2014 delay until interaction or native defer method, jQuery exclusion, script and URL exclusion lists, inline script externalization."},{"src":"https:\/\/ps.w.org\/easy-optimizer\/assets\/screenshot-4.png?rev=3552101","caption":"CSS optimization \u2014 remove unused CSS with inline or file method, stylesheet behavior (delay, async, remove), selector and stylesheet exclusion, per-post-type mode."},{"src":"https:\/\/ps.w.org\/easy-optimizer\/assets\/screenshot-5.png?rev=3552101","caption":"Lazy load \u2014 toggle images, iframes and videos independently; add missing dimensions; exclude first N images; class and URL exclusion."},{"src":"https:\/\/ps.w.org\/easy-optimizer\/assets\/screenshot-6.png?rev=3552101","caption":"LCP preload \u2014 automatic detection with zero configuration; URL exclusion for edge cases."},{"src":"https:\/\/ps.w.org\/easy-optimizer\/assets\/screenshot-7.png?rev=3552101","caption":"Prefetch pages \u2014 speculation rules eagerness, prerender toggle, throttle and limit controls, URL and CSS selector exclusions."},{"src":"https:\/\/ps.w.org\/easy-optimizer\/assets\/screenshot-8.png?rev=3552101","caption":"Font optimization \u2014 font-display:swap and lazy-load font stylesheets with exclusion support."},{"src":"https:\/\/ps.w.org\/easy-optimizer\/assets\/screenshot-9.png?rev=3552101","caption":"Bloat removal \u2014 15 independent toggles for emojis, embeds, XML-RPC, jQuery Migrate, version meta, RSD\/WLW, shortlinks, RSS, self-pingbacks, REST API, Heartbeat, cart fragments, App Passwords, Dashicons and Block Library CSS."},{"src":"https:\/\/ps.w.org\/easy-optimizer\/assets\/screenshot-10.png?rev=3552101","caption":"Cloudflare \u2014 API token and zone ID with test connection button, purge strategy selection."},{"src":"https:\/\/ps.w.org\/easy-optimizer\/assets\/screenshot-11.png?rev=3552101","caption":"Database cleanup \u2014 task toggles with item counts, scheduled cleanup, snapshot and restore, chunked processing."},{"src":"https:\/\/ps.w.org\/easy-optimizer\/assets\/screenshot-12.png?rev=3552101","caption":"Autoload health \u2014 total autoload size, per-option size breakdown, one-click autoload disable\/enable with core option protection."},{"src":"https:\/\/ps.w.org\/easy-optimizer\/assets\/screenshot-13.png?rev=3552101","caption":"Heartbeat &amp; Cron \u2014 heartbeat location and frequency control, WP-Cron throttle, cron event viewer with manual run and delete."},{"src":"https:\/\/ps.w.org\/easy-optimizer\/assets\/screenshot-14.png?rev=3552101","caption":"Accessibility &amp; SEO \u2014 eight accessibility audit toggles and two SEO audit toggles with clear Lighthouse audit descriptions."}],"raw_content":"<!--section=description-->\n<p>Speed up your WordPress site and improve your Google PageSpeed score from a single dashboard. <strong>Easy Optimizer<\/strong> is a free, all-in-one performance plugin that can replace the 3\u20135 separate speed plugins most sites run today \u2014 page caching, unused-CSS removal, JavaScript delay\/defer, image lazy loading, LCP preloading, WebP\/AVIF delivery and more \u2014 to help you pass Core Web Vitals: Largest Contentful Paint (LCP), Cumulative Layout Shift (CLS) and Interaction to Next Paint (INP). It runs on Apache, Nginx, LiteSpeed and OpenLiteSpeed, and is fully WooCommerce-aware.<\/p>\n\n<p>One cache plugin, one dashboard, no premium upsells for core features. Prefer to keep your current cache plugin? Turn off the modules that overlap and use only the tools you want (see the FAQ).<\/p>\n\n<p>Every toggle maps to a specific Google Lighthouse recommendation \u2014 enable it, save, and your Core Web Vitals improve immediately. Features you don't enable never touch your page load or your admin.<\/p>\n\n<h4>Core Features<\/h4>\n\n<ul>\n<li><strong>Full Page Caching:<\/strong> Serve static HTML with sub-millisecond TTFB, with separate mobile and desktop caches and automatic sitemap-based preloading that warms your pages in the background.<\/li>\n<li><strong>Compression &amp; Browser Caching:<\/strong> Turn on Gzip or Brotli text compression and long-lived browser-cache (Expires) headers to shrink transfer size and stop repeat visitors re-downloading the same assets \u2014 resolving Lighthouse's \"Enable text compression\" and \"Serve static assets with an efficient cache policy\".<\/li>\n<li><strong>Redis Object Cache:<\/strong> Add a persistent object cache that keeps repeated database and option lookups in Redis, cutting MySQL load on dynamic, logged-in and WooCommerce pages. Works with Relay, PhpRedis or the bundled Predis client (no PHP extension required) and reads your host's <code>WP_REDIS_*<\/code> constants automatically. It defers to any object-cache drop-in already installed instead of overwriting it, never edits <code>wp-config.php<\/code>, and includes a one-click flush plus a live status panel (connection, memory, Redis version).<\/li>\n<li><strong>Remove Unused CSS:<\/strong> Fix Lighthouse's \"Reduce unused CSS\" by serving a slim, per-page-type stylesheet \u2014 eliminating render-blocking CSS and lifting your LCP. A built-in fail-safe keeps your original styles until a valid stylesheet is generated, so pages never render unstyled.<\/li>\n<li><strong>Minify CSS &amp; JavaScript:<\/strong> Strip comments and whitespace from your local CSS and JS files, caching each minified file on disk so it is processed only once. Already-minified files are skipped, and relative <code>url()<\/code>\/<code>@import<\/code> paths are rewritten so assets keep resolving. Works independently of Remove Unused CSS and Delay JS.<\/li>\n<li><strong>Delay &amp; Defer JavaScript:<\/strong> Cut Total Blocking Time and improve INP by delaying script execution until user interaction, or by deferring scripts natively. jQuery is excluded by default, and you can exclude any script that needs to run early.<\/li>\n<li><strong>Smart Lazy Loading:<\/strong> Defer offscreen images, iframes, videos and CSS background images, and add missing width\/height attributes to prevent layout shift (CLS).<\/li>\n<li><strong>Automatic LCP Preload:<\/strong> Detect each page's Largest Contentful Paint image and preload it \u2014 including responsive <code>srcset<\/code>, <code>&lt;picture&gt;<\/code> and CSS background heroes \u2014 stored per URL so every page preloads its own correct hero for faster visual loading.<\/li>\n<li><strong>Image CDN (WebP &amp; AVIF):<\/strong> Rewrite your image URLs to a global CDN that serves modern WebP\/AVIF formats and every responsive size, addressing Lighthouse's \"Serve images in next-gen formats\". Optional and off until you enable it.<\/li>\n<li><strong>Prefetch Pages:<\/strong> Pre-fetch links as visitors hover \u2014 with rate limiting and automatic back-off on a struggling server \u2014 making navigation feel like an instant single-page app.<\/li>\n<li><strong>Font Optimization:<\/strong> Add <code>font-display: swap<\/code> so text stays visible during webfont loads, with optional per-device font preloading learned from a lightweight beacon.<\/li>\n<li><strong>Bloat Removal:<\/strong> 15 independent toggles to safely switch off unused WordPress core scripts and features (emojis, embeds, XML-RPC, jQuery Migrate, Dashicons, Block Library CSS and more).<\/li>\n<li><strong>Database Cleanup &amp; Optimization:<\/strong> Schedule cleanups of revisions, auto-drafts, trashed posts, spam and transients \u2014 each with a pre-cleanup snapshot so you can restore safely. The built-in Autoload Health auditor finds the heaviest autoloaded options and lets you switch off the ones you don't need, directly resolving the Site Health warning \"Autoloaded options could affect performance.\"<\/li>\n<li><strong>Heartbeat &amp; Cron Manager:<\/strong> Limit WordPress Heartbeat frequency and throttle WP-Cron from the dashboard (no <code>wp-config.php<\/code> edits), and view, run or delete scheduled cron events.<\/li>\n<li><strong>Cloudflare Integration:<\/strong> Purge your Cloudflare edge cache (tag-based or full zone) whenever the page cache clears, and test your API connection instantly without saving credentials first.<\/li>\n<li><strong>Hosting Integrations:<\/strong> Detect your environment and purge server-level cache on managed hosts including Kinsta, WP Engine, SiteGround, Cloudways, GridPane, RunCloud, SpinupWP, Rocket.net and WordPress.com.<\/li>\n<li><strong>Accessibility &amp; SEO Fixes:<\/strong> Resolve common Lighthouse accessibility warnings in real time \u2014 missing form labels, ARIA names, iframe titles and un-crawlable links \u2014 without editing your theme.<\/li>\n<li><strong>PageSpeed Speed Test:<\/strong> Run a Google PageSpeed test from your dashboard and compare your score with and without Easy Optimizer, for both mobile and desktop, including Core Web Vitals (LCP, CLS, INP). Works out of the box, or add your own free Google API key for unlimited tests.<\/li>\n<li><strong>Debug Issues Panel:<\/strong> If a page ever looks wrong, switch individual optimizations off for a single page load and find the cause in a couple of clicks \u2014 no settings changed, no cache cleared, and no private browsing window needed. It tells you which feature caused it and takes you straight to the exclusion field that makes the fix permanent.<\/li>\n<li><strong>Find Slow Plugins &amp; Themes (Backend Analyzer):<\/strong> Profile any page or your admin area on demand to see exactly which plugins, themes and database queries take the most time \u2014 so you can pinpoint what is slowing your site down. Nothing runs for real visitors, so there is no added overhead.<\/li>\n<\/ul>\n\n<h4>PageSpeed Insights &amp; Lighthouse Recommendations Addressed<\/h4>\n\n<p>Lighthouse 13 renamed and merged many performance audits. Where the name changed, the previous wording is shown in brackets so you can match either against your report.<\/p>\n\n<p><strong>Performance<\/strong><\/p>\n\n<ul>\n<li>Render blocking requests (was: Eliminate render-blocking resources)<\/li>\n<li>Reduce unused CSS<\/li>\n<li>Minimize main-thread work<\/li>\n<li>Improve image delivery (was: Serve images in next-gen formats \/ Properly size images)<\/li>\n<li>Layout shift culprits (was: Image elements do not have explicit width and height)<\/li>\n<li>LCP request discovery (was: Preload Largest Contentful Paint image)<\/li>\n<li>Font display (was: Ensure text remains visible during webfont load)<\/li>\n<li>Use efficient cache lifetimes (was: Serve static assets with an efficient cache policy)<\/li>\n<li>Document request latency (was: Enable text compression \/ Reduce server response time)<\/li>\n<li>Network dependency tree (was: Preconnect to required origins)<\/li>\n<\/ul>\n\n<p><strong>Accessibility<\/strong><\/p>\n\n<ul>\n<li>Form elements do not have associated labels<\/li>\n<li>Links do not have a discernible name<\/li>\n<li>Buttons do not have an accessible name<\/li>\n<li>[user-scalable=\"no\"] in viewport or [maximum-scale] &lt; 5<\/li>\n<li>Frame or iframe elements do not have a title<\/li>\n<li>ARIA progressbar elements do not have accessible names<\/li>\n<li>Some elements have a [tabindex] value greater than 0<\/li>\n<li>Image elements do not have [alt] attributes<\/li>\n<\/ul>\n\n<p><strong>SEO<\/strong><\/p>\n\n<ul>\n<li>Links are not crawlable<\/li>\n<li>Image elements do not have [alt] attributes.<\/li>\n<\/ul>\n\n<h4>Works With Your Setup<\/h4>\n\n<ul>\n<li><strong>WordPress &amp; PHP:<\/strong> WP 6.4+ and PHP 7.4+<\/li>\n<li><strong>Web Servers:<\/strong> Apache, Nginx, LiteSpeed, OpenLiteSpeed<\/li>\n<li><strong>WooCommerce:<\/strong> Fully compatible. Cart, checkout, and my-account pages are automatically excluded from caching and optimization to protect the purchase flow.<\/li>\n<li><strong>Page Builders:<\/strong> Elementor, Beaver Builder, Divi, Gutenberg, Bricks, Oxygen, Breakdance.<\/li>\n<\/ul>\n\n<h4>A Free Alternative to Premium Speed Plugins<\/h4>\n\n<p>Easy Optimizer is a genuine free alternative to paid performance plugins such as WP Rocket, FlyingPress and Perfmatters: page caching, Remove Unused CSS, Delay\/Defer JavaScript, LCP preload, lazy load, Cloudflare and hosting-cache purging, database cleanup and the Backend Analyzer are all included, with no premium-locked features and no upsells. Run it as a complete all-in-one, or use just the tools you need alongside your existing setup \u2014 the only rule is to never run two of the same optimization (especially two page caches) at once.<\/p>\n\n<h3>External Services<\/h3>\n\n<p>Easy Optimizer can connect to the external services below. Each is optional and used only for the feature noted.<\/p>\n\n<ul>\n<li>FluxPress Adaptive Images (paid, optional) \u2014 when Smart Images is connected with a license key, your public image URLs are rewritten to your personal CDN endpoint (CDN + an image-processing service) for AVIF\/WebP conversion, resizing and delivery. URLs are cryptographically signed; only public image URLs are requested by visitors' browsers; your original files are never modified or uploaded. During connect, and roughly hourly afterwards, the plugin contacts fluxpress.io (endpoints: \/provision on connect, \/usage for the bandwidth meter and license check, \/preflight during connect, \/deprovision on disconnect, \/purge after settings changes), sending only your license key and site URL. <a href=\"https:\/\/fluxpress.io\/privacy\">Terms &amp; Privacy<\/a> <\/li>\n<li>SureCart (licensing for Adaptive Images) \u2014 validating and activating\/deactivating your license contacts api.surecart.com with your license key and site URL. Only used when you connect, disconnect, or the license is re-validated. <a href=\"https:\/\/surecart.com\/terms\/\">Terms<\/a> \u00b7 <a href=\"https:\/\/surecart.com\/privacy\/\">Privacy<\/a><\/li>\n<li>Cloudflare API \u2014 when Cloudflare is connected, your edge cache is purged (by URL or full zone) as the page cache clears. Only the URLs to purge and your zone ID are sent. <a href=\"https:\/\/www.cloudflare.com\/website-terms\/\">Terms<\/a> \u00b7 <a href=\"https:\/\/www.cloudflare.com\/privacypolicy\/\">Privacy<\/a><\/li>\n<li>Google PageSpeed Insights \u2014 when you run a speed test with your own API key, your site's public home URL is sent to Google. <a href=\"https:\/\/developers.google.com\/terms\">Terms<\/a> \u00b7 <a href=\"https:\/\/policies.google.com\/privacy\">Privacy<\/a><\/li>\n<li>FluxPress PageSpeed proxy \u2014 the default speed-test path; your site registers once, then its public home URL is tested via Google so no API key is needed. <a href=\"https:\/\/fluxpress.io\/privacy\">Terms &amp; Privacy<\/a><\/li>\n<li><a href=\"https:\/\/fluxpress.io\/\">FluxPress<\/a> usage analytics \u2014 opt-in, off by default; sends technical, non-personal data (plugin\/WordPress\/PHP versions, theme, locale, host, multisite\/WooCommerce flags, and your site URL). It never sends your email, visitor IPs, user data, or page content. <a href=\"https:\/\/fluxpress.io\/privacy\">Terms &amp; Privacy<\/a><\/li>\n<\/ul>\n\n<h3>Privacy<\/h3>\n\n<p>Easy Optimizer's usage analytics are opt-in and disabled by default. When enabled, it sends the data listed under External Services over an encrypted connection. It never collects your email address, IP address, user data, or site content.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>In your WordPress admin, go to <strong>Plugins \u2192 Add New<\/strong> and search for \"Easy Optimizer\", or upload the plugin to <code>\/wp-content\/plugins\/easy-optimizer\/<\/code>.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Open <strong>Easy Optimizer<\/strong> in the admin sidebar. On a new install the setup wizard opens automatically \u2014 nothing is enabled until you choose a preset.<\/li>\n<li>Pick a preset: <strong>Safe<\/strong> (best for shared hosting), <strong>Balanced<\/strong> (recommended for most sites) or <strong>Maximum<\/strong>. If you're not sure, choose <strong>Balanced<\/strong>.<\/li>\n<li>Save. The cache preloader starts warming your site automatically. You can fine-tune any individual feature from the tabs at any time, and the Settings tab includes a one-click <strong>Safe Mode<\/strong> if you ever need a known-good baseline.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20easy%20optimizer%20compatible%20with%20wp%20rocket%2C%20flyingpress%2C%20perfmatters%2C%20litespeed%20cache%20and%20other%20popular%20plugins%3F\"><h3>Is Easy Optimizer compatible with WP Rocket, FlyingPress, Perfmatters, LiteSpeed Cache and other popular plugins?<\/h3><\/dt>\n<dd><p>Yes. Easy Optimizer is built to play nicely alongside other plugins, including WP Rocket, FlyingPress, Perfmatters, LiteSpeed Cache, W3 Total Cache, WP Super Cache, WP Fastest Cache, Autoptimize, NitroPack and the common page builders (Elementor, Divi, Beaver Builder, Oxygen) and SEO plugins (Yoast, Rank Math). It also works with WooCommerce and Cloudflare.<\/p>\n\n<p>The only rule is simple: don't run the same optimization twice. Every module is independent and only runs when you switch it on, so just turn off whatever overlaps with another plugin you're already using. Most importantly, never run two page caches at once \u2014 if another plugin is handling caching, leave Easy Optimizer's Page Cache off (or turn the other one off and let Easy Optimizer handle it). The same applies to features like unused CSS, delay JavaScript, or lazy load: pick one plugin to do each job.<\/p>\n\n<p>This means you can use Easy Optimizer as a complete all-in-one replacement, or keep your current setup and use only the parts you want \u2014 for example the Backend Analyzer, Autoload Health, database cleanup, or heartbeat and cron controls \u2014 while another plugin keeps doing the caching. Either way works.<\/p><\/dd>\n<dt id=\"how%20is%20easy%20optimizer%20different%20from%20wp%20rocket%2C%20flyingpress%20or%20perfmatters%3F\"><h3>How is Easy Optimizer different from WP Rocket, FlyingPress or Perfmatters?<\/h3><\/dt>\n<dd><p>Easy Optimizer is free and open, with no premium-locked core features and no upsells: caching, Remove Unused CSS, Delay\/Defer JS, LCP preload, lazy load, Cloudflare and hosting-cache purging, database cleanup and the Backend Analyzer are all included. Those paid plugins are mature and excellent; Easy Optimizer aims to give you the same core speed wins for free, and to coexist cleanly if you already run one \u2014 just don't run two of the same optimization at once.<\/p><\/dd>\n<dt id=\"something%20on%20my%20site%20looks%20broken%20%E2%80%94%20how%20do%20i%20find%20which%20feature%20caused%20it%3F\"><h3>Something on my site looks broken \u2014 how do I find which feature caused it?<\/h3><\/dt>\n<dd><p>Use the <strong>Debug Issues<\/strong> button in the top bar. Pick the page that looks wrong, tick one optimization at a time, and open the generated link \u2014 that single page load runs with the feature switched off, while your settings and your cache stay exactly as they are. Answer \"did that fix it?\" and Easy Optimizer tells you which feature was responsible and takes you to the exclusion field that keeps the fix permanently.<\/p>\n\n<p>You do not need a private browsing window. Some optimizations are normally skipped while you are logged in, so the panel's links quietly render the page the way a visitor sees it. If the page is still wrong with everything switched off, the cause is your theme, another plugin or your server \u2014 and the panel says so rather than sending you round the loop again.<\/p><\/dd>\n<dt id=\"will%20easy%20optimizer%20speed%20up%20my%20woocommerce%20store%3F\"><h3>Will Easy Optimizer speed up my WooCommerce store?<\/h3><\/dt>\n<dd><p>Yes. Every optimization module runs on your shop, while Cart, Checkout and My Account are automatically excluded so the purchase flow is never cached or altered \u2014 including custom or translated slugs. Multi-currency stores cache a correct copy per selected currency, and you can disable WooCommerce cart fragments from the Bloat Removal tab to speed up pages that don't need them.<\/p><\/dd>\n<dt id=\"does%20it%20work%20on%20nginx%2C%20litespeed%20and%20openlitespeed%2C%20or%20only%20apache%3F\"><h3>Does it work on Nginx, LiteSpeed and OpenLiteSpeed, or only Apache?<\/h3><\/dt>\n<dd><p>All of them. On Apache it can optionally write <code>.htaccess<\/code> rules (after a per-server safety probe that prevents a bad rule from ever 500-ing your site); on Nginx, LiteSpeed and OpenLiteSpeed it serves cached pages through PHP. On hosts with their own server-level cache (Varnish \/ LiteSpeed \/ nginx FastCGI), preloading and on-visit caching are handled correctly.<\/p><\/dd>\n<dt id=\"what%27s%20the%20difference%20between%20delay%20js%20and%20defer%20js%20%E2%80%94%20which%20should%20i%20use%3F\"><h3>What's the difference between Delay JS and Defer JS \u2014 which should I use?<\/h3><\/dt>\n<dd><p>Defer keeps scripts in order but runs them after HTML parsing; it is the safer choice and rarely breaks anything. Delay goes further, holding scripts until the first user interaction (scroll, tap, move) for the biggest INP and blocking-time win, at a slightly higher chance of needing exclusions. Start with Defer if you're cautious, or Delay (jQuery excluded by default) for maximum speed, and add any problem script to the exclusion list.<\/p><\/dd>\n<dt id=\"does%20delay%20javascript%20break%20google%20analytics%2C%20the%20facebook%20pixel%20or%20ads%3F\"><h3>Does Delay JavaScript break Google Analytics, the Facebook Pixel or ads?<\/h3><\/dt>\n<dd><p>Usually not. Delayed scripts run on the first interaction, so analytics and pixels still fire for engaged visitors. If you need a tag to load immediately \u2014 for example to measure bounces or run consent logic \u2014 add it to the Delay JS exclusion list and it will load normally.<\/p><\/dd>\n<dt id=\"my%20site%20looks%20broken%20after%20enabling%20remove%20unused%20css%20%E2%80%94%20how%20do%20i%20fix%20it%3F\"><h3>My site looks broken after enabling Remove Unused CSS \u2014 how do I fix it?<\/h3><\/dt>\n<dd><p>Add the affected stylesheet or CSS selector to the exclusion fields on the CSS tab and rebuild. Remove Unused CSS also learns JavaScript-generated classes (sliders, menus, tabs) automatically so their styles aren't stripped. To confirm it really is the cause, use the Debug Issues panel. To revert quickly, use Safe Mode on the Settings tab to return to a conservative baseline.<\/p><\/dd>\n<dt id=\"how%20do%20i%20exclude%20a%20page%20from%20caching%2C%20or%20a%20script%20from%20delay%20js%3F\"><h3>How do I exclude a page from caching, or a script from Delay JS?<\/h3><\/dt>\n<dd><p>Use the exclusion fields on each tab \u2014 the Cache tab has URL and cookie exclusions for pages you never want cached, and the JavaScript tab lets you exclude scripts by name or URL from Delay\/Defer. For a one-off test, the Debug Issues panel builds the right link for you; you can also append <code>?nocache<\/code>, <code>?nodelayjs<\/code>, <code>?norucss<\/code> or <code>?nooptimize<\/code> to any front-end URL by hand to disable that feature for that single request.<\/p><\/dd>\n<dt id=\"does%20it%20minify%20and%20combine%20css%20and%20javascript%3F\"><h3>Does it minify and combine CSS and JavaScript?<\/h3><\/dt>\n<dd><p>It minifies your local CSS and JS (caching each file on disk and processing it once). It does not force-combine files into one \u2014 under HTTP\/2 and HTTP\/3 that usually no longer helps and can hurt caching \u2014 so Easy Optimizer focuses on minification, delay\/defer and removing unused CSS instead.<\/p><\/dd>\n<dt id=\"do%20i%20need%20a%20cdn%20to%20use%20easy%20optimizer%3F\"><h3>Do I need a CDN to use Easy Optimizer?<\/h3><\/dt>\n<dd><p>No. Every core feature works without a CDN. If you want next-gen image delivery you can optionally enable the built-in Image CDN (WebP\/AVIF), and you can connect Cloudflare for edge-cache purging \u2014 but neither is required.<\/p><\/dd>\n<dt id=\"will%20it%20slow%20down%20my%20wp-admin%20dashboard%3F\"><h3>Will it slow down my wp-admin dashboard?<\/h3><\/dt>\n<dd><p>No. Optimization features run on your front end, and modules you don't enable are never loaded, so your admin stays responsive. The Backend Analyzer's profiling is on-demand and never runs for real visitors.<\/p><\/dd>\n<dt id=\"what%27s%20the%20best%20starting%20configuration%20to%20improve%20my%20pagespeed%20%2F%20core%20web%20vitals%20score%3F\"><h3>What's the best starting configuration to improve my PageSpeed \/ Core Web Vitals score?<\/h3><\/dt>\n<dd><p>Enable Page Cache, Remove Unused CSS, Delay or Defer JavaScript, Lazy Load, LCP Preload and Font Display Swap, then turn on the accessibility and SEO toggles relevant to your site. Save and re-run the built-in speed test to compare before and after. The dashboard's \"What to fix next\" card then lists what is still worth changing, ranked by impact, so you don't have to guess. If you used the setup wizard, the Balanced preset already enables most of these.<\/p><\/dd>\n<dt id=\"which%20preset%20and%20preload%20speed%20should%20i%20use%20for%20my%20hosting%3F\"><h3>Which preset and preload speed should I use for my hosting?<\/h3><\/dt>\n<dd><p>As a rule of thumb \u2014 shared hosting: the Safe wizard preset with the Gentle preload speed; most sites and managed hosting: Balanced; VPS or high-performance managed hosting: Maximum with the Turbo (or Balanced) preload speed. Preload also auto-tunes to your server's real capacity and backs off automatically if it detects errors or rate-limiting, so you can't overload your host.<\/p><\/dd>\n<dt id=\"do%20i%20need%20redis%2C%20and%20does%20it%20work%20without%20the%20php%20extension%3F\"><h3>Do I need Redis, and does it work without the PHP extension?<\/h3><\/dt>\n<dd><p>The Object Cache module needs a running Redis server (many shared hosts ship the PhpRedis extension but no server \u2014 if the status panel shows \"not connected\", leave Object Cache off). You do not need a Redis PHP extension, though: the pure-PHP Predis client is bundled, so the object cache works without PhpRedis or Relay. Enter your host, port and password in the settings, or define <code>WP_REDIS_*<\/code> constants in <code>wp-config.php<\/code> and they'll be used automatically. Easy Optimizer never edits <code>wp-config.php<\/code>, and if another object-cache plugin is active it defers to it rather than overwriting its drop-in.<\/p><\/dd>\n<dt id=\"what%20do%20%22pages%20cached%22%20and%20%22urls%20in%20waiting%22%20actually%20count%3F\"><h3>What do \"Pages cached\" and \"URLs in waiting\" actually count?<\/h3><\/dt>\n<dd><p>Both count unique URLs, not files. With Separate Mobile Cache on, one page can have a desktop copy and a mobile copy on disk, but it is still one page in both figures. The two numbers are not meant to converge: a page whose desktop copy is cached while its mobile copy is still queued is legitimately counted in each at the same time.<\/p><\/dd>\n<dt id=\"can%20i%20use%20this%20with%20cloudflare%3F\"><h3>Can I use this with Cloudflare?<\/h3><\/dt>\n<dd><p>Yes. Add your API token and Zone ID in the Cloudflare tab. Cache purges sync automatically.<\/p><\/dd>\n<dt id=\"does%20it%20support%20multisite%3F\"><h3>Does it support multisite?<\/h3><\/dt>\n<dd><p>Works on individual sites within a multisite network.<\/p><\/dd>\n<dt id=\"how%20do%20i%20migrate%20settings%20between%20sites%3F\"><h3>How do I migrate settings between sites?<\/h3><\/dt>\n<dd><p>Export settings as JSON from the Settings tab, then import on the destination site. Credentials (Cloudflare token, Redis password, CDN key) are deliberately left out of the export, so re-enter those on the destination site.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20cache%20when%20i%20edit%20a%20post%20or%20product%3F\"><h3>What happens to my cache when I edit a post or product?<\/h3><\/dt>\n<dd><p>Editing content clears only the affected URLs \u2014 the post or product itself plus its archives, author, date and taxonomy pages (with pagination) \u2014 instead of wiping the whole cache, and changing a slug also clears the old URL. Comment and term edits trigger the same targeted, lightweight clears.<\/p><\/dd>\n<dt id=\"does%20easy%20optimizer%20collect%20any%20data%3F%20is%20it%20privacy-friendly%3F\"><h3>Does Easy Optimizer collect any data? Is it privacy-friendly?<\/h3><\/dt>\n<dd><p>The usage analytics are opt-in and off by default. When enabled they send only technical, non-personal data (plugin\/WordPress\/PHP versions, theme, locale, host flags and your site URL) \u2014 never your email, visitor IPs, user data or page content. With analytics left off, nothing is sent anywhere. See the Privacy and External Services sections for the full list.<\/p><\/dd>\n<dt id=\"how%20do%20i%20completely%20uninstall%20easy%20optimizer%20and%20remove%20all%20of%20its%20data%3F\"><h3>How do I completely uninstall Easy Optimizer and remove all of its data?<\/h3><\/dt>\n<dd><p>On the Settings tab, turn on \"Delete all plugin data on uninstall\" before deleting the plugin. With it on, removing the plugin cleans up its options, cache files, drop-ins and snapshots; with it off, your settings are preserved in case you reinstall.<\/p><\/dd>\n<dt id=\"is%20there%20a%20developer%20api%20for%20clearing%20the%20cache%3F\"><h3>Is there a developer API for clearing the cache?<\/h3><\/dt>\n<dd><p>Yes. You can trigger purges from your own code with these action hooks:<\/p>\n\n<pre><code>do_action( 'easyopt_purge_all' ); \u2014 clear the entire page cache.\ndo_action( 'easyopt_purge_url', 'https:\/\/example.com\/some-page\/' ); \u2014 clear one URL.\ndo_action( 'easyopt_purge_url_type', 'home' ); \u2014 clear a key page type (home, front or posts page).\n<\/code><\/pre>\n\n<p>The plugin also fires events you can listen to: <code>easyopt_cache_cleared_all<\/code>, <code>easyopt_cache_cleared_url<\/code> (passes the URL) and <code>easyopt_page_cached<\/code>. For Cloudflare, <code>EasyOpt_Cloudflare::purge_url( $url )<\/code> and <code>EasyOpt_Cloudflare::purge_all()<\/code> are available when the integration is connected.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.6.4<\/h4>\n\n<p><strong>Changed<\/strong>\n* Remove Unused CSS now uses a purpose-built, dependency-free CSS parser instead of a third-party library. Same results \u2014 the same rules are kept and dropped \u2014 but the plugin is about 2.4 MB smaller on disk, and generating Used CSS is dramatically faster and lighter (roughly 5\u00d7 faster and using a fraction of the memory on large stylesheets in testing), so cold page builds are quicker and far less likely to hit a host memory limit.\n* Page-builder per-page stylesheets (Elementor\/Divi) that are passed through untouched are now also minified \u2014 comments and redundant whitespace are stripped \u2014 without altering any rule, so builder CSS with JS-added classes keeps working exactly as before while the inlined Used CSS is a little smaller.<\/p>\n\n<p><strong>Fixed<\/strong>\n* <strong>A single malformed stylesheet can no longer break your whole layout.<\/strong> If any stylesheet contained an unbalanced block \u2014 most commonly an unclosed <code>@media<\/code> left by a typo in a page builder's \"Custom CSS\" box \u2014 the missing brace used to swallow every rule that followed it in the combined CSS, so large parts of the page (often the entire desktop layout) silently switched off. The generated CSS is now always structurally balanced, and an unterminated string can no longer run past its line, so one bad rule stays contained instead of taking the page down with it.\n* <strong>Native CSS nesting is now preserved.<\/strong> Rules written with modern CSS nesting (<code>.card { &amp; .btn { \u2026 } }<\/code>, <code>&amp;:hover<\/code>, nested <code>@media<\/code>) were being silently dropped by the previous parser; they are now kept correctly whenever their parent selector is kept.\n* Mis-encoded and truncated stylesheets are handled more robustly and can no longer cause the parser to bail out on invalid UTF-8.<\/p>\n\n<h4>2.6.3<\/h4>\n\n<p><strong>Fixed<\/strong>\n* Remove Unused CSS now handles modern CSS correctly. The stylesheet parser has been upgraded, resolving several cases where valid CSS was being silently dropped:\n    * <strong>CSS cascade layers (<code>@layer<\/code>)<\/strong> \u2014 rules inside <code>@layer { }<\/code> blocks (used by Bricks and a growing number of builders and themes) were being lost, along with everything after them. They are now kept, and unused rules inside a layer are still removed correctly.\n    * <strong><code>@scope<\/code>, <code>@starting-style<\/code> and <code>@container<\/code><\/strong> \u2014 these were dropped entirely and are now preserved.\n    * <strong>Modern colour and value syntax<\/strong> such as <code>rgb(1 2 3 \/ 50%)<\/code> is now parsed instead of discarded.\n    * Malformed stylesheets are handled more robustly \u2014 valid rules are recovered instead of large sections being lost.\n* The automatic \"after\" speed test never ran \u2014 on any site. After applying the Balanced or Maximum preset, Easy Optimizer schedules a one-off PageSpeed test 15 minutes later so the dashboard can show you a real before-and-after. That test was scheduled correctly but the code that runs it was only loaded during the page request that scheduled it, never during the later background request that actually fired. The scheduled test therefore ran into nothing, every time. The practical effect: unless you pressed \"Run speed test\" yourself, the \"After\" ring on your dashboard stayed empty and the improvement was never measured. The daily re-test could not help either, because it only refreshes an existing \"after\" score and so had nothing to start from.\n* <strong>WordPress 7.1<\/strong> keeps the toolbar on screen inside the Post and Site Editors, where it used to be hidden. That put \"Clear All Cache\" \u2014 a link that reloads the page \u2014 one click away while you are writing. It is no longer shown on those two screens. Everywhere else, including the classic editor, it is exactly where it was.\n* A failed automatic \"after\" test never tried again. The \"already done\" marker was written when the test was <em>scheduled<\/em> rather than when it succeeded, and it is never cleared \u2014 so a single network blip, PageSpeed error or timeout meant that site got no automatic \"after\" score ever again. It now retries, up to three times, then stops.<\/p>\n\n<p><strong>New<\/strong>\n* Smart Images allowance warnings now tell you <strong>how long<\/strong>, not just how much: \"About 6 days left at your current rate\". Shown only when there is enough history to work it out honestly \u2014 when there isn't, no figure is shown rather than a guess.\n* A short prompt asking for a review can now appear on the dashboard, and only after Easy Optimizer has measurably made your site faster \u2014 at least a 10-point mobile PageSpeed gain, with mobile above 70 and desktop above 80. It never appears if a test failed or is still running, it can be dismissed for 90 days, and there is nothing offered in exchange for a review.<\/p>\n\n<p><strong>Changed<\/strong>\n* The free Smart Images plan now covers <strong>500 images a month<\/strong>, up from 50. Existing free accounts are raised automatically \u2014 there is nothing to do.\n* Tested with WordPress 7.1.<\/p>\n\n<h4>2.6.2<\/h4>\n\n<p><strong>Fixed<\/strong>\n* Fatal error on Flywheel, and a latent one on WP Engine and other hardened hosts, that could take a site down completely \u2014 including wp-admin, so the plugin could not be deactivated from the dashboard. These hosts switch off a handful of PHP functions for security. Since PHP 8.0 a switched-off function is treated as one that does not exist at all, so calling it stops the page dead rather than being quietly ignored as it was on PHP 7. Every such call in the plugin is now checked before it is made.\n* Install and drop-in setup can no longer lock you out of your own dashboard. These steps write to disk and touch the server's PHP settings, which is the part of a site we cannot fully test for in advance, so any failure there is now caught and written to the debug log instead of stopping the page.\n* Cache purging no longer stops when page caching is switched off. The listeners that detect a content change were only registered when our own page cache was on, and they are the only thing that tells your host's cache and Cloudflare to purge. Turning our cache off therefore stopped those purges too, with nothing logged to say so \u2014 you could publish a post and the edge would keep serving the old copy until its own timer ran out. Theme switches were unaffected, which made it harder to spot.\n* Clearing the cache on Flywheel now does something, and tells you what it can't do. The previous code called a Flywheel function that does not exist, so every attempt silently failed. Flywheel provides no way to clear its server cache from WordPress \u2014 their own maintenance script only clears the object cache, which is what Easy Optimizer now does too. Their platform already refreshes pages by itself when you publish or edit content, so that part was never broken. For theme or CSS changes, the confirmation message now points you to your Flywheel dashboard rather than implying everything was cleared.\n* wp-config.php is now found on hosts that keep WordPress core and wp-content in separate directories \u2014 Flywheel is the common one. Previously \"Cache for Logged-in Users\" and page cache activation could silently do nothing on those hosts, with no error to explain it.<\/p>\n\n<p><strong>Changed<\/strong>\n* Optimization is now switched off for logged-in users unless <strong>Cache for Logged-in Users<\/strong> is enabled. It affects Delay JS, Defer JS, Minify CSS, Minify JS, Lazy load, Font optimization and Preconnect.<\/p>\n\n<p>Nothing changes for logged-out visitors. Cache preload is unaffected and keeps warming fully optimized pages. Developers can restore the old behaviour with <code>add_filter( 'easyopt_skip_for_logged_in', '__return_false' );<\/code>, or per feature via <code>easyopt_skip_for_logged_in_minify<\/code> and friends \u2014 useful on membership, LMS and community sites where most real traffic is logged in.\n* Delay JS and Defer JS previously skipped administrators only. They now follow the same rule as every other logged-in user, so what an editor sees matches what an administrator sees.\n* <code>?eopview<\/code> still shows an administrator the true visitor render, now covering all seven affected features.<\/p>\n\n<h4>2.6.1<\/h4>\n\n<p><strong>New<\/strong>\n* <strong>Cache Query String<\/strong> \u2014 a new box in Caching, next to Ignored Query Parameters. Ignoring a parameter makes every value share one cache file, which is what keeps campaign links fast. That is wrong for the minority of sites where the <em>server<\/em> renders the value into the page \u2014 a form that writes UTM values into hidden fields, or a plugin that varies content by <code>?ref=<\/code>. List those parameters here and each value gets its own cache file instead. Empty by default, so nothing changes unless you use it. Per-click identifiers (<code>gclid<\/code>, <code>fbclid<\/code>, <code>msclkid<\/code>, <code>_ga<\/code>\u2026) are refused: their values are unique per visitor, so keying on one would create a cache file per visit.\n* Three more parameters ignored by default for parity with other cache plugins: <code>gadid<\/code>, <code>fbadid<\/code>, <code>_ke<\/code>.<\/p>\n\n<p><strong>Fixed<\/strong>\n* The <code>easyopt_cache_strip_query_params<\/code> filter was applied by the plugin but not when generating the <code>advanced-cache.php<\/code> drop-in \u2014 and the drop-in is what serves the page. Filtering a parameter out of the ignore list therefore did nothing at all, with no error to explain it; filtering one in cost a full WordPress boot on every matching URL. Both serve paths now build the list identically.\n* Installing a cookie-based multilingual plugin (Polylang, WPML) on a site that was already caching could serve the pre-existing single-language page to every visitor, in every language, indefinitely \u2014 the drop-in's copy of the cache-key settings was only refreshed when an Easy Optimizer setting was saved. It is now refreshed, and the cache purged, whenever any plugin is activated or deactivated.\n* Nginx snippet no longer emits the mobile rule when Separate Mobile Cache is off \u2014 mobile visitors were being routed to a file that is never written and losing the fast path.\n* Apache rules now skip requests carrying a non-standard port. <code>%{HTTP_HOST}<\/code> keeps the port but the cache writer strips it, so the rule silently never matched; those requests are served by PHP instead, which is correct.\n* Cache directories are no longer created from an unrecognised <code>Host<\/code> header, which could be rotated to fill the cache folder with junk directories.<\/p>\n\n<p><strong>Security<\/strong>\n* CDN credentials (signing key, salt, account token, licence key) moved out of the main settings row into their own storage that is not loaded on every request. They were previously included in the settings payload sent to the admin screen and in Settings Export files.\n* Image URLs containing <code>\\<\/code> or <code>@<\/code> in the hostname are no longer signed. The CDN edge and the image server resolved such a hostname differently, so a crafted URL could be authorised as your domain while fetching from somewhere else.<\/p>\n\n<h4>2.6.0<\/h4>\n\n<p><strong>New<\/strong>\n* Debug Issues panel \u2014 find which optimization is breaking a page in a couple of clicks, without changing settings, clearing the cache or opening a private window.\n* \"What to fix next\" dashboard card \u2014 your PageSpeed findings as a ranked to-do list, each mapped to the setting that fixes it. Replaces the old read-only feature-status list.\n* Setup wizard now checks your site first and leaves off any feature another plugin or your host already handles, with the reason shown.\n* GoDaddy Managed WordPress: Varnish and CDN cache are now cleared per page as content changes.\n* <code>define( 'EASYOPT_PROFILE_BUFFER', true );<\/code> logs per-page optimization time and memory use.<\/p>\n\n<p><strong>Security<\/strong>\n* Fixed: cache preload requests are now cryptographically signed. <code>?eopreload=1<\/code> was unauthenticated, so anyone could force a full uncached render \u2014 the most expensive request a site can serve \u2014 with no rate limit.\n* Fixed: the Core Web Vitals beacon token is now tied to the page it was issued for.\n* Fixed: Easy Optimizer no longer replaces the <code>advanced-cache.php<\/code> drop-in of another active caching plugin, which previously disabled that plugin's caching silently.\n* Fixed: cached pages now declare what they vary on, so a CDN can no longer serve one visitor's variant (device, role, currency) to everyone.\n* Fixed: exported settings no longer contain your Cloudflare token, Redis credentials or CDN key.<\/p>\n\n<p><strong>Fixed<\/strong>\n* Page cache was never served on hosts where the drop-in cannot be installed (Pantheon, read-only filesystems) \u2014 those sites paid the cost of caching with none of the benefit.\n* Cache file paths are now built by one shared routine, ending permanent cache misses for URLs the drop-in and the plugin disagreed about.\n* \"Pages cached\" now counts unique URLs accurately. It could previously drift in both directions \u2014 a page first cached on mobile never counted, role- and currency-keyed copies over-counted, and editing a post subtracted from the total even when nothing was on disk.\n* Preload status could stay on \"running\" forever on sites that never ran a manual preload.\n* Preload no longer re-warms the whole site on every run when Gzip is off or on OpenLiteSpeed.\n* Remove Unused CSS could crash a page on hosts that lock <code>memory_limit<\/code>; it now checks before raising it.\n* Remove Unused CSS builds no longer queue ahead of the preload crawl and interrupt it.\n* The Gzip toggle now really stops compressed copies being created and served; pre-compressed files are no longer served on OpenLiteSpeed, which compresses natively.\n* Delay JavaScript no longer delays <code>&lt;script type=\"module\"&gt;<\/code>, which broke Interactivity API blocks until the first click.\n* Safe Mode can now switch minification off.\n* Debug switches (<code>?nooptimize<\/code> and friends) can no longer be silently disabled by adding them to the strip-query-parameters list.\n* Activating the plugin during a bulk activation no longer leaves it switched off with no route back to the wizard.<\/p>\n\n<p><strong>Improved<\/strong>\n* Conflict notices now name the other plugin, link to your Plugins screen, and offer \"keep both\". The two-page-caches warning is a notice, not an error.\n* Conflict detection extended to 20+ further plugins, and to fonts (OMGF, Perfmatters) for the first time.\n* Preload no longer starves small servers, backs off much sooner under strain, and works without Redis on far more hosts.\n* Disabled modules are no longer loaded on front-end page views (~300KB of PHP per request).<\/p>\n\n<p><strong>For developers<\/strong>\n* Added: <code>EasyOpt_Preflight::scan()<\/code>, REST route <code>easyopt\/v1\/wizard\/preflight<\/code>, filter <code>easyopt_preflight_scan<\/code>.\n* Added: filters <code>easyopt_defer_used_css_generation<\/code>, <code>easyopt_font_conflicts<\/code>, <code>easyopt_lazyload_conflicts<\/code>, <code>easyopt_preload_latency_ceiling_ms<\/code>, <code>easyopt_beacon_accept_legacy_token<\/code>, <code>easyopt_preset_map<\/code>, <code>easyopt_secret_setting_keys<\/code>, <code>easyopt_used_css_memory_multiplier<\/code>, <code>easyopt_reconcile_pages_throttle<\/code>.\n* Added: <code>EasyOpt\\Cache\\path_segment()<\/code> \/ <code>path_segments()<\/code> \u2014 the shared cache-path builder.\n* Added: <code>EasyOpt_Cache::get_reserved_query_params()<\/code>; <code>EasyOpt_Cache::current_request_url()<\/code> is now public.\n* Note: beacon tokens issued by 2.5.x are accepted for this release only. Filter <code>easyopt_beacon_accept_legacy_token<\/code> to <code>__return_false<\/code> to enforce the new binding immediately.<\/p>\n\n<h4>2.5.6<\/h4>\n\n<ul>\n<li>Fixed: Smart Lazyload Fonts and Smart Preload Fonts had no effect on mobile. The above-the-fold font data was collected and saved correctly, but the mobile page render looked for it under the wrong name, so every font was kept. Desktop was unaffected.<\/li>\n<li>Fixed: robots.txt, llms.txt and other plain-text files inherited a 30-day browser-cache lifetime, which could keep a regenerated llms.txt hidden from search engines and AI crawlers for weeks. They now use a 5-minute lifetime.<\/li>\n<li>Fixed: automatic preconnect no longer opens a connection to gmpg.org and other domains that are only referenced in metadata links (rel=\"profile\", rel=\"me\", rel=\"alternate\"). Those handshakes were wasted and used up hint slots that real font and CDN origins needed.<\/li>\n<li>Changed: preconnect hints no longer emit a duplicate dns-prefetch tag for the same origin \u2014 every current browser honours preconnect, which already includes the DNS lookup.<\/li>\n<\/ul>\n\n<h4>2.5.5<\/h4>\n\n<ul>\n<li>Fixed: on OpenLiteSpeed, cached pages could download instead of display. Cached pages are now written in a format every server can serve.<\/li>\n<li>Fixed: preload no longer pauses with a false \"server busy\" message on shared hosting. It now paces itself using your site's own response times.<\/li>\n<li>Fixed: firewall-blocked requests (Sucuri and similar) are retried with backoff instead of being marked failed, and the speed test no longer hangs when a firewall blocks WordPress cron.<\/li>\n<li>Fixed: cached Used CSS files are no longer re-checked with the server on every page view.<\/li>\n<li>Fixed: cookie-based multilingual sites (Polylang \/ WPML) no longer serve a cached page in the wrong language.<\/li>\n<li>Fixed: images inside  could stay blank when a slider or Ajax filter duplicated them.<\/li>\n<li>Fixed: sitemaps and feeds no longer enter the preload queue, and \"Log Warnings\" now takes effect immediately.<\/li>\n<li>New: Browser-native lazy load (on by default) \u2014 images use the browser's built-in lazy loading, so they start downloading sooner and most pages ship no lazy-load script. Iframes keep the JavaScript method to hold back heavy embeds. Turn it off if your theme styles the .lazyload classes.<\/li>\n<li>New: Preconnect to External Origins (on by default) \u2014 connects early to Google Fonts, CDNs and similar so their files start loading sooner.<\/li>\n<li>New: optional Nginx server rules, shown under Advanced in the Caching tab for servers without .htaccess.<\/li>\n<li>Improved: WooCommerce shoppers now keep getting cached pages after adding to cart. Previously the whole session browsed uncached. Pages carrying a WooCommerce notice are still never cached.<\/li>\n<li>Improved: many more tracking parameters (Klaviyo, Marketo, ConvertKit, MailerLite, Omnisend, LinkedIn, Reddit, Snapchat, HubSpot Ads and others) no longer bust the cache, so email and ad campaign landing pages are served from cache.<\/li>\n<li>Improved: video posters now paint immediately instead of waiting for JavaScript, and muted autoplay videos start reliably.<\/li>\n<li>Improved: \"Exclude First N Images\" now defaults to 1.<\/li>\n<\/ul>\n\n<p>Diagnostics (still strictly opt-in):\n* Privacy: diagnostics no longer send your theme name, site language, or multisite flag. Data sent is limited to: site URL, an anonymous site identifier, plugin\/WordPress\/PHP versions, server type, hosting provider, enabled features, and anonymous error codes.\n* New: optional one-click feedback when deactivating the plugin. If diagnostics are off, submitting sends a single message (your reason, plugin version, and site URL \u2014 nothing else); skipping sends nothing.\n* New: Smart Images connection health reporting so delivery problems (SSL, host firewall, quota) can be diagnosed and fixed faster.\n* Improved: feature usage flags now distinguish settings you chose from shipped defaults.\n* Improved: version updates report immediately instead of at the next weekly check.\n* Fixed: re-activating the plugin no longer stopped the weekly diagnostics schedule; saving settings repeatedly no longer re-sends activation diagnostics.<\/p>\n\n<h4>2.5.4<\/h4>\n\n<p>Performance release \u2014 no feature changes, no settings changes.<\/p>\n\n<ul>\n<li>Page cache: content-change purges (post saves, comments, terms, WooCommerce stock updates) are now deduplicated and run after the response is sent \u2014 checkout and editor requests no longer wait on purge I\/O.<\/li>\n<li>Page cache: anonymous visitors skip user resolution on the serve path; exclusion lists parse once per request; cache-file gzip level is now filterable (easyopt_cache_gzip_level, default 4).<\/li>\n<li>Minify: cache keys derive from file size+mtime instead of re-hashing every source file on every render.<\/li>\n<li>Remove Unused CSS: the font- and CDN-transformed critical CSS is cached per context (used.final.css) instead of re-transforming on every render; safelist matching is precompiled (large builds up to 5x faster).<\/li>\n<li>FluxCDN: image URL signing is memoized per request; license\/maintenance checks moved off admin page loads into background cron.<\/li>\n<li>Lazy Load: image dimensions persist across requests (no repeated disk reads); WooCommerce product-gallery images are excluded so gallery zoom always initializes correctly.<\/li>\n<li>Preload: warm tasks carry their post ID (no reverse URL lookups); permalink collection primes caches in batches; the speed governor reads shared state far less often; Turbo\/Auto modes ramp faster on healthy servers.<\/li>\n<li>Queue: the per-minute watchdog exits after one option read when the queue is idle.<\/li>\n<li>Object cache drop-in: wp_cache_get_multiple uses one Redis MGET round-trip; add() uses atomic SET NX; batch set\/delete are pipelined.<\/li>\n<li>Database cleanup: bulk deletions no longer trigger per-row cache purges; transient wipes stay coherent with Redis; chunked runs skip redundant count queries.<\/li>\n<li>Cloudflare: Free\/Pro\/Business zones no longer pay a doomed tag-purge API call before every full purge.<\/li>\n<li>Debug log: log lines buffer per request and flush once at shutdown.<\/li>\n<li>Many further micro-optimizations across schema checks, option reads, and cron scheduling.<\/li>\n<\/ul>\n\n<h4>2.5.3<\/h4>\n\n<ul>\n<li>New: Image Optimization \u2014 FluxPress CDN, a built-in image CDN that converts your images to next-gen formats (AVIF\/WebP) on the fly, resizes them per device, compresses them, and serves them from a global edge network. Nothing is uploaded and your original files are never modified.<\/li>\n<li>New: Smart quality \u2014 automatically picks the best quality per browser and format (AVIF\/WebP\/JPEG), or set a fixed quality manually.<\/li>\n<li>New: Real-time delivery for , srcset, \/ (including existing WebP files), inline and shorthand CSS backgrounds, Used CSS backgrounds, and Elementor background images.<\/li>\n<li>Improved: automatic fallback to the original image if a delivered image can't load, so images never appear broken.<\/li>\n<li>Improved: graceful degradation everywhere \u2014 no license, an invalid license, or an unreachable CDN simply serves your original images.<\/li>\n<li>New: cache for logged-in users now works \u2014 pages are cached per user role (per-user via the <code>easyopt_cache_logged_in_per_user<\/code> filter; restrict roles via <code>easyopt_cache_logged_in_roles<\/code>).<\/li>\n<li>New: Cron Events tool shows times in your site's timezone, marks overdue events, and Run now executes AND reschedules the event; a heartbeat line shows when background jobs last ran.<\/li>\n<li>Fixed: Object Cache drop-in installation on PHP-FPM hosts (e.g. xCloud) \u2014 syntax validation now runs in-process, and installs are atomic so a failed check never removes a working drop-in.<\/li>\n<li>Fixed: Redis ACL credentials in the xCloud format (<code>WP_REDIS_PASSWORD<\/code> as <code>[username, password]<\/code>) are now supported in the connection tester and the drop-in.<\/li>\n<li>Improved: the WP-Cron warning recognizes real system crons (constant, filter, permanent dismissal, and automatic detection when background jobs run).<\/li>\n<li>Improved: admin notices now have a real \"Don't show again\" that persists \u2014 and returns only if the situation changes.<\/li>\n<li>Improved: the Image tab is now \"Smart Images\" with clearer connection status, including SSL-provisioning state.<\/li>\n<\/ul>\n\n<h4>2.5.2<\/h4>\n\n<ul>\n<li>Fix: Remove Unused CSS: Fixed missing styles when using shared Used CSS across different template variants of the same post type. Shared CSS now updates automatically as new layouts are encountered.<\/li>\n<li>Fix: LCP Optimization: Correctly de-lazifies the detected LCP image when lazysizes-style lazy loading is used, improving LCP.<\/li>\n<li>Fix: Prevented blank pages on very large pages by improving PCRE handling and adding safeguards against incomplete HTML output.<\/li>\n<li>Fix: Lazy Load: Reduced unnecessary resize events triggered by lazysizes, preventing layout flickering in some themes and plugins.<\/li>\n<li>Change: Lazy-loaded iframes without dimensions now reserve a 16:9 placeholder to reduce layout shifts.<\/li>\n<li>Internal: Bumped the CSS logic version so existing Used CSS files regenerate once with the updated logic.<\/li>\n<\/ul>\n\n<h4>2.5.1<\/h4>\n\n<ul>\n<li>Fix: Remove Unused CSS \u2014 Elementor entrance and hover animations (e.g. zoomInUp) no longer break. Animation names declared only in Elementor's data-settings JSON (added to elements by JavaScript on scroll) are now detected server-side and their CSS rules kept, per page. Pages that declare no animations keep nothing extra. Also safelisted the animated-slow, animated-fast and elementor-invisible helper classes so animated elements can never be left stuck invisible.<\/li>\n<li>New: Object Cache \u2014 Username field for Redis 6+ ACL hosts (e.g. Cloudways). Works with ACL, password-only, and no-auth servers.<\/li>\n<li>New: Object Cache \u2014 reads host-provisioned WP_REDIS_CONFIG arrays (Object Cache Pro format used by Cloudways and other managed hosts), so connection details including the assigned database number are picked up automatically.<\/li>\n<li>New: Object Cache \u2014 TLS (rediss:\/\/) support for managed Redis providers, and unix socket support (enter the socket path in the Host field).<\/li>\n<li>New: Object Cache \u2014 settings page shows which connection values are managed by wp-config.php constants or WP_REDIS_CONFIG.<\/li>\n<li>Improved: Object Cache \u2014 connection errors are now diagnosed precisely: authentication required, wrong credentials, missing ACL permission, invalid database number, server starting up, and no-server-running each get their own actionable guidance instead of a generic \"no Redis server\" message.<\/li>\n<li>Improved: Object Cache \u2014 Test Connection also works with the bundled Predis client when no PHP Redis extension is installed, and reports the same precise diagnostics.<\/li>\n<li>Improved: Object Cache \u2014 changing the database or key prefix flushes the old location so no orphaned keys are left behind (flushes remain prefix-scoped; FLUSHDB is never issued).<\/li>\n<\/ul>\n\n<h4>2.5.0<\/h4>\n\n<p>Major release combining all changes since 2.4.2.<\/p>\n\n<ul>\n<li>New: Object Cache module (Performance \u2192 Object Cache) \u2014 one-click persistent Redis cache (Relay\/PhpRedis\/Predis, Predis bundled) that speeds up database-heavy, logged-in and WooCommerce pages. Status panel with flush\/test buttons; never touches another plugin's drop-in and falls back safely if Redis is unreachable.<\/li>\n<li>New: Adaptive preload speed \u2014 warm-up auto-tunes its crawl rate to your server's capacity (honouring Retry-After) with Gentle \/ Balanced \/ Turbo envelopes, and warms pages in priority order: homepage, menu links, posts\/pages\/products, then archives.<\/li>\n<li>New: Preload Fonts preloads the above-the-fold fonts each page actually uses (stored per device), and Remove Unused CSS now keeps JavaScript-generated classes (sliders, tabs, AJAX content) instead of stripping them.<\/li>\n<li>Improved: LCP preload is now per-URL and covers background-image,  and CSS image-set heroes with responsive sources, plus a fallback for older browsers; decorative videos are no longer preloaded as the LCP image.<\/li>\n<li>Improved: Image CDN now rewrites responsive srcset so every image size is served from the CDN; link prefetch adds a real per-second rate cap, an automatic slow-down on a struggling server, and skips download\/external\/nofollow and nonce-bearing links.<\/li>\n<li>Improved: Warm-up transfers far less data per request and uses a real browser identity so host bot\/security rules don't block it; Delay\/Defer\/Minify now protect literal markup inside &lt;textarea&gt;, &lt;pre&gt;, &lt;code&gt;, &lt;svg&gt; and &lt;noscript&gt;.<\/li>\n<li>Fix: Preloading now works on hosts with a server-level cache (WPX, Varnish\/LiteSpeed\/nginx FastCGI) \u2014 previously the counter advanced but no pages were written. <\/li>\n<li>Fix: Redirected URLs are never cached under their original address, while harmless same-page redirects (trailing slash, HTTP\u2192HTTPS, www) are still warmed correctly; pages that opt out of caching, password-protected posts, and search\/preview pages are always served fresh.<\/li>\n<li>Fix: On-visit caching no longer disables itself on server-cache hosts and keeps optimization running when the page cache is off; WooCommerce variable\/grouped\/external products clear their Used CSS correctly.<\/li>\n<li>Fix: URLs merely containing \"sitemap\", \"cart\", \"checkout\" or \"my-account\" (e.g. \/our-sitemap-guide\/) are no longer wrongly excluded from caching.<\/li>\n<\/ul>\n\n<h4>2.4.2<\/h4>\n\n<ul>\n<li>Fixed: PHP open_basedir warnings on restricted hosts (CloudLinux, GridPane, RunCloud, Cloudways) \u2014 hosting-detection no longer probes paths outside the allowed directories.<\/li>\n<li>Improved: Conflict notices are now feature-aware. Easy Optimizer only warns about another page-cache plugin when its own Page Cache is enabled, and only warns about an overlapping feature (delay JS, CSS\/JS, lazy load, prefetch) when you actually have that feature on \u2014 so you can run it alongside other plugins for the tools you want without being told to deactivate anything.<\/li>\n<li>Fixed: Perfmatters was not being detected for feature-overlap notices (wrong plugin path).<\/li>\n<\/ul>\n\n<h4>2.4.1<\/h4>\n\n<ul>\n<li>New: Backend Analyzer now measures each plugin and theme's own code precisely (per-callback timing) and groups results by plugin\/theme \u2014 one row per plugin showing the total time it added, click to see its steps. No more blaming the theme for other plugins' or WordPress's work.<\/li>\n<li>New: Time spent inside WordPress itself (templates, options, database) is shown as its own \"Page render \/ WordPress core\" row instead of being mislabelled.<\/li>\n<li>Improved: Each test now shows the average of its runs and replaces the previous result, so re-testing a page no longer inflates the numbers.<\/li>\n<li>Improved: Profiling falls back automatically to your browser when a host blocks the server's background request, and waits for the feature to finish saving before testing (fixes an occasional \"couldn't start profiling\").<\/li>\n<li>New: Developer hooks for clearing the cache from your own code \u2014 easyopt_purge_all, easyopt_purge_url and easyopt_purge_url_type (see FAQ).<\/li>\n<li>Improved: Clearer guidance on using Easy Optimizer alongside other performance plugins (WP Rocket, FlyingPress, Perfmatters, LiteSpeed Cache and more).<\/li>\n<li>Added: Donation link for those who'd like to support development.<\/li>\n<\/ul>\n\n<h4>2.4.0<\/h4>\n\n<ul>\n<li>New: Dashboard speed test \u2014 Google PageSpeed score before vs after, mobile and desktop, with Core Web Vitals.<\/li>\n<li>New: Backend Analyzer \u2014 find slow plugins, themes and database queries by profiling any page or admin URL.<\/li>\n<li>Fix: admin toolbar menu missing in wp-admin (Clear All Cache \/ Used CSS \/ LCP) \u2014 restored.<\/li>\n<li>Fix: blank admin panel when another plugin loads React (\"Identifier 'React' has already been declared\").<\/li>\n<li>Fix: autoload options disabled on WordPress 6.6+ now show correctly with a working Enable button.<\/li>\n<li>New: optional Cloudways hosting recommendation when a slow score is detected on non-Cloudways sites.<\/li>\n<li>Fix: cookie-keyed cache variants (currency\/language switchers) could be served the wrong variant in .htaccess mode \u2014 rewrite serving now auto-falls back to drop-in\/PHP when variant cookies are registered<\/li>\n<li>Fix: page-builder template and reusable-block saves no longer trigger repeated full cache purges \u2014 purges are debounced and coalesced (max one per minute, nothing skipped)<\/li>\n<li>Fix: settings import now runs through the full save pipeline (drop-in, .htaccess and cache are refreshed immediately)<\/li>\n<li>Fix: permalinks containing \".xml\"\/\".txt\" in the slug were wrongly excluded from drop-in cache serving<\/li>\n<li>Fix: HEAD requests are now served from cache in PHP mode (headers only) instead of booting WordPress<\/li>\n<li>Fix: cached page counter self-seeds and falls back to a real scan on fresh installs<\/li>\n<li>Fix: theme-switch now also clears remote-CSS fetch transients<\/li>\n<li>Fix: uninstall cleans up site transients and no longer deletes data by default on installs that never saved settings<\/li>\n<li>New: per-site drop-in configuration on multisite \u2014 every network site is served with its own settings<\/li>\n<li>New: unused-asset garbage collection \u2014 minified\/inline\/used-CSS files not referenced by any render in 30 days are removed daily<\/li>\n<li>New: Cloudflare per-URL purges are batched, deduplicated and capped per request (large bursts escalate to one zone purge)<\/li>\n<li>Improved: database autoload toggle uses the WordPress 6.4+ core API and recognises WP 6.6+ autoload values<\/li>\n<li>Improved: cache engine split into focused modules with shared serve logic between runtime and drop-in; classmap autoloader added<\/li>\n<li>Multisite: .htaccess rewrite mode safely disabled (shared root file); full-clear site scan is now cached<\/li>\n<\/ul>\n\n<h4>2.3.2<\/h4>\n\n<ul>\n<li>Fixed: Astra: .ast-header-break-point styles are now excluded from desktop Used CSS (kept on mobile; skipped when Separate Mobile Cache is off).<\/li>\n<li>Fixed:  &hellip;<\/li>\n<\/ul>","raw_excerpt":"All-in-one speed plugin: page cache, unused CSS, delay JS, lazy load, LCP preload, WebP &amp; Core Web Vitals. Free, no premium-locked features.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/da.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/167932","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/da.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/da.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/da.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=167932"}],"author":[{"embeddable":true,"href":"https:\/\/da.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/easywpstuff"}],"wp:attachment":[{"href":"https:\/\/da.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=167932"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/da.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=167932"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/da.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=167932"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/da.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=167932"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/da.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=167932"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/da.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=167932"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}