Zinn® Cache makes a WordPress site faster wherever it is hosted. On a LiteSpeed server it drives the server's own page cache. When nginx, Varnish or Apache already caches pages in front of WordPress, it does not add a second page cache behind them: it tells them which pages changed. On any other server it stores each page as a file and serves it before WordPress loads. It also installs a Redis object cache that proves it is working, and purges only the pages a change affects.
It is installed for you on sites hosted with Zinn Digital®, and it works the same way on any other host. There is one Zinn® cache plugin; Zinn® Cache Pro is an optional add-on that installs on top of it (see Pro features below).
What it does
- Page cache on any server. On a LiteSpeed server it stamps
X-LiteSpeed-Cache-Control and X-LiteSpeed-Tag headers so the web server serves full pages without hitting PHP or MySQL. On any other server it stores each complete page as a file under wp-content/cache/zinn-cache/ and serves it from advanced-cache.php before WordPress loads (it adds define( 'WP_CACHE', true ); to wp-config.php for that, and removes it again when the page cache is turned off). Only visitors who are not signed in are served stored pages, and only addresses with no query string (tracking parameters such as utm_source are ignored). If the third-party LiteSpeed Cache plugin is present, page caching is deferred to it instead.
- Smart auto-purge. When content changes — a post or page is saved, trashed or deleted, a comment is added or moderated, a taxonomy term is edited — only the affected pages (and the listings they appear on: its home page, archive, categories, tags and author page) are purged, on every cache layer: LiteSpeed by cache tag, the disk cache, nginx, Varnish, Apache and Cloudflare by address. A change that touches every page (the theme, a plugin, an update, a menu, the site title) starts the paced refresh described below. The plugin can also mirror each purge to a control panel over a signed webhook, but only when
ZINN_CACHE_PANEL_URL is defined — and the Zinn Digital® platform does not set it today, so on a Zinn-hosted site purges happen on the server and are not mirrored anywhere.
- Redis object cache. A one-click toggle installs a self-contained Redis object-cache drop-in (requires the phpredis extension), offloading repeated database reads. It signs in with a plain password or a Redis 6+ ACL username and password, honours the usual
WP_REDIS_* constants (including WP_REDIS_PASSWORD given as array( 'user', 'password' ), WP_REDIS_PATH and WP_REDIS_MAXTTL), and proves itself with a write-and-read round trip: if Redis refuses the login or the data, the settings screen says why instead of showing a cache that stores nothing. The plugin never overwrites another caching plugin's drop-in, refreshes its own drop-in after an update, and the drop-in falls back to an in-memory cache if Redis is unreachable, so the site keeps working. Choose the igbinary serializer (smaller and faster, when the extension is installed) or PHP's own; each stored value is read in the format it was written in, so switching is safe at any time.
- Host-managed object cache. A host that installs this drop-in for its customers (as Zinn Digital® hosting does) defines
ZINN_CACHE_MANAGED_OBJECT_CACHE; the plugin then never removes that drop-in and shows the cache as managed. A host whose Redis users may not run SCAN can define ZINN_CACHE_FLUSH_SOCKET, the path of a local helper that deletes only the calling site's keys, so "Flush cache" keeps working.
- Server caches in front of WordPress: nginx, Varnish, Apache. Zinn® Cache detects an nginx
proxy_cache/fastcgi_cache, Varnish, Apache mod_cache or LiteSpeed in front of the site from the response headers, and then keeps its own disk cache out of the way. Tell it how to reach the cache and it purges changed pages there: nginx by a purge request (the ngx_cache_purge module), by deleting the cache files when WordPress can read the cache folder, or by writing the changed addresses to a folder your host's purger reads; Varnish by PURGE or BAN; Apache's disk cache by deleting the entry files. Signed-in visitors, excluded addresses and form posts are sent Cache-Control: private, no-store, so a server cache never keeps one person's page for the next.
- Cloudflare purge. With a zone ID and an API token limited to Cache Purge, changed pages are purged from Cloudflare's edge by address, in batches, from WP-Cron so editors never wait on it. Emptying the whole zone is off unless you allow it.
- Paced refresh instead of "purge everything". An update, a plugin activation, a theme or menu change or a site-wide setting no longer empties the cache at once — that sends every visitor to WordPress in the same minute. Zinn® Cache refreshes the site a batch a minute instead (100 pages by default), newest first, all the way to the end, and pauses while the server is busy. "Empty all now" is still there for the rare time you want exactly that.
- Status screen and per-address purge. One screen says what serves your pages (LiteSpeed, nginx, Varnish, Apache, Cloudflare or the disk cache), what the last check saw in front of the site, how big each cache is where WordPress can read it (and says plainly when it cannot), the purge queue, the paced refresh and the last purges with what each layer answered. Purge any address from there, check the hit ratio on a sample of pages, or start and stop a refresh.
- Lighter pages. Control the WordPress Heartbeat, show text at once while Google Fonts load (
display=swap), connect early to the servers your pages use, and serve images, CSS, JavaScript and fonts from a pull CDN address.
- Safe cache exclusions. Ships with sensible WordPress and WooCommerce/Easy Digital Downloads defaults — cart, checkout, my-account, REST/AJAX, preview, search, and any logged-in or session-cookie request are never cached. Extra path, query-key, and cookie-prefix rules can be added per site.
Remote purging
A REST endpoint,
POST /wp-json/zinn-cache/v1/purge, purges everything, specific URLs, or specific tags. It accepts a logged-in administrator, or any caller holding the site's
ZINN_CACHE_PANEL_SECRET who signs the request body with it (HMAC-SHA256) — so a deploy script or your own tooling can clear the cache. Your Zinn® dashboard does not call it today; there is no dashboard purge button for this plugin yet.
Pro features
Everything above is free and stays free.
Zinn® Cache Pro is an add-on that installs on top of this plugin and adds:
- A cache analytics screen: hit ratio, memory, keys and the slowest cache commands.
- A slow-query and uncached-call finder that names the plugin or theme responsible.
- An in-memory APCu tier in front of Redis for the hottest keys, plus prefetching and compression (zstd, lzf or gzip).
- Tag-based purging for posts, terms and WooCommerce products, so only what changed is cleared, with the page and object caches purged together.
- Automatic cache warm-up after a purge and when a paced refresh finishes, WebP and AVIF images, missing image width and height added from the file, unused-CSS removal and delayed JavaScript.
- Cloudflare's own cache-hit ratio for the last 24 hours on the status screen.
- Scheduled database clean-up with a preview, and per-page cache rules.
- Cache health alerts in your Zinn Digital® dashboard when the hit ratio drops or memory fills.
Pro costs $49 a year for one site, $99 for five sites and $199 for unlimited sites, and every plan starts with a 14-day free trial, no card needed. Start it from the Pro tab of the Zinn® Cache screen.
- Upload the
zinn-cache folder to /wp-content/plugins/ (this is done automatically as part of the Zinn® deploy footprint).
- Activate the plugin through the Plugins screen in WordPress.
- Go to Zinn Digital® → Cache to configure the full-page cache, object cache, auto-purge, and exclusions.
Optionally define these constants in
wp-config.php (set automatically on Zinn-hosted sites):
ZINN_CACHE_PANEL_URL and ZINN_CACHE_PANEL_SECRET — enable signed purge mirroring to the control plane.
WP_REDIS_HOST, WP_REDIS_PORT, WP_REDIS_DATABASE, WP_REDIS_PASSWORD, WP_REDIS_PREFIX — override the object-cache connection.
1.11.1
- Security: the AI-app sign-in's "Disconnect" action now checks the signed-in user's capability as well as the nonce (WordPress.org review standards).
1.11.0
- Updates no longer empty the cache. For every site: a WordPress, plugin or theme update, a plugin activation or deactivation, a theme switch, a menu save and a site-wide setting now start a paced refresh (100 pages a minute by default, paused while the server is busy) instead of purging everything at once. Empty all now (formerly "Purge everything now") still empties the cache at once.
- New: server caches in front of WordPress. nginx (purge request, cache files, or a spool folder for the host's purger), Varnish (PURGE or BAN) and Apache mod_cache are purged when content changes, and Zinn® Cache no longer installs its own page cache behind one. Sites with no server cache keep the disk page cache exactly as before.
- New: Cloudflare purge by address (batched, from WP-Cron), with emptying the zone off unless allowed.
- New: Status tab — what serves your pages, what is in front of the site, cache sizes, the purge queue and log, a hit-ratio check, per-address purge and the paced refresh.
- New: serializer setting for the Redis object cache (igbinary or PHP). The drop-in (revision 4) reads each value in the format it was written in, so a server that gains or loses igbinary no longer misreads stored values.
- New: Heartbeat control, Google Fonts
display=swap, early connections (preconnect) and a CDN address for static files.
- New: WP-CLI
wp zinn-cache server detect, wp zinn-cache server drain and wp zinn-cache refresh start|stop|status|tick; purge url reports what each cache layer answered. REST routes and AI-agent (MCP) tools for the status, per-address purge, detection and the refresh.
- A purge by address now reaches a LiteSpeed server too (it used to purge only by tag there).
1.10.10
- WordPress MCP adapter updated to 0.7.1 (MCP protocol 2026-07-28, session-storage security fix); no deprecation notice from the bundled copy.
1.10.9
- Plural forms in every language now follow that language's own plural rules (Russian, Polish, Czech, Croatian, Serbian, Arabic, Hebrew, French and others), re-filled by the translator with a human check on the forms it could not tell apart.
1.10.8
- AI agents (MCP): this plugin's tools now always appear to your AI app, even when another Zinn® plugin on the same site is an older version.
1.10.7
- More dependable AI app sign-in (MCP): Claude, ChatGPT and other AI apps connect to your site the same way whether a visitor, a scheduled task or a WP-CLI command started WordPress.
1.10.6
- Faster and lighter on servers: WP-CLI commands, scheduled tasks and AI agents (MCP) on your site now start with less memory, so they keep working beside large plugins such as WooCommerce.
1.10.5
- Translation template refreshed so every language stays complete.
1.10.4
- AI agent (MCP) tools load faster and use less memory.
1.10.3
- The MCP connection's sign-in response no longer switches off JSON escaping.
1.10.2
- Lighter start for WP-CLI commands: works within a 128 MB memory limit beside WooCommerce and other large plugins.
1.10.1
- Fixes a site build failure: Zinn® Cache no longer stops WordPress from loading if one of its files is missing.
1.10.0
- New: a title, description, redirect or site-wide setting changed in Zinn® SEO reaches visitors straight away: exactly the pages it changed leave the cache, and a bulk change is one purge.
1.9.15
- Packaging only, no behaviour change: the licensing icon is now shipped as assets/images/sdk-icon.png instead of a file named like a WordPress.org directory asset (WordPress.org review guidance).
1.9.14
- The Zinn® panel now appears only on this plugin's own screens, never on the WordPress dashboard (WordPress.org guideline 11).
1.9.13
- Updated Freemius SDK to the latest version.
1.9.12
- The readme's External services section now lists the request made when an AI app signs in to the site's MCP server (its public OAuth client metadata); no behaviour change.
1.9.11
- Security-scan annotation on the AI agents (MCP) sign-in screen (no behaviour change): every value on its Allow button is escaped.
1.9.10
- New:
wp zinn-cache purge all|url|post, so a stale page can be cleared from the command line. Fixed: "Purge everything now" and the zinn_cache_purge_all action did nothing; a purge from WP-CLI on a LiteSpeed server is now sent with the next request instead of being dropped.
1.9.9
- Saving a draft, pending or scheduled post no longer empties the cache of your home page and archives; unpublishing a post still clears its pages.
1.9.8
- AI apps (Claude, ChatGPT) can now sign in with OAuth on a site where this is the only Zinn® plugin with an AI-agent server; the sign-in did not start there.
1.9.7
- MCP tools for AI connector directories: tool descriptions state only what each tool does (no references to other tools); every tool that takes input declares it; list results reach MCP clients as objects.
1.9.6
- Serbian: quotation marks are now „…“ throughout, as the Serbian WordPress translation team writes them.
1.9.5
- Translations follow each language's WordPress.org translation team style guide: its quotation marks, spacing before punctuation, apostrophes and ellipsis, and the forms of address it uses.
1.9.4
- Ukrainian: a site's visitors are now «відвідувачі» everywhere; some screens called them «користувачі» (users).
1.9.3
- Japanese follows the WordPress.org Japanese team's style guide: a half-width space around Latin text, half-width colons and question marks.
1.9.2
- New: two wp-config.php switches for the Zinn Digital® panel. define( 'ZINN_CACHE_PROMO', false ); removes the panel (dashboard widget, settings block and footer), and define( 'ZINN_CACHE_PROMO_HOSTING_URL', 'https://…' ); points its hosting offer at another https address.
1.9.1
- Security: the AI-app sign-in (MCP OAuth) checks a client's metadata address more strictly before fetching it (a public web address only, a limit per address, and a refused address remembered).
1.9.0
- AI apps such as Claude and ChatGPT can connect by signing in (OAuth 2.1) — no application password needed; every MCP tool declares whether it is read-only or destructive.
1.8.4
- Every bundled translation is redone with the current Google model: each locale in its own script (Serbian in Cyrillic), in the register its WordPress translation team uses, with the original spacing, placeholders and entities preserved.
1.8.3
1.8.2
- On sites hosted by Zinn Digital®, this plugin is now installed from WordPress.org, so it updates from WordPress.org like any directory plugin. No change to what it does.
1.8.1
- Fix: with WooCommerce active, every WP-CLI command (for example
wp option get) used about 6 MB more memory than before the AI agents (MCP) release, which could push a site over a 128M limit. The site's MCP server now starts only for wp mcp-adapter and on web requests; define ZINN_MCP_DISABLED in wp-config.php to turn every Zinn® MCP server off.
1.8.0
- AI agents (MCP) and REST: read the cache status, purge, change every setting and read the diagnostics from AI apps, with your WordPress permissions (administrators). On by default; switch under Cache → AI agents (MCP).
1.7.7
- Hardened: the page cache refuses a request whose Host header is only dots, so a stored page is only ever read from, or written to, that host's own folder. No stored page could be reached this way before; the request is now refused on its shape.
1.7.6
- Readme: the WordPress.org edition keeps its disclosure of the hosting-customer discount request, and says plainly that the card never contacts the platform's update address.
1.7.5
- New: on a site hosted by Zinn Digital®, the settings screen offers hosting customers a personal discount code for their first payment of Zinn® Cache Pro. It is not shown once Pro is active, or on any site Zinn Digital® does not host.
1.7.4
- Fixed: this plugin's .htaccess rules are written above WordPress's own rewrite rules, where they take effect on every page (before, a block could land below WordPress's catch-all and only apply to the home page); a block written below them earlier is moved on the next admin page load.
1.7.3
- Freemius's own packages now match ours byte for byte: the upload that failed on 2026-09-29 is fixed, and nothing else changes.
1.7.2
- Never stops the site if the bundled Freemius SDK is missing: the cache keeps working without it, and
wp zinn-cache status reports freemius=false.
1.7.1
1.7.0
- New: a page cache for servers that are not LiteSpeed. Each page is stored as a file and served before WordPress loads; purges clear exactly the pages a change affects.
- The object-cache drop-in (revision 3) lets Zinn® Cache Pro add its features without replacing it.
1.6.0
- Smaller download: the editable translation sources (.po) are no longer shipped; WordPress only ever loads the compiled .mo and .l10n.php files, which are unchanged.
1.5.0
- Updates install whenever you click Update, even months later: the download link is fetched fresh at install time instead of expiring in WordPress's saved update data.
1.4.0
- New
wp zinn-cache status --format=json reports whether the object cache is really storing data (connected), or has silently fallen back to memory (fallback) and why (last_error), with the Redis server's hit ratio; the last result is kept in the zinn_cache_object_cache_status transient.
- With the page cache switched off, the plugin no longer writes an empty block into .htaccess, and removes one left by an earlier version.
- The object-cache drop-in is loaded by WordPress on whatever PHP the site runs, so it no longer uses any PHP 8-only function: it runs on PHP 7.4 and later. The plugin itself still requires PHP 8.2.
1.3.7
- Security hardening: the design-token stylesheet validates every component id and strips anything that could close the inline style.
1.3.6
- The Translations section no longer says the plugin has 56 user-visible strings. The plugin has grown to nearly three times that many, and every one of them is translated; the count was typed by hand and stopped being true as strings were added, so it is gone rather than corrected.
1.3.5
- The plugin's description in your Plugins list no longer offers remote purge from your Zinn® dashboard or one-click admin login. Neither is part of this plugin: one-click login moved out in 1.3.2, and the dashboard does not send purges to it. It now names what the plugin does — smart auto-purge, a signed purge endpoint for your own tools, a Redis object-cache toggle and safe exclusions — in every language it ships.
1.3.4
- The readme no longer describes one-click admin login, which moved out of this plugin in 1.3.2, and the settings are found under Zinn Digital® → Cache. Screenshots added for the WordPress.org listing. Tested up to: 7.1 — the major version, as WordPress.org requires.
1.3.3
- Tested up to WordPress 7.1.1.
1.3.1
- In a right-to-left admin language, the Zinn Digital® menu entry showed its trademark symbol on the wrong side of the name. The name is now isolated so it reads correctly in Arabic, Hebrew, Persian, Pashto and Urdu.
- Number fields on the settings screen are now wide enough to show the whole value. A long value — a page-cache lifetime of 604800 seconds, say — was cut off to its first few digits, so the setting looked wrong even when it was right.
- This readme no longer says cache purges are driven from your Zinn® dashboard. The purge endpoint in the plugin is real and works for an administrator or a caller holding the site's secret, but the platform does not yet send purges to it or receive purge mirrors from it, so the description said more than the product does.
1.3.0
- When somebody's access to a site is revoked in your Zinn® dashboard, the WordPress admin session they already had open now ends on their very next click. Before this release a one-click login that was already open kept working until WordPress ended it on its own — up to 48 hours — so removing a developer, an agency or a former member of staff did not take effect straight away for whoever still had a tab open.
- Only sessions that were opened from your Zinn® dashboard are ended. Your own WordPress logins, and anyone else's, are untouched.
1.2.3
- The admin screens' styles and scripts are now enqueued through WordPress rather than printed into the page, so they can be dequeued, deferred or optimised by your site like any other asset — and they still work on a site whose security policy forbids inline code.
- The page-cache decision no longer leaves an output buffer open for WordPress to unwind at the end of the request; the plugin closes its own and never touches anybody else's.
- One-click login from your Zinn® dashboard now claims its single-use token atomically, so the same token can never be accepted twice even on a site with no object cache.
1.2.2
- Translations: every string this plugin's admin shows is now translated in every bundled language. A few strings the machine translator refused were shipping in English; they are now translated by hand.
1.2.1
- Hardening: a settings rule can no longer be mistaken for a PHP function with the same name. The same shared settings code is what stopped Zinn® Translate saving its settings. Nothing about how this plugin behaves changes.
1.2.0
Settings moved under the one Zinn Digital® menu, with per-post-type cache lifetimes, a browser-cache lifetime, a signed-in-visitor rule, a purge-on-comment switch, a Redis password field, and a status panel that tells you when the server is not LiteSpeed and the cache is therefore doing nothing.
1.1.2
- Fixed: the plugin told the update service it was version 1.0.0, so a site already on the latest version was offered the same version again on every check and re-installed it.
1.1.1
- Fixed: changing the Site Title, tagline, front-page, permalink, posts-per-page, widget or theme settings, or saving a menu, now purges the whole page cache. Previously every cached page kept the old value until it expired.
1.1.0
- Added the Zinn® panel: links to Zinn Digital® hosting, the Zinn® marketplace, Zinn Hub® and this plugin's user guide, from inside the WordPress admin.
1.0.0
- Initial release: LSCache control, smart tag-based auto-purge, Redis object-cache toggle, safe cache exclusions, and a signed remote-purge REST endpoint.