{"id":256193,"date":"2026-01-25T16:32:42","date_gmt":"2026-01-25T16:32:42","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/quantumcache\/"},"modified":"2026-04-03T14:21:17","modified_gmt":"2026-04-03T14:21:17","slug":"quantumcache","status":"publish","type":"plugin","link":"https:\/\/pcd.wordpress.org\/plugins\/quantumcache\/","author":23382050,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"0.1.7","stable_tag":"0.1.7","tested":"6.9.4","requires":"6.0","requires_php":"8.0","requires_plugins":null,"header_name":"QuantumCache","header_author":"Aaron DeLong","header_description":"Deterministic, tag-based query & fragment caching for anonymous traffic. Redis preferred with MySQL fallback. Prevents wp_options\/wp_postmeta bloat.","assets_banners_color":"","last_updated":"2026-04-03 14:21:17","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/paypal.me\/quantumcache","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":217,"num_ratings":0,"support_threads":1,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.1.5":{"tag":"0.1.5","author":"adelong01","date":"2026-01-25 16:30:33"},"0.1.6":{"tag":"0.1.6","author":"adelong01","date":"2026-03-02 20:45:38"},"0.1.7":{"tag":"0.1.7","author":"adelong01","date":"2026-04-03 14:21:17"}},"upgrade_notice":{"0.1.2":"<p>Admin refinements, PHPCS compliance, Redis purge, and safer URI handling.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3447166,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3447166,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.1.5","0.1.6","0.1.7"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Settings page showing store mode and Redis options.","2":"Cache statistics and purge controls.","3":"Network panel showing <code>X-QC-*<\/code> debug headers."},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[144,153,441,247,45952],"plugin_category":[52,54,59],"plugin_contributors":[254636],"plugin_business_model":[],"class_list":["post-256193","plugin","type-plugin","status-publish","hentry","plugin_tags-caching","plugin_tags-database","plugin_tags-multisite","plugin_tags-performance","plugin_tags-redis","plugin_category-performance","plugin_category-security-and-spam-protection","plugin_category-utilities-and-tools","plugin_contributors-adelong01","plugin_committers-adelong01"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/quantumcache\/assets\/icon-128x128.png?rev=3447166","icon_2x":"https:\/\/ps.w.org\/quantumcache\/assets\/icon-256x256.png?rev=3447166","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>QuantumCache accelerates WordPress by caching database query results and content fragments used to build pages. Instead of caching entire HTML pages, it reduces the database work required to render pages while preserving WordPress\u2019s native invalidation behavior.<\/p>\n\n<p>It is <em>not<\/em> an output buffer or page cache, and it does not replace existing page caching solutions.<\/p>\n\n<h3>Features<\/h3>\n\n<ul>\n<li>Caches the results of the main front-end <code>WP_Query<\/code> for anonymous requests.<\/li>\n<li>Tag-based invalidation: purge by post ID, post type, or taxonomy.<\/li>\n<li>Fragment caching for <code>the_content<\/code> (classic) and core blocks such as <code>core\/post-content<\/code>, <code>core\/latest-posts<\/code>, <code>core\/archives<\/code>, and <code>core\/navigation<\/code>.<\/li>\n<li>Multiple storage modes:\n\n<ul>\n<li>Auto \u2013 use Redis if available, otherwise fall back to MySQL.<\/li>\n<li>Redis \u2013 fastest mode; uses the PHP Redis extension.<\/li>\n<li>MySQL \u2013 portable fallback using compact tables (<code>qc_entries<\/code>, <code>qc_tagmap<\/code>).<\/li>\n<\/ul><\/li>\n<li>Compatible with the Redis Object Cache drop-in.<\/li>\n<li>Avoids wp_options and postmeta storage \u2013 all cache data is stored in Redis or\nQuantumCache-owned database tables.<\/li>\n<li>Multisite-aware: per-site prefixes and per-site tables.<\/li>\n<li>WP-CLI commands: <code>wp quantumcache flush<\/code> and <code>wp quantumcache status<\/code>.<\/li>\n<li>Metrics data layer: persistent hit, miss, store, and purge event counters available via <code>Metrics::totals()<\/code> and <code>Metrics::deltas()<\/code>.<\/li>\n<\/ul>\n\n<h3>Performance summary<\/h3>\n\n<p>In benchmarks on a plugin-heavy WordPress site (WooCommerce + Yoast SEO),\nQuantumCache reduced per-request database queries by up to ~99% on cached pages\nand achieved cache hit rates exceeding 97% with Redis.<\/p>\n\n<p>In the benchmark environment:<\/p>\n\n<ul>\n<li>Redis mode reduced warm TTFB by roughly <strong>23\u201327%<\/strong> and total response time by <strong>18\u201321%<\/strong> versus an uncached baseline.<\/li>\n<li>MySQL fallback mode delivered <strong>modest improvements (~3\u201310%)<\/strong> when Redis was unavailable.<\/li>\n<\/ul>\n\n<p>Actual results depend on theme complexity, plugin load, database topology, and traffic patterns.<\/p>\n\n<h3>When to use QuantumCache<\/h3>\n\n<p>QuantumCache is useful when:<\/p>\n\n<ul>\n<li>Your site already uses a page cache (such as a CDN, reverse proxy, or caching plugin) but WordPress still performs significant database work.<\/li>\n<li>You want faster response times without relying solely on full-page caching.<\/li>\n<li>Your hosting environment supports Redis, or you want a portable MySQL fallback.<\/li>\n<\/ul>\n\n<p>QuantumCache complements page caching rather than replacing it.<\/p>\n\n<h3>What QuantumCache does NOT do<\/h3>\n\n<p>QuantumCache is not a page cache or full HTML cache.<\/p>\n\n<p>It does not replace solutions such as:\n* CDN caching\n* reverse proxy caches\n* traditional WordPress page caching plugins<\/p>\n\n<p>Instead, QuantumCache reduces the database work required to build pages, making those systems more effective.<\/p>\n\n<h3>Debug headers (optional)<\/h3>\n\n<p>Enable <em>Settings \u2192 QuantumCache \u2192 Send X-QC debug headers<\/em> to view cache status in HTTP responses:\n* <code>X-QC-Main: HIT | MISS | STORE<\/code>\n* <code>X-QC-Store: AUTO | redis | mysql<\/code>\n* <code>X-QC-Hydrated:<\/code> number of posts loaded from cache<\/p>\n\n<p>Append <code>?qc_nocache=1<\/code> to any URL to bypass caching for that request.<\/p>\n\n<p>Debug headers are sent only when explicitly enabled in settings and contain no\npersonal or user-specific data.<\/p>\n\n<h3>WP-CLI commands<\/h3>\n\n<p>QuantumCache provides the following WP-CLI commands:<\/p>\n\n<p>wp quantumcache status\nShows the active backend, storage mode, and lifetime cache counters.<\/p>\n\n<p>wp quantumcache flush\nClears all cache entries for the current site.<\/p>\n\n<p>Use --yes to skip the confirmation prompt.<\/p>\n\n<h3>QuantumCache Pro<\/h3>\n\n<p>QuantumCache Pro extends the core engine with advanced caching capabilities for WooCommerce and logged-in users.<\/p>\n\n<p>See: https:\/\/quantumcache.io<\/p>\n\n<h3>Privacy<\/h3>\n\n<p>QuantumCache does not collect, send, or log personal data.<br \/>\nIt stores cache entries in Redis or its own MySQL tables.<br \/>\nOther plugins on your site may handle cookies or data independently.\nNo remote requests are made, and no data is transmitted to external servers.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>quantumcache<\/code> folder to <code>\/wp-content\/plugins\/<\/code> and activate it.<\/li>\n<li>(Optional) You may install the Redis Object Cache plugin for additional Redis features. QuantumCache works independently.<\/li>\n<li>Go to <em>Settings \u2192 QuantumCache<\/em>:\n\n<ul>\n<li>Choose a store mode: Auto, Redis, or MySQL.<\/li>\n<li>Configure Redis host\/port if not already set by constants.<\/li>\n<li>Optionally enable debug headers.<\/li>\n<\/ul><\/li>\n<li>Load a public page twice. On the second load, the response should include <code>X-QC-Main: HIT<\/code>.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20cache%20logged-in%20users%3F\"><h3>Does it cache logged-in users?<\/h3><\/dt>\n<dd><p>No. QuantumCache focuses on anonymous (front-end) traffic to ensure safe invalidation. Logged-in caching is not included.<\/p><\/dd>\n<dt id=\"do%20i%20need%20redis%3F\"><h3>Do I need Redis?<\/h3><\/dt>\n<dd><p>Redis is recommended for best performance, but not required. QuantumCache automatically falls back to its internal MySQL store.<\/p><\/dd>\n<dt id=\"does%20it%20cache%20admin%20pages%2C%20feeds%2C%20or%20searches%3F\"><h3>Does it cache admin pages, feeds, or searches?<\/h3><\/dt>\n<dd><p>No. Those are intentionally excluded.<\/p><\/dd>\n<dt id=\"is%20it%20multisite-compatible%3F\"><h3>Is it Multisite-compatible?<\/h3><\/dt>\n<dd><p>Yes. Each site uses its own prefix and tables. Purge actions apply per site.<\/p><\/dd>\n<dt id=\"how%20do%20i%20purge%20the%20cache%3F\"><h3>How do I purge the cache?<\/h3><\/dt>\n<dd><p>From <em>Settings \u2192 QuantumCache<\/em>:\n* Purge Everything \u2013 clears all QuantumCache entries for this site.\n* Purge by Tag \u2013 e.g. <code>post:123<\/code> or <code>taxonomy:category<\/code>.\n* Purge by URL \u2013 resolves to post\/taxonomy tags automatically.<\/p>\n\n<p>From the command line via WP-CLI: <code>wp quantumcache flush<\/code><\/p><\/dd>\n<dt id=\"can%20i%20manage%20quantumcache%20from%20the%20command%20line%3F\"><h3>Can I manage QuantumCache from the command line?<\/h3><\/dt>\n<dd><p>Yes. Two WP-CLI commands are available:\n* <code>wp quantumcache flush<\/code> \u2013 clear all entries for the current site (prompts for confirmation; use <code>--yes<\/code> to skip).\n* <code>wp quantumcache status<\/code> \u2013 display backend, storage stats, and lifetime hit\/miss\/store\/purge counters.<\/p><\/dd>\n<dt id=\"which%20fragments%20are%20cached%3F\"><h3>Which fragments are cached?<\/h3><\/dt>\n<dd><ul>\n<li>Classic themes \u2013 <code>the_content<\/code> on singulars.<\/li>\n<li>Block themes \u2013 <code>core\/post-content<\/code> and common navigation\/listing blocks.<\/li>\n<\/ul><\/dd>\n<dt id=\"does%20it%20cache%20dynamic%20content%20or%20nonces%3F\"><h3>Does it cache dynamic content or nonces?<\/h3><\/dt>\n<dd><p>No. Fragments containing nonces, tokens, or user-specific data are skipped automatically.<\/p><\/dd>\n<dt id=\"does%20this%20replace%20my%20page%20cache%20or%20cdn%3F\"><h3>Does this replace my page cache or CDN?<\/h3><\/dt>\n<dd><p>No. QuantumCache operates below page caches and CDNs by reducing database and\nrendering overhead. It is designed to complement, not replace, page caching\nsolutions.<\/p><\/dd>\n<dt id=\"what%20happens%20on%20uninstall%3F\"><h3>What happens on uninstall?<\/h3><\/dt>\n<dd><p>Unless the <code>quantumcache_preserve_data_on_uninstall<\/code> filter returns true, QuantumCache removes its own tables and options. No wp_options or postmeta entries are left behind.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.1.7<\/h4>\n\n<ul>\n<li>Fixed: RedisStore::purgeAll() was referencing the wrong internal property ($this-&gt;redis instead of $this-&gt;r), causing all bulk purge calls from the admin \"Purge Everything\" button to silently fail and return 0 keys removed.<\/li>\n<li>Fixed: MySQLStore::purgeAll() was not implemented; the admin \"Purge Everything\" button showed \"backend does not support bulk purge\" on MySQL\/Auto installs. Both qc_entries and qc_tagmap are now cleared correctly.<\/li>\n<li>Fixed: Stats::mysql_stats() queried a non-existent column (created_at) instead of the correct column (updated); this caused the Entries count in the admin Overview table to always display 0 for MySQL-backed installs.<\/li>\n<li>Major improvements to fragment caching behavior, new WP-CLI tooling, and internal metrics support.<\/li>\n<li>Perf: Added FragmentCache::peek() for pre-render cache check without lock or producer execution.<\/li>\n<li>Fixed: Fragment cache key role dimension now uses a sorted role list before implode, preventing cache misses for users with multiple roles due to non-deterministic array key order in $user-&gt;roles (FragmentCache.php).<\/li>\n<li>Feature: Added WP-CLI support \u2014 <code>wp quantumcache flush<\/code> clears all cache entries for the current site (with confirmation prompt, or --yes to skip); <code>wp quantumcache status<\/code> reports backend, storage stats, and lifetime event counters.<\/li>\n<li>Feature: Added Metrics data layer tracking split query and fragment hit, miss, store, and purge event counts with atomic wp_options persistence; exposes Metrics::deltas() for current-request data and Metrics::totals() for cumulative counters.<\/li>\n<li>Dev: Added quantumcache_cache_hit, quantumcache_cache_miss, and quantumcache_cache_store action hooks at each cache outcome point in QueryCache and FragmentCache, available for Pro and third-party extensions.<\/li>\n<li>Fixed: Changed singular query alias cache keys so they respect the logged-in role cache bucket, preventing anonymous singular alias entries from satisfying logged-in requests and preventing proper role-scoped primary key creation.<\/li>\n<\/ul>\n\n<h4>0.1.6<\/h4>\n\n<ul>\n<li>Fix: Corrected QUANTUMCACHE_VERSION constant value to match plugin header (was 0.1.4).<\/li>\n<li>Compat: Fire quantumcache_loaded action after plugin init so Pro and third-party extensions can reliably detect when Free has finished bootstrapping. <\/li>\n<\/ul>\n\n<h4>0.1.5<\/h4>\n\n<ul>\n<li>Security: Hardened direct database access by validating and escaping internal\ntable identifiers to satisfy PluginCheck and reviewer requirements.<\/li>\n<li>Code: Resolved all PluginCheck warnings; no functional behavior changes.<\/li>\n<li>Cleanup: Removed development-only tooling files from the release package.<\/li>\n<li>Stability: Minor internal cleanup following load testing and runtime validation.\nextensions can reliably detect when Free has finished bootstrapping.<\/li>\n<\/ul>\n\n<h4>0.1.4<\/h4>\n\n<ul>\n<li>Fix: Fixed incomplete Stats.php code concerning MySQL reporting<\/li>\n<li>Fix: Prefixed all global functions and variables (qc_* \u2192 quantumcache_*) to satisfy Plugin Check naming requirements.<\/li>\n<li>Fix: Updated uninstall routine to use prefixed globals and updated option names.<\/li>\n<li>Fix: Added defensive table-name validation and explicit casting in Maintenance and Stats to address Plugin Check warnings.<\/li>\n<li>Fix: Corrected several internal calls referencing the old function names (qc_should_debug_headers, etc.), preventing runtime errors.<\/li>\n<\/ul>\n\n<h4>0.1.3<\/h4>\n\n<ul>\n<li>Fix: Updated MySQLStore write operations to use $wpdb-&gt;insert() with format arrays, resolving the PHPCS \/ reviewer-required change.<\/li>\n<li>Fix: Corrected StoreFactory to pass the required $wpdb instance when constructing MySQLStore, restoring MySQL fallback functionality.<\/li>\n<\/ul>\n\n<h4>0.1.2<\/h4>\n\n<ul>\n<li>Admin: refined settings layout, help text, and capability\/nonce checks.<\/li>\n<li>Code: PHPCS\/WPCS compliance (sanitization, escaping, Yoda, no short ternaries).<\/li>\n<li>Store: Redis \u201cPurge Everything\u201d via SCAN\/DEL with site prefix.<\/li>\n<li>Store: MySQL tag mapping writes via <code>wpdb-&gt;insert()<\/code> with formats.<\/li>\n<li>Read path: safe request URI normalization for keys and display.<\/li>\n<\/ul>\n\n<h4>0.1.1<\/h4>\n\n<ul>\n<li>Fix: hydration logic in <code>on_posts_pre_query()<\/code> (now primes and hydrates safely).<\/li>\n<li>Perf: archive hit path uses <code>update_post_caches()<\/code> without taxonomy overhead.<\/li>\n<li>Safety: skip caching very small archives (fewer than 12 IDs).<\/li>\n<li>Headers: ensure <code>X-QC-Store-Actual<\/code> reflects real backend.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial public release.<\/li>\n<li>Query-level caching with tag-based invalidation.<\/li>\n<li>Fragment caching for <code>the_content<\/code> and key blocks.<\/li>\n<li>Redis (preferred) and MySQL stores.<\/li>\n<li>Multisite support.<\/li>\n<li>Admin UI: store selection, Redis config, debug headers, purge controls, live stats.<\/li>\n<li>PHPCS clean (WordPress coding standards).<\/li>\n<\/ul>","raw_excerpt":"Speeds up WordPress by caching database queries and fragments for anonymous visitors using Redis or MySQL, without storing cache data in wp_options.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/256193","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=256193"}],"author":[{"embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/adelong01"}],"wp:attachment":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=256193"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=256193"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=256193"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=256193"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=256193"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=256193"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}