{"id":336362,"date":"2026-07-12T04:30:46","date_gmt":"2026-07-12T04:30:46","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/flexa-cache\/"},"modified":"2026-08-13T10:00:02","modified_gmt":"2026-08-13T10:00:02","slug":"flexa-cache","status":"publish","type":"plugin","link":"https:\/\/pt.wordpress.org\/plugins\/flexa-cache\/","author":23412324,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.1","stable_tag":"1.1.1","tested":"7.1","requires":"5.9","requires_php":"8.2","requires_plugins":null,"header_name":"Flexa Cache","header_author":"FlexaTech","header_description":"Flexa Cache for WordPress.","assets_banners_color":"fdfdfd","last_updated":"2026-08-13 10:00:02","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":142,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.1":{"tag":"1.0.1","author":"flexatech","date":"2026-07-12 04:30:38"},"1.0.2":{"tag":"1.0.2","author":"flexatech","date":"2026-07-12 14:10:02"},"1.0.3":{"tag":"1.0.3","author":"flexatech","date":"2026-08-08 09:28:41"},"1.1.1":{"tag":"1.1.1","author":"flexatech","date":"2026-08-13 10:00:02"}},"upgrade_notice":{"1.1.1":"<p>Compatibility release for WordPress 7.1. No functional changes.<\/p>","1.1.0":"<p>Adds an optional Redis Object Cache module (persistent object cache with a crash-safe fallback). The page cache is unchanged. Enable the Object Cache from the new admin tab; a reachable Redis server and the PHP redis extension are required.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3604442,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3604442,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3604442,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3604442,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.1","1.0.2","1.0.3","1.1.1"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[146,7913,3853,247,45952],"plugin_category":[52,54],"plugin_contributors":[255540],"plugin_business_model":[],"class_list":["post-336362","plugin","type-plugin","status-publish","hentry","plugin_tags-cache","plugin_tags-object-cache","plugin_tags-page-cache","plugin_tags-performance","plugin_tags-redis","plugin_category-performance","plugin_category-security-and-spam-protection","plugin_contributors-flexatech","plugin_committers-flexatech"],"banners":{"banner":"https:\/\/ps.w.org\/flexa-cache\/assets\/banner-772x250.png?rev=3604442","banner_2x":"https:\/\/ps.w.org\/flexa-cache\/assets\/banner-1544x500.png?rev=3604442","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/flexa-cache\/assets\/icon-128x128.png?rev=3604442","icon_2x":"https:\/\/ps.w.org\/flexa-cache\/assets\/icon-256x256.png?rev=3604442","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Flexa Cache is a full-featured WordPress page-cache and front-end optimization plugin. It installs a self-contained <code>advanced-cache.php<\/code> drop-in that serves compressed static HTML files before WordPress even loads \u2014 the same technique used by WP Fastest Cache and W3 Total Cache \u2014 giving you maximum TTFB improvement on both Apache and nginx hosts.<\/p>\n\n<p><strong>Page Cache<\/strong><\/p>\n\n<ul>\n<li>Static HTML cache served by a pre-WordPress drop-in (no PHP\/MySQL on cache hits)<\/li>\n<li>Gzip pre-compressed <code>.gz<\/code> files served natively<\/li>\n<li>Separate mobile cache variant (<code>index-mobile.html<\/code>) when Mobile Theme is enabled<\/li>\n<li>Smart invalidation: purge on new post, updated post, comments, theme\/menu\/widget changes, and WooCommerce product\/stock updates<\/li>\n<li>Per-URL cache purge from the admin UI, WP-CLI, or REST API<\/li>\n<li>Cache preloader via Action Scheduler (or WP-Cron fallback) with start\/cancel\/status controls<\/li>\n<li>Widget output cache with O(1) versioned-key invalidation<\/li>\n<\/ul>\n\n<p><strong>Front-End Optimization<\/strong><\/p>\n\n<ul>\n<li>Minify HTML (whitespace collapse) and Minify HTML Plus (inline CSS\/JS trim)<\/li>\n<li>Minify CSS and Minify CSS Plus (deeper punctuation squeeze)<\/li>\n<li>Combine CSS \u2014 adjacency-only buffer fusion preserving cascade order<\/li>\n<li>Combine JS \/ Combine JS Plus \u2014 concatenate header and footer scripts<\/li>\n<li>Gzip \u2014 mod_deflate <code>.htaccess<\/code> block for dynamic (non-cached) responses<\/li>\n<li>Browser Caching \u2014 Expires\/Cache-Control <code>.htaccess<\/code> block<\/li>\n<li>Disable Emojis \u2014 remove WordPress emoji scripts, styles, and DNS prefetch<\/li>\n<li>Lazy Load \u2014 native <code>loading=\"lazy\"<\/code> + <code>decoding=\"async\"<\/code> on images and iframes<\/li>\n<li>Render Blocking JS \u2014 add <code>defer<\/code> to render-blocking scripts<\/li>\n<li>Google Fonts Async \u2014 rewrite Google Fonts <code>&lt;link&gt;<\/code> to preload + <code>onload<\/code> swap with <code>&lt;noscript&gt;<\/code> fallback<\/li>\n<li>Delay JS \u2014 neutralise non-critical external scripts until first user interaction or 7-second idle fallback<\/li>\n<\/ul>\n\n<p><strong>Developer-Friendly<\/strong><\/p>\n\n<ul>\n<li>WP-CLI: <code>wp flexa-cache clear [--url=&lt;url&gt;]<\/code>, <code>wp flexa-cache status<\/code>, <code>wp flexa-cache preload [start|status|cancel]<\/code><\/li>\n<li>REST API: <code>\/flexa-cache\/v1\/cache\/purge<\/code>, <code>\/cache\/stats<\/code>, <code>\/cache\/preload<\/code><\/li>\n<li>Filterable hooks: <code>flexa_cache\/engine\/is_cacheable<\/code>, <code>flexa_cache\/engine\/buffer<\/code>, <code>flexa_cache\/store\/dir<\/code>, <code>flexa_cache\/purged<\/code>, <code>flexa_cache\/settings\/languages<\/code>, and more<\/li>\n<li>Kill switch: <code>?flexa_cache_optimize=0<\/code> disables optimization for a single admin request<\/li>\n<li>Exclusion lists for URLs, cookies, user agents, CSS handles, and JS handles<\/li>\n<\/ul>\n\n<p><strong>Object Cache (Redis)<\/strong><\/p>\n\n<ul>\n<li>Persistent Redis object cache: caches WordPress options, transients, and post\/term\/user meta and query results across requests, cutting database load<\/li>\n<li>Installs a self-contained <code>object-cache.php<\/code> drop-in with an in-memory L1 + Redis L2 layout<\/li>\n<li>One-click enable\/disable and a \"Test &amp; save connection\" form that writes the config to <code>wp-config.php<\/code> (secrets never touch the database)<\/li>\n<li>Crash-safe by design: if Redis becomes unreachable the site keeps running (degrades to in-memory) with an admin notice and a circuit breaker \u2014 never a white screen<\/li>\n<li>Serializers (PHP, igbinary, JSON, msgpack) and compression (LZ4, Zstd, LZF), key prefetch, and alloptions splitting<\/li>\n<li>Live analytics: hit-ratio \/ operations \/ memory charts, a per-group key table, Query Monitor panel, and WP-CLI (<code>analytics<\/code>, <code>watch<\/code>, <code>groups<\/code>, <code>slowlog<\/code>)<\/li>\n<li>Multisite aware, with per-site and network flush scopes<\/li>\n<li>Advanced Redis topologies \u2014 Cluster, Sentinel, Replicated (master\/replica), and the Relay\/Predis clients \u2014 are available through the separate <strong>Flexa Cache Pro<\/strong> add-on<\/li>\n<\/ul>\n\n<p><strong>Source code for compiled JavaScript and CSS<\/strong><\/p>\n\n<p>The plugin ships a compiled admin UI in <code>assets\/dist\/<\/code>. The human-readable\nsource (<code>apps\/admin\/src<\/code>) and the build tooling are publicly available at:<\/p>\n\n<p>https:\/\/github.com\/flexatech\/flexa-cache<\/p>\n\n<p>The admin UI is built with npm and Vite:<\/p>\n\n<ol>\n<li><code>npm install<\/code><\/li>\n<li><code>npm run build<\/code>   (or <code>npm run dev<\/code> for a watched dev build with HMR)<\/li>\n<\/ol>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin files to <code>\/wp-content\/plugins\/flexa-cache<\/code>, or install through the WordPress <strong>Plugins<\/strong> screen.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen.<\/li>\n<li>Open <strong>Flexa Cache<\/strong> from the admin sidebar (located below Settings).<\/li>\n<li>Enable the <strong>Cache System<\/strong> toggle and click <strong>Save Settings<\/strong>.<\/li>\n<\/ol>\n\n<p><strong>After a plugin update:<\/strong> deactivate and reactivate Flexa Cache once so the <code>advanced-cache.php<\/code> drop-in is refreshed. This step is only needed after an update that changes the drop-in \u2014 the release notes will say so when it applies.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20does%20the%20page%20cache%20work%3F\"><h3>How does the page cache work?<\/h3><\/dt>\n<dd><p>On activation, Flexa Cache installs an <code>advanced-cache.php<\/code> drop-in into <code>wp-content\/<\/code> and adds <code>define('WP_CACHE', true)<\/code> to <code>wp-config.php<\/code>. On the next uncached request, the plugin generates a static HTML file. Every subsequent request for that URL is served directly from the file \u2014 no PHP execution, no database query.<\/p><\/dd>\n<dt id=\"does%20flexa%20cache%20work%20with%20woocommerce%3F\"><h3>Does Flexa Cache work with WooCommerce?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"does%20it%20work%20on%20nginx%3F\"><h3>Does it work on nginx?<\/h3><\/dt>\n<dd><p>The static file cache works on any server (the drop-in uses PHP <code>readfile()<\/code>). The Gzip and Browser Caching toggles write Apache <code>.htaccess<\/code> rules; the plugin's class docblocks include the nginx equivalent snippets for hosts that need them.<\/p><\/dd>\n<dt id=\"how%20do%20i%20clear%20the%20cache%3F\"><h3>How do I clear the cache?<\/h3><\/dt>\n<dd><p>Click <strong>Delete Cache<\/strong> in the Flexa Cache settings page, use <code>wp flexa-cache clear<\/code> from the command line, or call <code>POST \/wp-json\/flexa-cache\/v1\/cache\/purge<\/code>. To clear a single URL, use the per-URL input in the Cache Stats panel or <code>wp flexa-cache clear --url=https:\/\/example.com\/page\/<\/code>.<\/p><\/dd>\n<dt id=\"what%20does%20%22minify%20js%22%20do%3F\"><h3>What does \"Minify JS\" do?<\/h3><\/dt>\n<dd><p>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 \u2014 the plugin ships no JS parser. If you want JS minification, enable Combine JS together with Minify JS.<\/p><\/dd>\n<dt id=\"will%20it%20conflict%20with%20other%20caching%20plugins%3F\"><h3>Will it conflict with other caching plugins?<\/h3><\/dt>\n<dd><p>Flexa Cache checks for a foreign <code>advanced-cache.php<\/code> on 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.<\/p><\/dd>\n<dt id=\"where%20are%20the%20plugin%20settings%3F\"><h3>Where are the plugin settings?<\/h3><\/dt>\n<dd><p>In the WordPress admin sidebar, click <strong>Flexa Cache<\/strong> (located below Settings). Settings are organised into five sections: Cache, Invalidation, Performance, Exclusions, and Danger Zone.<\/p><\/dd>\n<dt id=\"what%20is%20the%20object%20cache%20and%20do%20i%20need%20redis%3F\"><h3>What is the Object Cache and do I need Redis?<\/h3><\/dt>\n<dd><p>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 \u2014 especially on WooCommerce and other dynamic sites. It requires a reachable Redis server and the PHP <code>redis<\/code> extension. It is independent of the page cache; you can run either or both.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20redis%20goes%20down%3F\"><h3>What happens if Redis goes down?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"does%20enabling%20the%20object%20cache%20store%20my%20redis%20password%20in%20the%20database%3F\"><h3>Does enabling the Object Cache store my Redis password in the database?<\/h3><\/dt>\n<dd><p>No. The connection settings (including the password) are written to a marked block in <code>wp-config.php<\/code>, never to the options table, and the password is masked in every diagnostic, REST, and CLI output.<\/p><\/dd>\n<dt id=\"can%20i%20use%20redis%20cluster%2C%20sentinel%2C%20or%20relay%3F\"><h3>Can I use Redis Cluster, Sentinel, or Relay?<\/h3><\/dt>\n<dd><p>Those advanced topologies (Cluster, Sentinel, Replicated master\/replica, and the Relay\/Predis clients) ship in the separate <strong>Flexa Cache Pro<\/strong> add-on. The free plugin covers a single Redis server, which suits the large majority of sites.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Fix: Delay JS \/ Render-Blocking JS \/ Combine JS no longer break scripts that carry inline code. A script with <code>wp_add_inline_script()<\/code> before\/after data (most visibly WordPress core's <code>wp-i18n<\/code>, whose after-script calls <code>wp.i18n.setLocaleData()<\/code>) 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's <code>id<\/code> attribute 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.<\/li>\n<li>Fix: the admin-bar \"Flexa Cache\" submenu no longer stays hidden on hover when JS optimization is enabled. The WordPress toolbar script depends on <code>hoverintent-js<\/code>; Combine JS \/ Delay JS \/ Render-Blocking now auto-exclude it alongside <code>admin-bar<\/code> (it was previously left in), so the submenu opens reliably.<\/li>\n<li>Compatibility: tested and confirmed working with WordPress 7.1. No other code changes were required \u2014 the admin app loads only on the plugin's own settings screen (not the iframed block editor) and uses no <code>@wordpress\/components<\/code>, jQuery UI, or block-editor assets affected by 7.1.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>New: <strong>Object Cache (Redis)<\/strong> module \u2014 a persistent object cache installed as an <code>object-cache.php<\/code> drop-in (in-memory L1 + Redis L2). Caches options, transients, and meta\/query data across requests.<\/li>\n<li>New: admin Object Cache tab \u2014 status banner, \"Test &amp; save connection\" (writes <code>wp-config.php<\/code>, secrets never in the database), metrics, groups table, and flush controls.<\/li>\n<li>New: crash-safe resilience \u2014 in-request degrade to in-memory, cross-request circuit breaker with cooldown, <code>on_error<\/code> policy, and a Site Health check. Redis outages never cause a white screen.<\/li>\n<li>New: serializers (PHP\/igbinary\/JSON\/msgpack) and compression (LZ4\/Zstd\/LZF), key prefetch, alloptions splitting, and per-<code>*-queries<\/code> TTL.<\/li>\n<li>New: observability \u2014 hit-ratio\/ops\/memory analytics, per-group key table, Query Monitor panel, request footnote, and a vendor-neutral <code>flexa_cache\/object_cache\/trace<\/code> hook.<\/li>\n<li>New: WP-CLI <code>wp flexa-cache oc<\/code> (<code>enable<\/code>, <code>disable<\/code>, <code>status<\/code>, <code>flush<\/code>, <code>diagnostics<\/code>, <code>analytics<\/code>, <code>watch<\/code>, <code>groups<\/code>, <code>slowlog<\/code>, <code>cli<\/code>, <code>reset<\/code>), and REST endpoints under <code>\/flexa-cache\/v1\/object-cache<\/code>.<\/li>\n<li>New: multisite support with per-site and network flush scopes; TLS, unix socket, and ACL (username) connections.<\/li>\n<li>Note: advanced Redis topologies (Cluster, Sentinel, Replicated, Relay\/Predis) are provided by the separate <strong>Flexa Cache Pro<\/strong> add-on.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Cleanup: removed the unused <code>\/ping<\/code> starter REST endpoint left over from the plugin scaffold.<\/li>\n<li>Docs: the readme source-code section now documents the build tooling (<code>npm install<\/code> \u2192 <code>npm run build<\/code>) alongside the public repository link.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Fix: CSS minify (aggressive HTML minify and CSS combine) no longer strips whitespace around <code>:<\/code>, which previously fused descendant combinators into compound selectors before a pseudo-class (<code>:root :where(\u2026)<\/code> \u2192 <code>:root:where(\u2026)<\/code>) and silently dropped WordPress global-styles rules \u2014 most visibly Gutenberg button styles. Whitespace around <code>{ } ; ,<\/code> is still collapsed.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Security: cache purge, stats, and preload REST endpoints now require the <code>manage_options<\/code> capability instead of <code>upload_files<\/code>, so only administrators can trigger site-wide cache operations.<\/li>\n<li>Hardening: cached widget output is now passed through <code>wp_kses_post()<\/code> before it is echoed.<\/li>\n<li>Cleanup: removed a dead pre-WordPress-5.7 raw <code>&lt;script&gt;<\/code> fallback in the delay-JS loader; the core <code>wp_print_inline_script_tag()<\/code> helper is now always used.<\/li>\n<li>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 \u2014 preserving the original tag attributes.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: page cache drop-in, 23 optimization toggles, WP-CLI, REST API, cache preloader, widget cache, mobile theme cache, i18n-ready.<\/li>\n<\/ul>","raw_excerpt":"Page cache, Redis object cache, and front-end optimization: static HTML before WordPress boots plus a persistent object cache, zero configuration.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/pt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/336362","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/pt.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/pt.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=336362"}],"author":[{"embeddable":true,"href":"https:\/\/pt.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/flexatech"}],"wp:attachment":[{"href":"https:\/\/pt.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=336362"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/pt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=336362"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/pt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=336362"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/pt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=336362"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/pt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=336362"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/pt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=336362"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}