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.