= 1.0.10 – 2026-05-20 =
* FIX: Add missing width/height — wrong author-declared dimensions no longer distort images. The optimiser now reads the actual file dimensions for every `<img>`, compares them to the author’s `width`/`height` attributes, and when the ratio drifts beyond 5% it rewrites the attributes to match reality before the defensive `aspect-ratio` style is emitted. Previously a raw-HTML widget such as `<img width=“380″ height=“380″ src=“logo-500×205.webp“>` would have its 1:1 aspect ratio locked in by the injected style and the image would render permanently distorted. Author-declared values within tolerance, images without an HTML width/height, SVG, and Gravatar still flow through their existing paths unchanged.*
* FIX: Add missing width/height — when the actual file dimensions cannot be determined (broken URL, remote image without `img_width_height_remote_fetch`, unsupported format), the optimiser no longer emits an unverified `aspect-ratio` style; it leaves the `<img>` exactly as the author wrote it instead of risking a wrong locked ratio.*
* NEW: Add missing width/height — per-image opt-out via `class=“zizi-skip-dims“` plus two filters: `zizi_cache_dimension_drift_tolerance` (default 0.05, range 0–1) and `zizi_cache_skip_dimension_correction($skip, $src, $html_w, $html_h, $file_w, $file_h)`.*
* IMPROVED: `Image::get_dimensions()` is now memoised per request, so repeated images (logos, icons, featured-image grids) hit `getimagesize()` only once per page render — keeps the new verify-on-every-image pass essentially free.*
= 1.0.9 – 2026-05-19 =
* FIX: Cloudflare Emergency Failover — The toggle on the CDN tab is now persisted on save.*
* FIX: Early Hints (103) — CSS and image hints are no longer fed from dead config keys. CSS hints now auto-pick the CSSEnhanced critical/RUCSS bundle for the current URL type when CSS optimization is active, and image hints auto-pick the detected LCP image from the runtime LCP transient — but only when the plugin’s master `img_preload` toggle is ON, so disabling image preload in the plugin disables image Early Hints. Font hints additionally honour the manual UI list (`fonts_preload_manual_urls`) instead of only the cron-populated legacy key.*
* FIX: Cloudflare Edge Cache Purge Parity — When the user (or any setting save / Font pipeline rebuild / WP-CLI flush) triggered `Purge::purge_pages()` while Cloudflare integration was active, the Cloudflare Manager only purged the homepage on the edge — the rest of the site stayed stale until manual intervention. The hook handler now mirrors LiteSpeed/APO behaviour: a `purge_pages` call with no targeted list maps to a Cloudflare `purge_everything`, so users see the same behaviour they’re used to from LS mode and File-based mode.*
* NEW: Cloudflare Edge Invalidation on Site-Structure Events — The Cloudflare Manager now hooks `wp_update_nav_menu`, `update_option_sidebars_widgets`, `switch_theme`, `customize_save_after`, `activated_plugin`, `deactivated_plugin`, and `update_option_permalink_structure` (parity with `LiteSpeedSupport`) and issues a full edge purge. Debounced within one request so a burst of structure changes collapses to a single API call. Only fires when `cdn_type=cloudflare` AND `cloudflare_enabled=true` — LiteSpeed-only and File-based installs are not affected.*
* IMPROVED: Early Hints visibility — Reminder for site owners: HTTP 103 only surfaces in DevTools when Cloudflare’s „Early Hints“ feature (Speed → Optimization → Early Hints) is enabled on the zone. The plugin emits `Link: <…>; rel=preload` headers which Cloudflare then promotes to 103 responses.*
= 1.0.8 – 2026-05-16 =
* FIX: WPML Compatibility — Resolved a fatal `Too few arguments to function ZiziCache\Plugins\Integrations\WPML::handleTranslationUpdate()` (`TypeError`, expected 3, got 1) that blocked content editing on any site running WPML alongside ZiziCache.*
= 1.0.7 – 2026-05-11 =
* IMPROVED: PSI Mobile — Self-Host Then Minify Order — `OptiCore::process_output` now runs `JavaScript::self_host_third_party_js()` BEFORE `JavaScript::minify()`. Previously the order was reversed, so any third-party JS (Google Analytics, Microsoft Clarity, Cloudflare beacon, Hotjar, …) freshly downloaded by self-host bypassed the minify pass entirely on first request and was served verbatim. With this swap, every cross-origin script that the user opted to self-host now gets compressed in the same pipeline pass — typically a 25-35% size reduction on non-minified analytics blobs. Recovers a portion of the „Minify JavaScript — Est savings of 10 KiB“ Lighthouse audit.*
* NEW: PSI Mobile — Inline Script Minify Pass — Added `JavaScript::minify_inline_scripts()` to compress every `<script>…body…</script>` block ≥200 chars (Elementor settings, gtag config, dataLayer, _wpUtilSettings, plugin localized data). Skips application/ld+json, text/template, scripts tagged data-zizi-ignore / data-no-optimize / data-cfasync, and base64-encoded delay-inline payloads. Closes the gap that left WordPress inline blocks unminified despite the master JS minify toggle being ON. Wired into the pipeline immediately after `JavaScript::minify()`.*
* NEW: PSI Mobile — Inline wp-hooks + wp-i18n Into `<head>` — Added `JavaScript::inline_wp_core_scripts()` which inlines the bodies of `<script id=“wp-hooks-js“>` and `<script id=“wp-i18n-js“>` (typically 3-4 KiB each) directly into the document head. These two scripts are emitted on virtually every WordPress 5.5+ page, are flagged „must stay sync“ because Elementor / WooCommerce / Yoast / Rank Math all rely on their globals before any inline `*-before` companion block, and on slow mobile each costs a full HTTP RTT — about 800ms of pure latency for ~7 KiB of payload that fits in a single TCP packet. Inlining eliminates both round-trips and the parser-blocking time is unchanged (the bytes still need to be parsed either way). Per-file cap default raised to 20 KiB with a hard floor of 16 KiB so the typical WP-core webpack bundles (~10 KiB each) always fit; users with stricter needs can lower via filter. Options: `inline_wp_core_scripts` (default ON), `inline_wp_core_max_bytes` (default 20480, enforced floor 16384).*
* NEW: PSI Mobile — Auto-Preconnect for External Origins — `OptiCore::auto_preconnect()` scans the final HTML for cross-origin URLs in `<script src>`, `<link href>`, `data-src`, `data-zizi-delay-src` attributes, tallies distinct hosts, and emits `<link rel=“preconnect“ crossorigin>` for the top 4 busiest origins right after `<meta charset>`. Skips origins already preconnected, the page’s own origin, and user-listed excludes. Warms DNS + TCP + TLS handshakes for third-party assets (Clarity multi-subdomain, Cloudflare beacon, Gravatar, embedded media) ~250 ms before the first request to them. Options: `auto_preconnect` (default ON), `auto_preconnect_max` (default 4, range 1-8), `auto_preconnect_min_count`, `auto_preconnect_excludes`. Filter `zizi_cache_auto_preconnect_origins` lets advanced users reshape the discovered list.*
* IMPROVED: PSI Mobile — Quicklink Init Deferred Past LCP/CLS Window — `quicklink-integration-fixed.js` no longer calls `quicklink.listen()` / `quicklink.prerender()` immediately at script execution. The decision logic (Speculation Rules support detection, network conditions, user config parsing) still runs inline as before — only the actual IntersectionObserver setup + initial viewport scan is wrapped in `addEventListener(‚load‘, () => requestIdleCallback(init, {timeout: 4000}))`. Removes Quicklink’s contribution to TBT and „Long main-thread tasks“ Lighthouse audit. The Speculation Rules → Quicklink fallback chain and all admin settings (quicklink_enabled, quicklink_mode, prerender flags, ignores, origins, data-saver respect, …) are honored verbatim. Disable via `quicklink_defer_init = false` for legacy behavior.*
* IMPROVED: CLS Guard — Animation Post-Paint MutationObserver Fallback — `Animation::auto_compose()` now appends a tiny (~680-byte) post-paint observer to `<body>` that watches the DOM for elements receiving an `animationName` at runtime — catching the four common cases the static `@keyframes` scanner cannot reach: JS-injected keyframes (GSAP / AOS / dynamically-added `<style>` blocks), `style=“animation-name:…“` set after paint, animations whose stylesheet is hosted on a CDN that bypassed local file resolution, and animations triggered by class changes via MutationObserver `attributeFilter: [‚style‘,’class‘]`. Idempotent (`data-zc-ap` marker prevents reprocessing); runs once on `load` then observes incrementally. Option `cls_animation_post_paint_observer` (default ON).*
* IMPROVED: Font `font-display` Strategy — Idempotent Per-Face Override — `Font::inject_display_swap()` rewritten to operate per `@font-face` block instead of stripping every declaration globally and re-injecting. The Font Display Strategy setting remains a deliberate global force-set knob: every face ends up with the user-configured value (default `swap`). Idempotent skips and surgical rewrites: faces whose `font-display:` already matches the configured value are left untouched (no churn on already-correct CSS); faces with a different declaration get that one declaration replaced in-place; faces without any declaration get the configured value injected at the start of the block. The Critical CSS dedup pipeline (`filter_used_css_by_critical_fonts`) was aligned to read the configured value from SysConfig instead of hardcoding `swap`. Net effect: same final CSS as before, but the rewrite preserves the surrounding block structure and is safe to re-run repeatedly on already-processed CSS.*
* NEW: CLS Guard — Animation Auto-Compose — Eliminates Lighthouse „Non-composited animations“ warnings and the layout-shift contribution they cause. ZiziCache now scans every `@keyframes` block in inline `<style>` tags and linked stylesheets, identifies frames that mutate layout-affecting properties (`transform: scale|translate|skew|rotate|matrix`, or `width`/`height`/`top`/`left`/`right`/`bottom`/`margin`/`padding` with units), then finds every selector that drives those keyframes via `animation:` or `animation-name:` and emits a tiny inline `<style id=“zc-anim-promote“>` before `</head>` that promotes them to a GPU compositor layer (`will-change: transform, opacity; backface-visibility: hidden`). Detection is property-based (NOT name-based) so it works with ANY user-named keyframe — `pulse`, `aurora-main`, `hero-bounce-v2`, minified `kg-zw3`, animate.css, Elementor effects, custom CSS — across thousands of WordPress sites without per-site whitelisting. Capped at 200 selectors per page to prevent CSS bloat. New options: `cls_animation_compose` (master toggle, default ON), `cls_animation_use_contain` (also emit `contain: layout paint`, default OFF — opt-in because it can affect fixed/absolute descendants), `cls_animation_compose_excludes` (selectors to skip). Filter `zizi_cache_animation_compose_excludes` available. Tested on zizicache.com: cleared the 8-element non-composited animations audit and removed the desktop CLS contribution from the `pulse` and `aurora-main` keyframes.*
* FIX: Image Preload — Eliminated false-positive `<link rel=“preload“ as=“image“>` on pages where the LCP element is text/heading or the only image lies below the fold. New STRICT mode (default ON, option `img_atf_strict_mode`) skips the legacy N-count „first 3 images“ bootstrap when no real ATF viewport data exists for the (URL, device) combination. First visit pays a one-frame lazy-load cost; subsequent visits get accurate preloads from the JS scanner. Filter `zizi_cache_atf_strict_mode` available to override.*
= 1.0.6 – 2026-05-09 =
* FIX: Language-Aware Cache — Now respects the user’s Language Priority configuration by mapping detected language subsets to their corresponding position within the priority chain.*
* IMPROVED: LiteSpeed Hit Rate Visualization — Reworked the layout from a 4-column grid with numeric counters above labels (HIT / MISS / No-C / UNK) into a unified vertical stack layout matching the rest of the Cache Status card design.*
* FIX: LiteSpeed Mode — Resolved an issue where LiteSpeedPreload::process_results() never triggered increment_warmed_count(), causing the warmed pages counter to remain at 0 even after hundreds of successful warmups. Verification tests confirmed the fix.*
= 1.0.5 – 2026-05-04 =
* FIX: Cache Status in Dashboard Overview — Now correctly reflects warmed pages and recalculates totals without artificial inflation. UI adjustments applied for both LS mode and File-Based mode.*
* NEW: Translations — Added support for the following locales: cs_CZ — Čeština (Česká republika), sk_SK — Slovenčina (Slovensko), de_DE — Deutsch (Deutschland), es_ES — Español (España), fr_FR — Français (France), it_IT — Italiano (Italia), pt_BR — Português (Brasil), nl_NL — Nederlands (Nederland), pl_PL — Polski (Polska), sv_SE — Svenska (Sverige), da_DK — Dansk (Danmark), nb_NO — Norsk Bokmål (Norge), ja — 日本語 (日本), tr_TR — Türkçe (Türkiye).*
* IMPROVED: Optimization — CSS Loading Strategy — Added new method “Remove Original”.*
* IMPROVED: Optimization — CSS Loading Strategy — Enhanced “Exclude Stylesheets” and “Never-Remove Selectors” handling.*
* IMPROVED: Image Optimization — Improved detection of images for preload in Above The Fold.*
* IMPROVED: Optimization — Delay All JavaScript — Added new method “Load when idle”.*
= 1.0.4 – 2026-04-23 =
* FIX: Image Optimization — `sizes=“auto“` is now only emitted on lazy-loaded images, where it is valid per the HTML spec. Eager/ATF images no longer carry a redundant or invalid `sizes` attribute; their responsive `srcset` is kept and the browser correctly defaults to `100vw`.*
* FIX: Image Optimization — `loading=“eager“` is no longer written to the output HTML. Eager loading is the browser default; the explicit attribute was unnecessary noise that added bytes without benefit.*
* FIX: Image Optimization — `fetchpriority` and `decoding` attributes are now always placed at the end of the `<img>` tag, after `src`, `srcset`, and `sizes`. Previously they could appear in the middle of the attribute list when set by the lazy-load exclusion path.*
* FIX: Image Optimization — In N-count bootstrap mode (first page visit with no real ATF/viewport data yet), only 1 `<link rel=“preload“ as=“image“>` tag is now generated for the hero/LCP image. Previously all N eager images (default: 3) were preloaded even when only the first was truly above the fold, wasting bandwidth and competing with the actual LCP image.*
* IMPROVED: Image Optimization — On fresh pages with no browser-collected ATF data, the first N images (N=3 by default) are still kept eager (no lazy-loading penalty) as a bootstrap. Only the first image gets a preload link with `fetchpriority=“high“` until real viewport data is collected via the browser scanner.*
= 1.0.3 – 2026-04-23 =
* IMPROVED: Preload watchdog now correctly recovers from stale/overdue cron events when `DISABLE_WP_CRON=true` is configured with an infrequent server-side cron (e.g. every 5–15 minutes). Previously the watchdog skipped any `zizi_cache_preload_next` event that was overdue but not yet fired, leaving the preload queue stuck for hours. The watchdog now detects overdue events and processes the next batch immediately, ensuring reliable cache warming on all hosting configurations — including LiteSpeed, Apache file-based, and servers with real-cron-only WP-Cron setups.*
* FIX: Permanent MISS on multilingual sites using WPML, Polylang, or TranslatePress — the cache drop-in now correctly reads the language-specific cache file (e.g. `index-cs.html.gz`) that matches what the cache writer produces.*
* SECURITY: Language cookie values are now sanitized before being used in filesystem paths, preventing potential path traversal via crafted cookie values.*
* NEW: NagataPress multilingual integration — translated URL variants (`/en/`, `/de/` etc.) are now automatically added to the preload and auto-purge queues for NagataPress sites using subdirectory URL format.*
* NEW: Cookie-based multilingual preload warming for WPML, Polylang, and TranslatePress — each language variant (`index-{lang}.html.gz`) is individually warmed by the preloader via the new `zizi_cache_preload_lang_cookies` filter. Stale-while-revalidate revalidation also covers all language variants.*
* NEW: Dashboard „Cache files“ badge showing the total number of page-level `.html.gz` files in cache (including language variants, excluding mobile-specific files), refreshed every 60 seconds.*
* IMPROVED: Cache Status page now correctly detects cached pages on multilingual sites where the default language produces language-suffixed files (e.g. `index-cs.html.gz`) instead of the plain `index.html.gz`.*
* NEW: Speculation Rules API now served via `Speculation-Rules` HTTP header pointing to a dedicated REST endpoint (`/wp-json/zizi-cache/v1/speculation-rules`). This is required for Cloudflare Speed Brain compatibility — Speed Brain ignores inline `<script type=“speculationrules“>` and only respects the HTTP header approach.*
* NEW: REST endpoint `/wp-json/zizi-cache/v1/speculation-rules` returns the rules JSON with correct MIME type `application/speculationrules+json` and `Cache-Control: public, max-age=3600` for CDN-friendly caching.*
* NEW: File-based cache drop-in (`advanced-cache.php`) now sends the `Speculation-Rules` HTTP header on cache HITs, ensuring Cloudflare Speed Brain receives the header even when WordPress never loads.*
* FIX: Analytics prerender guard now uses `document.prerendering` (modern API) instead of the deprecated `document.visibilityState === ‚prerender’`.*
* FIX: `document.prerendering` early-return added to LCP detector, TTFB detector, and LoAF detector. These scripts no longer run or fire `fetch()` calls during Chrome’s speculative prerendering phase, which prevented Prerender activation on some pages.*
* FIX: Quicklink analytics guard script (`zizi-quicklink-analytics-guard`) is no longer emitted as an empty no-op when no analytics IDs are configured.*
* REMOVED: Dead Speculation Rules admin toggles „Require HTTPS“ and „Anonymous IP“ removed from the Advanced tab UI and JavaScript. These generated invalid `requires` JSON blocks that caused Chrome warnings; the new implementation emits no `requires` block.*
* FIX: Font Auto-detect — `Font::get_preload_fonts_from_optimized_css()` now includes a CSS fallback path. When `font_intelligence` is empty (new install, reset, or „Detect fonts“ never triggered), the method directly scans cached `*.css` and `3rd-css-js/*.css` files for `@font-face` woff2 URLs. This prevents FOUC caused by missing preload links after cache warm/revalidate cycles.*
* FIX: Font Intelligence REST collect endpoint now updates `zizi_cache_font_intelligence` for anonymous visitors. Previously only admin AJAX calls updated `font_intelligence`; REST calls from uncached page visits (warming, stale-revalidate) never persisted critical font data, leaving the auto-detect field empty.*
* FIX: Admin „Auto-detected Font URLs“ field now falls back to `fonts_preload_urls` config value if `Font::get_preload_fonts_from_optimized_css()` returns empty (no cached CSS files yet).*
* FIX: Font statistics reset now delegates to `Font::reset_font_statistics()` which fully clears all related options and transients (previously only deleted raw font data rows, leaving stale `font_intelligence` behind).*
= 1.0.2 – 2026-04-10 =
* IMPROVED: Enhanced license validation.*
* IMPROVED: UI improvements in the plugin dashboard.*
= 1.0.1 – 2026-04-08 =
* NEW: Migration from Lemon Squeezy to the new payment system Creem.io. All existing license keys and updates remain fully functional. New registrations and licenses are now handled exclusively through Creem.io.*
= 1.0.0 – 2026-03-30 =
* NEW: ZiziBlocks — ESI-like Dynamic Blocks system that enables full page caching while serving personalized, per-user content (cart count, mini-cart, prices, user greeting, nonces) via client-side hydration through a single batched REST API request.*
* NEW: ZiziBlocks WooCommerce integration — dynamically hydrates cart count, mini-cart widget, product prices, and stock status on cached pages without invalidating the page cache.*
* NEW: ZiziBlocks multi-currency support — detects active currency from cookies (WOOCS/FOX, WCML, Aelia, VillaTheme) and returns prices in the correct currency per user, eliminating the need for per-currency cache variants.*
* NEW: ZiziBlocks User Blocks — dynamically renders user greeting, avatar, login/logout link and account menu for logged-in users on otherwise fully cached pages.*
* NEW: ZiziBlocks Nonce Blocks — replaces WordPress nonce fields (`_wpnonce`, WooCommerce nonce, comment nonce) with always-fresh values, fixing broken forms on pages with long cache TTLs.*
* NEW: ZiziBlocks fragment cache layer with Redis/Memcached/file fallback; per-block configurable TTL and cache invalidation hooks.*
* NEW: ZiziBlocks IntersectionObserver lazy hydration — medium/low priority blocks (prices below the fold) are only fetched when they approach the viewport, reducing initial batch request size.*
* NEW: ZiziBlocks CLS prevention — placeholders carry `min-width`, `min-height`, and `contain-intrinsic-size` attributes matching the original element dimensions, preventing layout shift during hydration.*
* NEW: ZiziBlocks `<noscript>` fallback — original content is preserved inside `<noscript>` tags within every placeholder, ensuring correct display for crawlers and users without JavaScript.*
* NEW: ZiziBlocks admin UI tab (Dynamic Blocks) with per-feature toggles, live status, cache stats, and registered block list.*
* FIXED: ZiziBlocks batch API response keying — multiple blocks of the same type (e.g. `wc-price` for different products on a shop listing page) now return individually keyed results, preventing all products from displaying the same price.*
* FIXED: ZiziBlocks REST route collision — `/blocks/status` and `/blocks/cache` endpoints are now registered before the wildcard `(?P<block_id>[a-zA-Z0-9_-]+)` route, ensuring status and cache-management endpoints resolve correctly.*
* FIXED: ZiziBlocks fetch timeout was configured (`blocks_timeout`, default 5000 ms) but never enforced. Requests to `/blocks/batch` now use `AbortController` with the configured timeout, preventing indefinitely hanging hydration requests.*
* FIXED: ZiziBlocks cache key generation switched from `serialize()` to `wp_json_encode()` for deterministic, injection-safe fragment cache keys.*
* FIXED: FTP Image Auto-Registration no longer enters an infinite re-registration loop on sites using WordPress 5.3+ scaled images (e.g. `1-scaled.jpg`). The duplicate detection now checks both the original path and its `-scaled` variant against a single batch-loaded lookup, replacing N per-file SQL queries with one.*
* FIXED: `wp_generate_attachment_metadata()` replaced with a lightweight `getimagesize()` approach in `FTPImageRegistration`, preventing out-of-memory crashes on very large images (100+ MP). Memory-safety guard retained for edge cases.*
* FIXED: Removed duplicate `_wp_attached_file` meta row that was being created by both `wp_insert_attachment()` and an extra `add_post_meta()` call.*
* FIXED: Thumbnail and derivative file filter in `FTPImageRegistration::scan_directory()` now applies to all image extensions, not only WebP/AVIF.*
* FIXED: `MediaLibraryIndexer::is_file_indexed()` now correctly recognises an original image as already indexed when WordPress stored it under its `-scaled` variant name, preventing repeated false-positive indexing attempts.*
* FIXED: `MediaLibraryIndexer::get_unindexed_stats()` no longer counts WordPress derivative files (thumbnails, `-scaled`, `-rotated`, double-extension converted WebP/AVIF) as unindexed originals, eliminating spurious full-scan triggers.*
* FIXED: `MediaLibraryIndexer::index_file()` duplicate check replaced with a direct `$wpdb->get_var` query (including `-scaled` variant lookup) instead of the heavyweight `get_posts()` + `meta_query` JOIN.*
* FIXED: Regex pattern for stripping `<script>`, `<noscript>`, and `<template>` tags now uses possessive quantifiers to prevent catastrophic backtracking on malformed HTML.*
* FIXED: HTML attribute parser (`get_atts_array()`) now correctly handles edge-case attributes using a branch-reset regex pattern.*
* FIXED: Disabled RSS feeds now return HTTP 410 (Gone) instead of a 301 redirect, correctly signaling permanent removal to search engines.*
* IMPROVED: `MediaLibraryIndexer` now skips derivative files early in `scan_and_index_uploads()` before any cache lookups, reducing iteration overhead on large uploads directories.*
* IMPROVED: `MediaLibraryIndexer::maybe_auto_index_uploads()` now exits immediately if the FTP scan transient is active, preventing a redundant double-scan on every Media Library page load.*
* IMPROVED: CSS parser engine upgraded to Sabberworm PHP CSS Parser 9.3.0, adding native support for CSS `@layer`, `@scope`, `@starting-style`, container queries, escaped quotes in selectors, improved `calc()` parsing, and PHP 8.5 compatibility.*
* IMPROVED: All vendor libraries (Sabberworm CSS Parser, Safe polyfill) are now namespace-isolated under `ZiziCache\Vendor\*` to prevent conflicts with other plugins shipping the same libraries.*
* IMPROVED: CSS `@layer` forward declarations are now properly normalized and re-serialized in both RUCSS and Critical CSS pipelines.*
* IMPROVED: CDN URL rewriting now applies to inline `style` attributes in addition to `<link>` and `<style>` tags.*
* IMPROVED: WooCommerce unused CSS now differentiates product types (`product-variable`, `product-grouped`, `product-external`) for more accurate per-page used CSS generation.*
= 0.9.9-rc – 2026-03-15 =
* FIXED: Custom CSS selectors (configured in JavaScript settings) now correctly apply to both lazy render methods – CSS-only and Hybrid. Previously, custom selectors were only reliably processed in Hybrid mode.
* FIXED: „Exclude from lazy render“ selectors now correctly suppress lazy rendering in both CSS-only and Hybrid methods. The selector detection and exclusion check now run before the method switch, ensuring identical behavior across both modes.
* IMPROVED: Lazy render pipeline now merges auto-detected, custom, and `.lazy-render` selectors in a single pass shared by both methods, eliminating any risk of divergence between CSS-only and Hybrid output.
= 0.9.8-rc – 2026-03-13 =
* FIXED: Page cache preload now starts automatically immediately after saving settings (mode switch, cache enable, or preload enable). Previously, preload only triggered via WP-Cron after the full cache lifespan interval, leaving the cache empty for hours after a fresh install or mode change.*
* FIXED: File-based mode now correctly generates `preloader-list.txt` on first save, ensuring cache warming works reliably from the start.*
* FIXED: First-run notice on the Overview dashboard now correctly informs the user to save Page Cache settings to activate preload, instead of misleadingly suggesting the cache is already warming.*
* FIXED: PreloadSqlite activation check now correctly verifies the SQLite extension availability, preventing a silent failure on servers without the `sqlite3` PHP extension. (Thanks to Josef Helie)*
* IMPROVED: LiteSpeed mode preference flags (`cache_preload`, `cache_separate_mobile`, `cache_404`) are now preserved when switching from LiteSpeed to File-based mode instead of being reset to false.*
= 0.9.7-rc – 2026-03-09 =
* IMPROVED: Improved page caching on OLS.*
* IMPROVED: Enhanced URL handling for converted images.*
* IMPROVED: Updated logic for detecting background images.*
= 0.9.6-rc – 2026-03-09 =
* IMPROVED: Improved detection of converted images to AVIF and WebP, with fallback to the original (content negotiation).*
= 0.9.5-rc – 2026-03-05 =
* BUGFIX: Fixed the preload and purge cache logic on LiteSpeed servers.*
* IMPROVED: ?nocache=1 or any arbitrary parameter (e.g., ?unknown_param=xy) now works on LiteSpeed servers to bypass the cache.*
* IMPROVED: Unified logic for cache_lifespan and scheduled caches across the entire plugin in LS mode and File Based Page Cache Mode.*
* IMPROVED: Auto mode has been removed from Page Cache Settings > Cache Mode, leaving only LiteSpeed Cache (preselected on LiteSpeed servers) and File-based Cache with automatic detection, while non-LiteSpeed servers will always have only File-based Page Cache available.*
= 0.9.4-rc – 2026-03-04 =
* FIXED: LCP HMAC validation now supports cache-lifespan-aware verification windows, improving reliability on long-lived cached pages.*
* FIXED: Added safe backward compatibility for pre-update hourly HMAC tokens during transition after plugin update.*
* FIXED: Page cache is now purged automatically on plugin upgrade to regenerate pages with fresh security tokens.*
* FIXED: Database Monitor warning (`Undefined variable $prev_total`) resolved; database size change history is now calculated correctly.*
* FIXED: Redis status diagnostic success/error logs are now debug-only to reduce production log noise.*
* FIXED: Varnish integration hardened against undefined `$http_response_header` warnings when test requests fail.*
* FIXED: zizi-log.log adjustments after transition from beta – minimization of non-critical function notices, reduction of log spam, and decreased I/O operations.*
* IMPROVED: Stability and migration safety for large production websites during incremental updates.*
* IMPROVED: Licence validation.*
* IMPROVED: preload_async_enabled for faster and more efficient asynchronous purge and preload operations of updated page cache content. Reduction of background processes resulted in a relative latency decrease of approximately 93.52%*
= 0.9.3-rc – 2026-03-02 =
* FIXED: API update fix.*
* FIXED: Better WooCommerce handling*
= 0.9.2-rc – 2026-03-01 =
* IMPROVED: Bulk Optimization in the Image Converter section. More accurate calculation of images to be converted.*
* IMPROVED: Adjustments for smoother and faster bulk image conversion.*
* FIXED: Adjustments hybrid mode in Lazy render page elements.*
= 0.9.1-rc – 2026-02-27 =
* FIXED: Font preload logic now correctly detects ATF fonts as LCP for proper early preloading.*
* FIXED: Non-cached page counting has been adjusted for more accurate cache statistics.*
* FIXED: Image conversion logic optimized for more stable and faster processing.*
* FIXED: Multiple UI improvements for a smoother and more consistent user experience.*
* FIXED: Plugin detection enhanced for more precise and targeted page cache purge, especially when saving content via builders or WPML.*
* FIXED: Better handler Redis Object Cache and Memcached with flush OC during ZiziCache plugin deactivation.*
= 0.9.0-beta.rc – 2026-02-24 =
* FIXED: LiteSpeed preload telemetry now maps cache results correctly into Cache URL Tracker (consistent `hit|miss|nocache|unknown|error` status model).*
* FIXED: Fragment block cache invalidation now reliably targets entries by `block_id` metadata to prevent stale dynamic blocks.*
* SECURITY: Public `/blocks/batch` endpoint hardened with request body size limit, max blocks per batch, and IP-based rate limiting.*
* IMPROVED: Legacy RUCSS fallback now requires explicit opt-in (`css_allow_legacy_rucss_fallback`) for safer default behavior.*
* IMPROVED: CSS minification file-size guard is now filterable via `zizi_cache_css_minify_max_bytes`.*
= 0.8.9-beta.rc – 2026-02-19 =
* IMPROVED: Improved UI*
* IMPROVED: Better handling of page cache on NGINX and Apache servers. Enhanced limit for the page cache preload worker.*
= 0.8.8-beta.rc – 2026-02-12 =
* IMPROVED: Image Optimization (Optimization → Image Optimization) now provides more accurate above-the-fold image detection for both mobile and desktop, including preload support and the ability to define the preload order. Note: an excessive number of preloaded images may unnecessarily block bandwidth.*
* IMPROVED: Font Optimizer with more accurate font detection and improved compatibility with the Bricks builder.*
= 0.8.7-beta.rc – 2026-02-09 =
* IMPROVED: Optimization of the plugin has been implemented on both the frontend and backend. Modules are now loaded only where they are actually needed.*
* FIX: A bug in Remove Redundancy during settings saving has been fixed.*
= 0.8.6-beta.rc – 2026-02-02 =
* IMPROVED: Added support for both Memcache and Memcached. Uses the modern PECL memcached extension (with „d“) alongside legacy memcache. This allows better performance, SASL authentication.
= 0.8.5-beta.rc – 2026-01-29 =
* FIXED: Improved Memcached Object Cache UI: checks for server availability and required PHP extensions before activation. Mutual exclusion updated to prevent conflicts when Redis or Memcached is active during object-cache.php regeneration.
= 0.8.4-beta.rc – 2026-01-28 =
* NEW: Added option to use Memcache. If Redis Object Cache is not available, Memcached can be enabled if available.
* IMPROVED: Bulk Optimizer in Image Converter now shows progress correctly in time intervals after several seconds.
* IMPROVED: In BFCache, merged URL Exclusions section with BFCache Configuration.
* FIXED: Adjusted logic for more precise detection of Cart and Checkout for their exclusion from page cache and BFCache.
* FIXED: Adjusted method for purging page cache when using ACF.
* FIXED: Adjustment of bypass rules for optimization for logged-in administrators.
= 0.8.3-beta.rc – 2026-01-14 =
IMPROVED: In the CSS Optimization section, the optimization type is now correctly labeled as CSS Loading Method.
IMPROVED: In the Critical CSS Generation section, a new option allows choosing between Inline CSS and File-based delivery. Each method has its own advantages and disadvantages. Critical CSS accuracy ranges between 30–70%.
IMPROVED: In the Image Optimization section, the logic for Priority Hints has been refined.
IMPROVED: In the Font Optimization section, added the ability to define custom URLs for font preload. Note that this applies only to locally hosted fonts.
IMPROVED: In the Image Converter section, the logic for converting images to AVIF and WebP has been refined.
IMPROVED: In the Object Cache section, added support for connecting to Redis using ACL authentication (username + password), allowing the use of Redis with ACL (thanks for the suggestion, @Vincent Chan).
FIXED: In the Image Optimization section, the exclusion logic for lazy loading has been corrected for both desktop and mobile versions.
FIXED: Reworked Font Optimization logic for collecting critical fonts to ensure correct preloading.
FIXED: Corrected the loading order of ZiziCache scripts used for collecting CWV metrics.
FIXED: Removed unnecessary autoload entries in the wp_options table during font statistics collection (thanks for the suggestion, @Jakub Schnicel Rezníček).
ADDED: In the Remove Redundancy section, 14 new features have been added with the ability to disable them individually.
EXPERIMENTAL: Added an option to preload jquery.min.js in Optimization > JavaScript Optimization. This may be useful but it occupies an HTTP/2 connection slot.
= 0.8.2-beta.rc – 2026-01-09 =
FIXED: Adjusted autoload values used by the plugin, which previously overfilled the wp_options table. Only essential items are now autoloaded.
FIXED: Compatibility issue on some hosting environments where mod_access_compat was not enabled.
IMPROVED: Complete overhaul of the CSS optimization section, specifically delivery methods (On Interaction, DOMContentLoaded Event, and Async).
IMPROVED: Critical CSS delivery method now allows choosing between inline insertion or file-based insertion for overall reduction. This is an optimization improvement, not a precise per-page Critical CSS generator. Accuracy is approximate, but performance gains are significant.
FIXED: Exclude and preload functionality for above-the-fold images corrected for both mobile and desktop versions.
BUGFIX: Purge All now correctly removes all CSS.
BUGFIX: Migration from older plugin versions could break the Font Detector; logic has been fixed.
FIXED: Dependency chain for LCP, TTFB, and Metrics files corrected.
= 0.8.1-beta.rc – 2025-12-29 =
* IMPROVED: Better detection of Cloudflare outages for Cloudflare Failover.
* NEW: Added support for native page cache on LiteSpeed servers. Three modes are now available: Auto, LiteSpeed Cache Only, and File-based Cache Only (suitable not only for Apache servers but, of course, also for LiteSpeed servers).
* NEW: Added a page to overview URLs missing from the page cache, available under Page Cache > Pages Not Cached.
* IMPROVED: Minor adjustments in the admin UI.
= 0.8.0-beta.rc – 2025-12-16 =
* IMPROVED: Enhanced Redis Object Cache connectors.
* IMPROVED: Updated BFCache logic.
* IMPROVED: Improved UI in the Images section.
* FIXED: Fixed Page Cache generation logic, including support for mobile versions.
* FIXED: Fixed recalculation and detection of thumbnail dimensions.
* FIXED: Fixed logic for CSS Loading Methods.
* FIXED: Minor adjustments in the admin UI.
* NEW: Added the ability to view pages that are not in the Page Cache. You can now see the exact reason why pages are excluded from caching or not cached, either due to internal plugin rules and bypasses or other settings.
= 0.7.9-beta.rc – 2025-12-11 =
* IMPROVED: Enhanced UI in the Redis Object Cache section with a more reliable handler for enabling and disabling Redis Object Cache.
* IMPROVED: Updated logic for writing constants to wp-config.php.
* IMPROVED: Improved UI in the 103 Early Hints section with added explanations about how and where it works..
= 0.7.8-beta.rc – 2025-12-10 =
* FIX: Resolved a potential crash in Image Converter diagnostics by replacing wp_tempnam() with tempnam() and removing a duplicate admin_init hook. Image conversion functionality remains unchanged.
* FIX: Ensure page-cache enable/disable toggles correctly and dependent optimizations respect cache state and configuration dependencies.
* FIX: Fix Redis connection handling and Unix-socket support (on OpenLiteSpeed servers) — avoid attempting connections with an empty host (php_network_getaddresses error), correctly detect and use Unix socket paths, and prevent undefined „host“/“port“ errors in the generated object-cache.php.
* FIX: Reduce verbose debug logging and stop spurious DB/JSON errors by adding Action Scheduler table-existence checks.
* FIX: Suppressing noisy BFCache/Image/Font/SysConfig debug output, replacing direct error_log() calls with CacheSys::writeError().
* FIX: Preventing BFCache status/REST checks when the feature is disabled.
= 0.7.7-beta.rc – 2025-12-08 =
* IMPROVED: Added a global option to enable CWV metric collection directly from the admin interface, in addition to WP-CLI and direct DB activation.
* IMPROVED: Added bypass URL parameters: `?nocache=1`, `?bypass_optimization=1`, and `?zizi_bypass=1` (e.g., `https://example.com/?nocache=1`).
= 0.7.6-beta.rc – 2025-12-08 =
* FIX: Fixed an issue with the toast notification when saving settings in Optimization > IFrame & Video Optimization. (Thanks to @schnicel)
= 0.7.5-beta.rc – 2025-12-08 =
* **NEW: Modular Admin Interface** – Complete redesign of admin panel architecture:
– Separated components for each settings section
– Dedicated REST API handlers for each module
– Admin templates reorganized into standalone files
– Highcharts integration for performance visualizations
– Toast notification system for user feedback
– Toggle UI components for consistent switch controls
* **NEW: BFCache (Back/Forward Cache) Management** – Complete browser cache optimization system for instant back/forward navigation:
– Session token management for logged-in users with automatic HTTP header modification
– Cookie-based authentication state tracking for cache invalidation
– Support for WordPress Script Modules API (WordPress 6.5+) with legacy fallback
– Automatic exclusion for WooCommerce admin pages to prevent JavaScript conflicts
– Diagnostics and status reporting via REST API
* **NEW: Core Web Vitals (CWV) Monitoring System** – Real-time performance tracking:
– MySQL database layer for high-performance CWV data storage with optimized schema
– LoAF (Long Animation Frame) detector with Layout Thrashing analysis and severity classification
– TTFB (Time to First Byte) monitoring with threshold alerts
– LCP element details extraction for debugging optimization opportunities
– Frontend banner for administrators showing real-time CWV status per page
– REST API endpoints for metrics collection, page summaries, and data management
– Configurable sampling rates, thresholds, and retention policies
– Automatic aggregation via WP-Cron with 5-minute intervals
* **NEW: Cloudflare CDN Integration** – Native Cloudflare cache management:
– API Token and Zone ID configuration with connection testing
– Automatic cache purge on content changes (posts, pages, taxonomies)
– Smart URL collection for targeted purge instead of full zone purge
– Edge Cache Rules management
– Conflict detection with official Cloudflare plugin and WP Rocket
– Emergency Failover (EXPERIMENTAL feature). Automatically bypass CF proxy during major outages
* **NEW: Font Auto-Optimizer** – Automatic Google Fonts CSS generation:
– WP-Cron scheduled optimization respecting page cache lifespan
– Aggregated font statistics from collected data
– Automatic WOFF2 URL extraction for preloading
– Minimum data threshold before auto-generation (10 pages)
* **NEW: Image Converter Metadata Validator** – Self-healing metadata system:
– Automatic validation when image format configuration changes
– Sanity check on post save for _wp_attached_file
– Background WP-Cron validation for non-blocking operation
– Fixes GUID, attached_file, and optimization metadata
* **NEW: Cache Statistics Monitor** – Hit/miss tracking:
– Hourly transient-based statistics for responsiveness
– Persistent stats with sampling to reduce database load
– Real-time hit rate calculation
* **NEW: Cache Settings REST API** – Dedicated endpoints for cache configuration:
– `/cache-settings` GET/POST for cache lifespan, preload, mobile cache settings
– `/cache-exclusions` GET/POST for bypass URLs, cookies, query string management
– Automatic WP_CACHE constant management in wp-config.php
– Integration with unified SysConfig system
* IMPROVED: Authority class with new `isAllowedSilent()` method for permission checks without logging
* IMPROVED: Redundancy module – Enhanced jQuery Migrate disabling with proper deregistration and JS Delay exclusion
* IMPROVED: Redundancy module – Added WooCommerce tracking scripts to disable list (sourcebuster-js, wc-order-attribution)
* IMPROVED: Redundancy module – Enhanced `hide_wp_version()` with all generator filter types including Elementor
* IMPROVED: REST API disable now allows ZiziCache LCP and Font Intelligence endpoints for anonymous users
* IMPROVED: Bootstrap sequence – Earlier initialization of Redundancy module for wp_default_scripts hook
* IMPROVED: WooCommerce admin bypass detection moved earlier in bootstrap to prevent BFCache conflicts
* IMPROVED: Plugin activation now creates CWV MySQL tables alongside ImageConverter stats table
* IMPROVED: Self-healing CWV table check on admin_init for seamless upgrades from older versions
* IMPROVED: Frontend JavaScript reorganized – new modular bfcache-handler-module.js, bfcache-login-detector.js
* IMPROVED: Quicklink integration fixed with new quicklink-integration-fixed.js replacing unstable version
* IMPROVED: Admin CSS streamlined – removed legacy files (admin.css, admin-rtl.css, fonts/) in favor of modular approach
* FIXED: Block library CSS now properly deregistered (not just dequeued) to prevent re-enqueueing
* SECURITY: Enhanced REST API permission callback with CSRF protection and nonce verification
* SECURITY: Detailed logging for denied access attempts with caller context
* COMPATIBILITY: Tested with WordPress 6.9
= 0.7.0-beta.7 – 2025-10-27 =
* IMPROVED: Complete redesign of the admin interface for a more modern and user-friendly experience.
* IMPROVED: Major update to the Page Cache module — improved file counting accuracy and internal structure.
* IMPROVED + FIXED: Fully refactored Image Converter logic — redesigned detection of available images and thumbnails, rewritten WebP and AVIF conversion system with reliable fallback to original images. Resolved compatibility issues with various plugins and themes.
* IMPROVED: Comprehensive overhaul of the Font Optimization logic for better performance and reliability.
* IMPROVED: Full rework of the Optimization section, simplifying structure and improving stability.
* FIXED: Resolved compatibility issue with SEOPress when generating XML sitemaps.
= 0.5.7-beta.5 =
* IMPROVED: Added a button in the Optimization tab for saving settings in the Early Hints and Enhanced Navigation Strategies sections.
* FIX: Fixed a bug related to handling JavaScript in delay mode.
For downgrade download v0.5.7-beta.5