Everything you need to know about FrostyCache, organized by topic.
How does FrostyCache cache REST API responses?
FrostyCache intercepts REST API GET requests at the earliest possible stage and stores the JSON response, headers, and an ETag as a file on disk. Subsequent requests for the same endpoint are served directly from the file before WordPress connects to the database, resulting in ~14ms response times.
Which endpoints are cached?
All GET requests to the WordPress REST API are cached by default. This includes core endpoints (posts, pages, media, taxonomies), WooCommerce product endpoints, and CoCart product endpoints. User-specific endpoints (orders, carts, sessions) and requests with nonces are automatically skipped.
How do I control cache duration per route?
Use the frostycache_cache_age filter. It receives the current cache duration and the REST request object, allowing you to return a custom duration for specific routes. See the documentation for examples.
How do I skip caching for specific endpoints?
Use the frostycache_skip_cache filter and return true for routes you want to bypass. You can also add ?skip_cache=1 to any REST API request to force a fresh response.
How does cache invalidation work?
FrostyCache tracks which cache files contain which posts using post meta. When a post is updated or deleted, only the affected cache files are purged — not the entire cache. Term updates also trigger targeted invalidation for associated post types.
How do ETags work?
Every cached response includes an MD5-based ETag header. When a client sends an If-None-Match header matching the current ETag, FrostyCache returns a 304 Not Modified with no body. This saves bandwidth for mobile apps and SPAs that poll endpoints.
Does FrostyCache work with custom post types?
Yes. Any custom post type registered with show_in_rest is automatically detected and cached. No manual configuration is required.
Does FrostyCache work on multisite?
Yes. Cache files are stored in per-site directories using wp_get_upload_dir(), so each site in a multisite network has its own isolated cache.
How many hooks and filters are available?
18+ hooks and filters covering the full cache lifecycle: cache duration, skip logic, cache key generation, headers, ETags, cache directory, save/delete events, and more. See the full documentation.
Can I use FrostyCache with WP Super Cache, W3 Total Cache, or WP Rocket?
Yes, but with caveats. FrostyCache detects conflicting cache plugins that also use the advanced-cache.php drop-in. Known detected plugins include WP Super Cache, W3 Total Cache, LiteSpeed Cache, and WP Rocket. If a conflict is detected, FrostyCache automatically falls back to an MU plugin that still caches REST API responses, but at reduced speed (~200ms instead of ~14ms). An admin notice will inform you of the conflict and fallback status.
What about WP REST Cache?
WP REST Cache does not use the drop-in, so there is no file conflict. However, running both plugins simultaneously is not recommended as they will both attempt to cache the same endpoints, wasting resources. FrostyCache is 10–15x faster than WP REST Cache on cache hits.
What happens if another plugin overwrites the drop-in?
FrostyCache checks drop-in integrity hourly. If the drop-in is overwritten, the MU plugin fallback automatically kicks in. You will see an admin notice explaining which plugin owns the drop-in and the current fallback status. You can restore full speed by deactivating the conflicting plugin or running wp frostycache repair.
Does FrostyCache cache responses for logged-in users?
No. WordPress sends Cache-Control: no-cache headers for authenticated requests. FrostyCache respects these headers and bypasses cache entirely for logged-in users, preventing stale user-specific data.
What about requests with nonces?
Requests containing a WordPress nonce header are skipped by default. This behavior is configurable via the frostycache_skip_cache_nonce filter.
Where are cache files stored?
In wp-content/uploads/frostycache_cache/ by default. Each cached response is a JSON file containing the response data, headers, and ETag. You can change the location using the frostycache_cache_dir filter or the FROSTYCACHE_FOLDER constant.
How do I clear the cache?
Use WP-CLI: wp frostycache flush clears everything, wp frostycache clear-post 42 clears a specific post. You can also click the cache clear button in the WordPress admin toolbar. Expired files are automatically cleaned up twice daily via WP-Cron.
What are the server requirements?
PHP 7.4 or higher and WordPress 5.6 or higher. No additional server software (Redis, Memcached) is needed — FrostyCache uses the filesystem only.
How do I verify caching is working?
Check the X-FrostyCache response header on any REST API request. It returns HIT (served from cache), MISS (not cached yet), or BYPASS (skipped). You can also run wp frostycache status to see cache file count and total size.
Does the WooCommerce Store API get cached?
Public catalog routes do — product listings (/wc/store/v1/products), single products, and product categories are cached and served at drop-in speed. Session-sensitive routes (cart, checkout, order) are always bypassed because they carry per-user Cart-Token data. See the WooCommerce benchmark for measured results.
What do “median”, “p95”, and “min/max” mean in the benchmarks?
Median is the middle value when all 50 results are sorted — half the requests were faster, half were slower. It is more representative than the average because a single slow outlier cannot skew it. p95 (95th percentile) is the time that 95% of requests completed within — only the slowest 5% exceeded it. It shows tail latency: how bad the occasional slow request is. min and max are the single fastest and slowest individual requests recorded across all 50 runs.
What happens after I purchase?
You will receive a license key via email from Polar.sh. Use this key to activate FrostyCache on your WordPress site, either through the admin settings or via wp frostycache license activate YOUR-KEY.
What is included with my subscription?
All plans include every caching feature, ETag support, WooCommerce and CoCart modules, WP-CLI commands, and access to updates and support for the duration of your plan. The only difference between plans is the number of site activations.
Do local and staging sites count toward my license?
No. Development and staging environments do not count toward your license limit. Only production WordPress installations require an activation.
Can I upgrade my plan later?
Yes. You can upgrade from Personal to Freelancer or Agency anytime with prorated pricing. We calculate the difference between your current plan and the new plan, so you only pay for what you need.
Can I use FrostyCache on client sites?
Absolutely. Freelancer and Agency plans are designed for client work. You can install FrostyCache on any sites you build or maintain for clients, as long as the total doesn’t exceed your plan’s activation limit.
What is included in a lifetime license?
Perpetual access to FrostyCache, all future updates, lifetime support, and no recurring subscription fees. It is a one-time payment for permanent access.
How do I cancel my subscription?
You can cancel auto-renewal at any time through your Polar.sh account. Your license will remain active until the end of the current billing period. After that, you can continue using the last version you downloaded, but without updates or support.
Do you offer refunds?
Yes. We offer a 14-day compatibility guarantee. If you experience a genuine technical incompatibility that our support team cannot resolve, you are eligible for a refund. See our Refund Policy for full details.
How do I contact support?
Email us at [email protected]. Freelancer and Agency plans receive priority support.