You want your WordPress site to be fast, so you add multiple layers of caching. WP Rocket for page caching. Cloudflare for CDN caching. Wordfence for security caching. Each plugin is best-in-class individually. Together, they can create a perfect storm of caching conflicts that break critical functionality. Your checkout stops working. The cart shows empty even when items are added. Users cannot log in. The site is fast, but it is also broken.
Layered caching works by storing copies of your pages at different levels of the stack. WP Rocket stores pages on your server. Cloudflare stores pages on edge servers around the world. Wordfence stores security checks and firewall rules. When a user visits your site, their request passes through these layers in sequence. If any layer serves a cached version of a page that should be dynamic, your site breaks. The user sees an empty cart because the cached page shows the cart before they added items.
The solution is not to disable caching. Caching is essential for speed. The solution is to configure each cache layer to respect the same bypass rules for dynamic content. This requires understanding which URLs must never be cached: cart, checkout, my account, login, and any page with forms. Each caching plugin has its own way of defining bypass rules. Configuring them consistently is the key to fast, functional layered caching.
How layered caching conflicts break WooCommerce
WooCommerce is particularly vulnerable to layered caching conflicts because of its heavy reliance on session data. The cart is stored in the user’s session, not in the page HTML. If a page is cached, the cached version has no knowledge of the user’s cart. The user adds an item to the cart, the page redirects to the cart page, but the cached cart page shows an empty cart. The user tries again, the same thing happens. They leave, and you lose a sale.
The checkout page is even more sensitive. Checkout pages contain nonces (security tokens) that expire after a short time. If a checkout page is cached, the cached nonce will be expired when the user submits the form. The submission fails with a security error, and the user cannot complete their purchase. This is why checkout pages must never be cached, under any circumstances, by any cache layer.
Login pages have similar nonce requirements. A cached login page has an expired nonce, so login attempts fail. The user sees an error message and cannot access their account. This is especially problematic for membership sites where users expect to log in frequently. If the login page is cached, users will be locked out of their accounts until the cache expires or is manually cleared.
How to identify which cache layer is breaking your site
Open your browser’s developer tools to the Network tab. Load the problematic page (cart, checkout, login). Look at the response headers. X-WP-Rocket-Cache indicates WP Rocket caching. CF-Cache-Status indicates Cloudflare caching. X-Wordfence-Cache indicates Wordfence caching. If any of these headers indicate a cache hit on a dynamic page, that cache layer is misconfigured. The solution is to add that URL to the bypass rules for that specific cache layer.
Step by step guide to configuring layered caching for dynamic content
Follow these steps to configure WP Rocket, Cloudflare, and Wordfence to bypass caching for dynamic WooCommerce pages.
- In WP Rocket: Settings → WP Rocket → Advanced → Never Cache URLs → Add /cart/, /checkout/, /my-account/, /add-to-cart/, /login/, /register/
- In WP Rocket: Enable “Cache for logged-in users” but set to “Separate cache for logged-in users” not “Don’t cache”
- In Cloudflare: Rules → Page Rules → Create rule for URL pattern https://yoursite.com/cart/* → Cache Level: Bypass
- In Cloudflare: Create separate rules for /checkout/*, /my-account/*, /login/* with Cache Level: Bypass
- In Cloudflare: Disable Rocket Loader and Auto Minify for the entire site (these break WooCommerce scripts)
- In Wordfence: Firewall → Rate Limiting → Add /cart/, /checkout/, /my-account/ to “Whitelisted URLs”
- In Wordfence: Firewall → Rate Limiting → Set “Rate limiting rules” to “Disabled” for these URLs
- In Wordfence: Cache → Clear all cache after making these changes
- In WP Rocket: Clear all cache
- In Cloudflare: Purge everything
How to test your layered cache configuration
After configuring bypass rules, test each dynamic page with the developer tools open. Add an item to the cart, then go to the cart page. The response headers should show no cache hits. Go to the checkout page. No cache hits. Log in. No cache hits. If you see a cache hit on any of these pages, your bypass rules are not working. Check that the URL patterns are correct and that you saved the rules in each plugin.
Layered caching conflict reference table
Here is a reference table showing which cache layers typically conflict with which WooCommerce features.
| Feature | WP Rocket | Cloudflare | Wordfence | Shopping cart | High conflict | High conflict | Medium conflict | Checkout | Critical (must bypass) | Critical (must bypass) | High conflict | Login | High conflict | High conflict | Medium conflict | Product pages | Safe to cache | Safe to cache | Safe to cache | Blog posts | Safe to cache | Safe to cache | Safe to cache |
|---|