Easy Optimizer – Speed, Cache, Unused CSS, Delay JS, Lazy Load, LCP & Core Web Vitals

Changelog

2.4.1

  • New: Backend Analyzer now measures each plugin and theme’s own code precisely (per-callback timing) and groups results by plugin/theme — 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.
  • New: Time spent inside WordPress itself (templates, options, database) is shown as its own “Page render / WordPress core” row instead of being mislabelled.
  • 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.
  • 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”).
  • New: Developer hooks for clearing the cache from your own code — easyopt_purge_all, easyopt_purge_url and easyopt_purge_url_type (see FAQ).
  • Improved: Clearer guidance on using Easy Optimizer alongside other performance plugins (WP Rocket, FlyingPress, Perfmatters, LiteSpeed Cache and more).
  • Added: Donation link for those who’d like to support development.

2.4.0

  • New: Dashboard speed test — Google PageSpeed score before vs after, mobile and desktop, with Core Web Vitals.
  • New: Backend Analyzer — find slow plugins, themes and database queries by profiling any page or admin URL.
  • Fix: admin toolbar menu missing in wp-admin (Clear All Cache / Used CSS / LCP) — restored.
  • Fix: blank admin panel when another plugin loads React (“Identifier ‘React’ has already been declared”).
  • Fix: autoload options disabled on WordPress 6.6+ now show correctly with a working Enable button.
  • New: optional Cloudways hosting recommendation when a slow score is detected on non-Cloudways sites.
  • Fix: cookie-keyed cache variants (currency/language switchers) could be served the wrong variant in .htaccess mode — rewrite serving now auto-falls back to drop-in/PHP when variant cookies are registered
  • Fix: page-builder template and reusable-block saves no longer trigger repeated full cache purges — purges are debounced and coalesced (max one per minute, nothing skipped)
  • Fix: settings import now runs through the full save pipeline (drop-in, .htaccess and cache are refreshed immediately)
  • Fix: permalinks containing “.xml”/”.txt” in the slug were wrongly excluded from drop-in cache serving
  • Fix: HEAD requests are now served from cache in PHP mode (headers only) instead of booting WordPress
  • Fix: cached page counter self-seeds and falls back to a real scan on fresh installs
  • Fix: theme-switch now also clears remote-CSS fetch transients
  • Fix: uninstall cleans up site transients and no longer deletes data by default on installs that never saved settings
  • New: per-site drop-in configuration on multisite — every network site is served with its own settings
  • New: unused-asset garbage collection — minified/inline/used-CSS files not referenced by any render in 30 days are removed daily
  • New: Cloudflare per-URL purges are batched, deduplicated and capped per request (large bursts escalate to one zone purge)
  • Improved: database autoload toggle uses the WordPress 6.4+ core API and recognises WP 6.6+ autoload values
  • Improved: cache engine split into focused modules with shared serve logic between runtime and drop-in; classmap autoloader added
  • Multisite: .htaccess rewrite mode safely disabled (shared root file); full-clear site scan is now cached

2.3.2

Fixed – Astra: .ast-header-break-point styles are now excluded from desktop Used CSS (kept on mobile; skipped when Separate Mobile Cache is off).
Fixed – Queue table bloat on large sites — failed and orphaned rows are now auto-cleaned and disk space reclaimed, preventing unbounded growth.
Improved – Added a daily queue cleanup, a cleanup index, and a one-time table optimization on upgrade.
Improved – Cache invalidation overhaul. Editing a post now clears just the affected URLs (the post, its archives, author, date and taxonomy pages, with pagination) instead of needing a full flush, and a changed slug also clears the old URL.
Improved – Comment actions (new comment, approve, spam, edit) now clear only that post’s page instead of the whole cache.
Improved – Taxonomy term, author profile and media edits now trigger targeted, lightweight cache clears.
Improved – Multisite: clearing the cache now affects only the current site, never the rest of the network.
Improved – WooCommerce: cart, checkout and account pages are reliably kept out of the cache, including custom or translated page slugs.
Improved – WooCommerce: multi-currency stores (CURCY, WPML/WCML, Aelia, WOOCS) now cache a correct copy per selected currency.
Improved – Simplified the admin-bar menu to three focused actions: Clear Page Cache, Clear Used CSS and Clear LCP Images for the current page.
Improved – Minified the link-prefetch and LCP beacon scripts for a smaller front-end footprint.

New – Added a “noojs” body class (removed automatically once JavaScript runs) so themes can style the pre-JS / delayed-JS state. Hardened against themes and plugins with duplicate or malformed output.

Fixed – HEAD requests no longer return the page body on a cache hit.
Fixed – Removed unused/dead code in the WooCommerce and caching layers.

2.3.0

  • Added: first-run setup wizard. On a new install, nothing is enabled until you choose one of three presets — Safe (cache, browser caching, gzip, font-display swap, LCP preload, lazy load, cache preload, moderate prefetch), Balanced (adds Remove Unused CSS in Async mode, Delay JS with jQuery excluded, and add-missing-image-dimensions), or Maximum (Used CSS in Delay mode, Delay JS including jQuery, lazy-load fonts). Existing sites keep their settings and are not shown the wizard.
  • Added: Minify CSS and Minify JavaScript. Each minifies local files only, caches the result on disk, and processes a given file just once, so the per-request cost stays minimal. Already-minified files are skipped, relative url()/@import paths inside CSS are rewritten so assets keep resolving, and the Delay-JS loader and lazy-load runtime are never touched. Minify reuses the existing Exclude Stylesheets / Exclude Scripts fields and works independently of Remove Unused CSS and Delay JS.
  • Added: Safe Mode button (Settings tab) that instantly reverts to the conservative Safe preset and turns off the riskier features — a one-click known-good baseline for troubleshooting.
  • Added: query-string debug switches. Append ?nooptimize, ?nocache, ?nodelayjs, or ?norucss to any front-end URL to disable that feature for a single request without changing settings (the switched request is never cached, so you always see fresh output). Instructions are shown on the Settings tab.
  • Fixed: Remove Unused CSS now has a fail-safe — original stylesheets are only delayed/async’d/removed after a valid Used CSS file has been generated and passes a confidence check (minimum size, real rule blocks, at least one stylesheet processed). If generation comes up empty or low-confidence, the page is served with its original styling untouched and is not cached, preventing rare unstyled-page output.
  • Changed: the diagnostics opt-in is now requested in the setup wizard (and remains toggleable later), so the separate opt-in admin notice has been removed.

2.2.2

  • Fixed: cached page count could repeatedly drop back to near-zero while the preload queue stayed at hundreds/thousands of URLs. Recording a page’s LCP element no longer wipes the entire cache and restarts the whole preload crawl — it now refreshes only the affected page. This removes a self-perpetuating clear → re-preload loop that prevented the cache from ever filling on some sites.
  • Fixed: lazily-expired cached pages now adjust the page counter correctly, so the dashboard count no longer drifts upward after TTL expiry.
  • Improved: cached files are written atomically (temporary file + rename) so a concurrent visitor can never receive a half-written page under load.
  • Improved: Apache-served cache files always send a single Vary: Accept-Encoding.
  • Added: Debug Log now records excessive cache purges, stalled or looping preload queues, the origin of every full cache clear, and cache-write failures — making invalidation loops easy to spot.
  • Added: Settings → Debug Logging lets you enable/disable error and warning logging independently. Error logging is on by default.
  • Fixed: the Debug Log is no longer deleted when you clear the cache. It now lives in wp-content/cache/easyopt-logs/ (outside the cache directory); any existing log is migrated automatically on update.
  • Improved: preload and serving warnings are far less noisy — the preload “queue growing” and “stalled” warnings now only fire on a genuine problem (e.g. a real invalidation loop, or an actively-running queue that isn’t progressing), not during a normal preload start or behind a CDN.
  • Performance: no feature changes; the loop fix substantially lowers CPU and disk usage on busy and low-resource/shared hosting.

2.2.1

  • Fixed: HTTP 500 on some Apache/LiteSpeed servers after writing .htaccess. Removed the obsolete Internet Explorer / Netscape 4 BrowserMatch gzip directives, which are rejected by the LiteSpeed/OpenLiteSpeed config parser. Gzip and Brotli compression are unchanged — the exact same content types are still compressed.
  • Fixed: AddOutputFilterByType (Gzip/Brotli) is now wrapped in <IfModule mod_filter.c>, the correct module on Apache 2.4, instead of mod_deflate.c.
  • Fixed: Cache-directory responses no longer send Content-Encoding: gzip on uncompressed files — the gzip headers are now scoped to the .html_gzip cache files only, preventing rare decode errors for clients that don’t accept gzip.
  • New: Per-server safety probe. Before writing to the live .htaccess, risky rule classes (Gzip directives and Options -Indexes) are now tested in an isolated throwaway directory. Any rule the server can’t parse is skipped automatically so it can never 500 the site — the page-cache rewrite, Expires headers and everything else still apply.
  • New: Options -Indexes is only emitted after passing its sandbox probe (it 500s where AllowOverride forbids it). A blank index.html is written to the cache directory as a universal directory-listing safeguard.
  • New: OpenLiteSpeed is now detected and the Gzip block is skipped on it (the server compresses natively), matching how other top performance plugins behave.
  • Improved: The loopback validation no longer treats a blocked loopback as success. If it can’t confirm the write, an admin notice is shown instead of silently continuing.
  • New filters: easyopt_htaccess_gzip block output and easyopt_probe_unverified_default / easyopt_probe_unverified_ok for hosts that block loopback HTTP.

2.2.0

  • New: Auto-detect and purge server-level caches across major hosting providers (Cloudways, Kinsta, WP Engine, SiteGround, Pantheon, Flywheel, Pressable, and more).
  • New: Dashboard card showing detected server cache layers.
  • New: Direct Varnish HTTP PURGE fallback for Cloudways when Breeze is not installed.
  • Improved: Server cache purge is rate-limited to once per request and uses non-blocking HTTP.
  • Improved: Full server purge only on explicit cache clear — post saves only purge the changed URL.
  • Improved: Apache htacess creation.
  • Added support for Pantheon, Flywheel, Pressable, Closte, and Convesio hosting environments.

2.1.0

  • New: Optimization tab split into 5 sub-tabs — JavaScript, CSS, Lazy Load, Preload LCP and Prefetch Pages
  • New: Database tab split into 2 sub-tabs — Database Cleanup and Autoload Health
  • New: Heartbeat & Cron tab — consolidates Heartbeat API control, WP-Cron throttle and Cron Event Manager
  • New: Settings tab with Import/Export and “Delete all plugin data on uninstall” toggle
  • New: Collapsible help sections throughout all panels
  • New: Dependency check on Lazyload Fonts when Remove Unused CSS is not enabled
  • New: Disable Block Library CSS toggle in Bloat Removal
  • New: Rewrite Elementor Background Images toggle in Image CDN panel
  • New: Stylesheet Behavior “Remove” option with inline breakage warning
  • Improved: “Instant Load” renamed to “Prefetch Pages” for clarity
  • Improved: Cache exclusion fields displayed in compact 3-column grid
  • Improved: Preload Cache enabled by default with auto-restart on cache clear
  • Improved: Admin toolbar “Clear All Cache” triggers preload restart when preload is enabled
  • Performance: pre_option shim uses prefix-based early exit
  • Performance: Database cleanup counts moved to async REST API call

2.0.3

  • New: Heartbeat API control with location and frequency settings
  • New: WP-Cron frequency throttle using transient-based lock
  • New: Cron Event Manager with manual run and delete
  • New: Defer JavaScript method as alternative to delay
  • New: Separate mobile/desktop Used CSS generation
  • New: Autoload Health auditor
  • New: Expanded mobile safelist for Used CSS
  • Fixed: Cloudflare test connection no longer requires pre-save
  • Improved: Dashboard module rows fully clickable

2.0.2

  • Improved: Database snapshot restore

2.0.1

  • Improved: Performance optimizations for conditional module loading

2.0.0

Major architecture rewrite with 25+ new features including page cache, cache preload, remove unused CSS, delay JavaScript, LCP preload, prefetch pages, font optimization, database cleanup with snapshots, Cloudflare integration, 9 hosting integrations, 8 accessibility toggles, 2 SEO toggles, 15 bloat removal toggles and a new admin dashboard.

1.1

  • Initial release with lazy load and Image CDN.

Plugin Website
Visit website

Author
FluxPress
Version:
2.4.1
Last Updated
June 15, 2026
Active Installs
100
Requires
WordPress 6.4
Tested Up To
WordPress 7.0
Requires PHP
7.4

Share Post

Join our newsletter.

Get insights into what’s happening at ChangelogWP right in your inbox. We don’t believe in spam.