Description
Flexa Cache is a full-featured WordPress page-cache and front-end optimization plugin. It installs a self-contained advanced-cache.php drop-in that serves compressed static HTML files before WordPress even loads — the same technique used by WP Fastest Cache and W3 Total Cache — giving you maximum TTFB improvement on both Apache and nginx hosts.
Page Cache
- Static HTML cache served by a pre-WordPress drop-in (no PHP/MySQL on cache hits)
- Gzip pre-compressed
.gzfiles served natively - Separate mobile cache variant (
index-mobile.html) when Mobile Theme is enabled - Smart invalidation: purge on new post, updated post, comments, theme/menu/widget changes, and WooCommerce product/stock updates
- Per-URL cache purge from the admin UI, WP-CLI, or REST API
- Cache preloader via Action Scheduler (or WP-Cron fallback) with start/cancel/status controls
- Widget output cache with O(1) versioned-key invalidation
Front-End Optimization
- Minify HTML (whitespace collapse) and Minify HTML Plus (inline CSS/JS trim)
- Minify CSS and Minify CSS Plus (deeper punctuation squeeze)
- Combine CSS — adjacency-only buffer fusion preserving cascade order
- Combine JS / Combine JS Plus — concatenate header and footer scripts
- Gzip — mod_deflate
.htaccessblock for dynamic (non-cached) responses - Browser Caching — Expires/Cache-Control
.htaccessblock - Disable Emojis — remove WordPress emoji scripts, styles, and DNS prefetch
- Lazy Load — native
loading="lazy"+decoding="async"on images and iframes - Render Blocking JS — add
deferto render-blocking scripts - Google Fonts Async — rewrite Google Fonts
<link>to preload +onloadswap with<noscript>fallback - Delay JS — neutralise non-critical external scripts until first user interaction or 7-second idle fallback
Developer-Friendly
- WP-CLI:
wp flexa-cache clear [--url=<url>],wp flexa-cache status,wp flexa-cache preload [start|status|cancel] - REST API:
/flexa-cache/v1/cache/purge,/cache/stats,/cache/preload - Filterable hooks:
flexa_cache/engine/is_cacheable,flexa_cache/engine/buffer,flexa_cache/store/dir,flexa_cache/purged,flexa_cache/settings/languages, and more - Kill switch:
?flexa_cache_optimize=0disables optimization for a single admin request - Exclusion lists for URLs, cookies, user agents, CSS handles, and JS handles
Object Cache (Redis)
- Persistent Redis object cache: caches WordPress options, transients, and post/term/user meta and query results across requests, cutting database load
- Installs a self-contained
object-cache.phpdrop-in with an in-memory L1 + Redis L2 layout - One-click enable/disable and a “Test & save connection” form that writes the config to
wp-config.php(secrets never touch the database) - Crash-safe by design: if Redis becomes unreachable the site keeps running (degrades to in-memory) with an admin notice and a circuit breaker — never a white screen
- Serializers (PHP, igbinary, JSON, msgpack) and compression (LZ4, Zstd, LZF), key prefetch, and alloptions splitting
- Live analytics: hit-ratio / operations / memory charts, a per-group key table, Query Monitor panel, and WP-CLI (
analytics,watch,groups,slowlog) - Multisite aware, with per-site and network flush scopes
- Advanced Redis topologies — Cluster, Sentinel, Replicated (master/replica), and the Relay/Predis clients — are available through the separate Flexa Cache Pro add-on
Source code for compiled JavaScript and CSS
The plugin ships a compiled admin UI in assets/dist/. The human-readable
source (apps/admin/src) and the build tooling are publicly available at:
https://github.com/flexatech/flexa-cache
The admin UI is built with npm and Vite:
npm installnpm run build(ornpm run devfor a watched dev build with HMR)
Installation
- Upload the plugin files to
/wp-content/plugins/flexa-cache, or install through the WordPress Plugins screen. - Activate the plugin through the Plugins screen.
- Open Flexa Cache from the admin sidebar (located below Settings).
- Enable the Cache System toggle and click Save Settings.
After a plugin update: deactivate and reactivate Flexa Cache once so the advanced-cache.php drop-in is refreshed. This step is only needed after an update that changes the drop-in — the release notes will say so when it applies.
FAQ
-
How does the page cache work?
-
On activation, Flexa Cache installs an
advanced-cache.phpdrop-in intowp-content/and addsdefine('WP_CACHE', true)towp-config.php. On the next uncached request, the plugin generates a static HTML file. Every subsequent request for that URL is served directly from the file — no PHP execution, no database query. -
Does Flexa Cache work with WooCommerce?
-
Yes. Cart, checkout, and account pages are automatically excluded from the cache. The cache is also purged when a product’s stock level or price changes.
-
Does it work on nginx?
-
The static file cache works on any server (the drop-in uses PHP
readfile()). The Gzip and Browser Caching toggles write Apache.htaccessrules; the plugin’s class docblocks include the nginx equivalent snippets for hosts that need them. -
How do I clear the cache?
-
Click Delete Cache in the Flexa Cache settings page, use
wp flexa-cache clearfrom the command line, or callPOST /wp-json/flexa-cache/v1/cache/purge. To clear a single URL, use the per-URL input in the Cache Stats panel orwp flexa-cache clear --url=https://example.com/page/. -
What does “Minify JS” do?
-
The Minify JS toggle is a documented safe no-op when used alone. JavaScript is only ever concatenated (via Combine JS), never minified in isolation — the plugin ships no JS parser. If you want JS minification, enable Combine JS together with Minify JS.
-
Will it conflict with other caching plugins?
-
Flexa Cache checks for a foreign
advanced-cache.phpon activation and refuses to overwrite it. If you already have a caching plugin installed, deactivate it and remove its drop-in before activating Flexa Cache. -
Where are the plugin settings?
-
In the WordPress admin sidebar, click Flexa Cache (located below Settings). Settings are organised into five sections: Cache, Invalidation, Performance, Exclusions, and Danger Zone.
-
What is the Object Cache and do I need Redis?
-
The Object Cache is a persistent store for WordPress’s internal data (options, transients, meta, query results) that normally lives in the database. Backing it with Redis means those lookups are served from memory across requests, which reduces database load — especially on WooCommerce and other dynamic sites. It requires a reachable Redis server and the PHP
redisextension. It is independent of the page cache; you can run either or both. -
What happens if Redis goes down?
-
Nothing breaks. Flexa Cache detects the failure mid-request, serves from its in-memory layer for the rest of the request, and opens a short-lived circuit breaker so the next requests do not stampede a dead server. An admin notice and a Site Health warning appear, and the cache recovers automatically once Redis is back.
-
Does enabling the Object Cache store my Redis password in the database?
-
No. The connection settings (including the password) are written to a marked block in
wp-config.php, never to the options table, and the password is masked in every diagnostic, REST, and CLI output. -
Can I use Redis Cluster, Sentinel, or Relay?
-
Those advanced topologies (Cluster, Sentinel, Replicated master/replica, and the Relay/Predis clients) ship in the separate Flexa Cache Pro add-on. The free plugin covers a single Redis server, which suits the large majority of sites.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“Flexa Cache” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “Flexa Cache” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
1.1.1
- Fix: Delay JS / Render-Blocking JS / Combine JS no longer break scripts that carry inline code. A script with
wp_add_inline_script()before/after data (most visibly WordPress core’swp-i18n, whose after-script callswp.i18n.setLocaleData()) is now left un-delayed, un-deferred, and un-combined, because that inline companion runs at parse time and would otherwise throw “wp is not defined”. The Combine JS path recovers the handle from the tag’sidattribute so it can protect the same scripts even though it operates on the rendered buffer. This also resolves knock-on breakage of scripts that depend on those globals. - Fix: the admin-bar “Flexa Cache” submenu no longer stays hidden on hover when JS optimization is enabled. The WordPress toolbar script depends on
hoverintent-js; Combine JS / Delay JS / Render-Blocking now auto-exclude it alongsideadmin-bar(it was previously left in), so the submenu opens reliably. - Compatibility: tested and confirmed working with WordPress 7.1. No other code changes were required — the admin app loads only on the plugin’s own settings screen (not the iframed block editor) and uses no
@wordpress/components, jQuery UI, or block-editor assets affected by 7.1.
1.1.0
- New: Object Cache (Redis) module — a persistent object cache installed as an
object-cache.phpdrop-in (in-memory L1 + Redis L2). Caches options, transients, and meta/query data across requests. - New: admin Object Cache tab — status banner, “Test & save connection” (writes
wp-config.php, secrets never in the database), metrics, groups table, and flush controls. - New: crash-safe resilience — in-request degrade to in-memory, cross-request circuit breaker with cooldown,
on_errorpolicy, and a Site Health check. Redis outages never cause a white screen. - New: serializers (PHP/igbinary/JSON/msgpack) and compression (LZ4/Zstd/LZF), key prefetch, alloptions splitting, and per-
*-queriesTTL. - New: observability — hit-ratio/ops/memory analytics, per-group key table, Query Monitor panel, request footnote, and a vendor-neutral
flexa_cache/object_cache/tracehook. - New: WP-CLI
wp flexa-cache oc(enable,disable,status,flush,diagnostics,analytics,watch,groups,slowlog,cli,reset), and REST endpoints under/flexa-cache/v1/object-cache. - New: multisite support with per-site and network flush scopes; TLS, unix socket, and ACL (username) connections.
- Note: advanced Redis topologies (Cluster, Sentinel, Replicated, Relay/Predis) are provided by the separate Flexa Cache Pro add-on.
1.0.3
- Cleanup: removed the unused
/pingstarter REST endpoint left over from the plugin scaffold. - Docs: the readme source-code section now documents the build tooling (
npm installnpm run build) alongside the public repository link.
1.0.2
- Fix: CSS minify (aggressive HTML minify and CSS combine) no longer strips whitespace around
:, which previously fused descendant combinators into compound selectors before a pseudo-class (:root :where(…):root:where(…)) and silently dropped WordPress global-styles rules — most visibly Gutenberg button styles. Whitespace around{ } ; ,is still collapsed.
1.0.1
- Security: cache purge, stats, and preload REST endpoints now require the
manage_optionscapability instead ofupload_files, so only administrators can trigger site-wide cache operations. - Hardening: cached widget output is now passed through
wp_kses_post()before it is echoed. - Cleanup: removed a dead pre-WordPress-5.7 raw
<script>fallback in the delay-JS loader; the corewp_print_inline_script_tag()helper is now always used. - CSS/JS combine and minify now rewrite the URL of the stylesheet/script tag WordPress already enqueued and printed, instead of emitting a freshly-built tag — preserving the original tag attributes.
1.0.0
- Initial release: page cache drop-in, 23 optimization toggles, WP-CLI, REST API, cache preloader, widget cache, mobile theme cache, i18n-ready.
