Caching and page speed · 25 plugins · 26 layers
WordPress Cache Plugin MCP that measures before it keeps a change.
A WordPress cache plugin MCP has to see the whole stack, because a page cache, an asset optimiser, an object cache and a CDN each keep their own copy. One shared module detects every layer, changes one setting at a time and measures what the change did.
What goes wrong without a plugin-aware module
- An edit that looks like it failed because one of several caches is still serving the old page
- Optimisation settings enabled that read back correctly and change nothing on the wire
- Speed work judged by a settings screen instead of a rendered page
Why it matters
What plugin-aware changes for caching and page speed
Caching is stacked, not singular, and the layers do not know about each other. An asset optimiser sits in front of a page cache, a CDN sits in front of both, and an object cache sits underneath. Purge one and the site serves a mix of old and new markup, which reads as a failed write rather than a stale cache. The second trap is quieter: a setting can be written, read back correctly, report success, and still do nothing, because whatever would carry it out lives outside WordPress - a host with no rewrite file, an edge that is not caching HTML, a next-gen image setting with no converter producing the files.
A first safe workflow
Detect every layer first, then take a baseline before touching anything: purge, warm, and measure, in that order, because measuring straight after a purge times WordPress building the page rather than the cache serving it. Then change one setting, repeat the loop, and keep it or roll it back. A batch of changes with one check at the end tells you nothing about which one did the damage.
How to tell it worked
In a browser, not on a settings screen. A write that reports success cannot see that the header logo is now a transparent placeholder, that a combined stylesheet returns a 404, or that deferring JavaScript stopped the menu opening. Core Web Vitals do not exist until a browser renders, so LCP and CLS come from the rendered page, and the request timings say whether an above-the-fold image started downloading late.
Modules
25 modules compared
Each module loads only when its plugin is active and needs GoBuildWP Pro. Open a module for its full ability list, requirements and safety notes.
| Plugin | Layer | Mapped keys | Native option fields | Purge entry points |
|---|---|---|---|---|
| LiteSpeed Cache | page | 22 | 22 declared
| allurlpost |
| WP Rocket | page | 24 | 1 declared
| allurlpost |
| WP Fastest Cache | page | 7 | 1 declared
| allurlpost |
| Speed Optimizer (SiteGround) | page | 11 | 11 declared
| allurl |
| WP-Optimize | page | 14 | 2 declared
| allurlpost |
| W3 Total Cache | page | 8 | None | allurlpost |
| Autoptimize | asset | 8 | 7 declared
| all |
| SpeedyCache | page | 6 | 4 declared
| allurlpost |
| Breeze | page | 12 | 5 declared
| all |
| Cache Enabler | page | 3 | 1 declared
| allurlpost |
| Perfmatters | asset | None | 3 declared
| None declared |
| FlyingPress | page | None | 2 declared
| allurl |
| WP Super Cache | page | None | 4 declared
| allurlpost |
| Redis Object Cache | object | None | 2 declared
| all |
| Jetpack Boost | page | None | 1 declared
| all |
| Aruba HiSpeed Cache | page | None | 2 declared
| None declared |
| NitroPack | page | None | 1 declared
| allurl |
| Hummingbird | page | None | 2 declared
| all |
| 10Web Booster | page | None | 2 declared
| None declared |
| Docket Cache | object | None | 2 declared
| all |
| SQLite Object Cache | object | None | 1 declared
| all |
| Powered Cache | page | None | 1 declared
| all |
| Swift Performance | page | None | 1 declared
| all |
| Swift Performance Lite | page | None | 1 declared
| all |
| Super Page Cache for Cloudflare | edge | None | 1 declared
| all |
| Converter for Media | asset | None | 1 declared
| None declared |
26 detected layers, 10 with a shared settings map. Purge entry points are declared in the source, not proof that a callback exists on your installed version. CDN and host caches may need separate credentials, and a flush does not by itself make a page faster.
Worked example
Try deferring JavaScript on a store's product page, and keep the change only if the page gets faster without breaking.
The shared cache module, which detects every cache and speed layer on the site rather than assuming there is one.
wppilot/cache-check-setupProLists every layer in front of the site: page cache, asset optimiser, object cache, and any CDN or host edge that answered, with the purge scopes each supports.
wppilot/cache-begin-experimentProSnapshots the settings rows of each cache plugin GoBuildWP can read, native keys included, and returns an experiment id so one call can put them back later. Layers it cannot snapshot, such as a CDN or host edge, are listed under not_captured and will not be reverted.
wppilot/cache-measure-pageProTakes the baseline after a purge and a warm: time to first byte over repeated requests, whether the cache answered HIT, HTML weight, and render-blocking files.
wppilot/cache-set-settingsProSets js.defer. It is one of the keys refused without confirm=true, because it is among the settings most likely to break a menu or a checkout while the settings screen looks fine.
wppilot/cache-warmProPurges have already happened as part of the write; this requests the page again so the next measurement times the cache rather than WordPress rebuilding the page.
wppilot/cache-verify-in-browserProReturns suggested browser checks and PageSpeed report links for that URL. The ability does not run a browser or prove that the menu, layout or checkout works.
What to check yourself. Run those browser checks in a real browser: open the menu, add to cart, watch the console. If anything fails or the numbers are worse, wppilot/cache-revert-experiment writes the captured settings back in one call and reports whether they match the snapshot. It does not reach layers listed as not captured, and a plugin that builds rewrite rules or a config file from its settings may need its settings screen saved once to regenerate them.
Choosing what to tune, and how
Shared keys, native settings and presets: three ways to change a cache plugin
Every cache plugin here answers the same module, but each exposes a different share of its own settings to it. The table above shows the split. Mapped keys are the shared vocabulary, such as page cache on, CSS minify or JavaScript defer, that cache-set-settings writes on any plugin that supports them. Native fields are the plugin's own option names, reachable through cache-set-native for everything the shared model does not cover; LiteSpeed's guest mode, ESI and per-asset exclusions are examples. A plugin with no native fields declared, such as W3 Total Cache, is limited to the shared keys.
cache-set-native refuses any key it cannot read back first, so a key renamed between plugin versions is rejected instead of creating an option the plugin ignores. Read with cache-get-settings and include_native before writing.
When a preset is the right tool, and when it is not
cache-list-presets shows the conservative, balanced and aggressive configurations and, more usefully, which keys would actually change on this site. cache-apply-preset writes them as one ledger entry that rollback-change undoes in full; the aggressive preset needs confirm because it includes the gated keys. A preset suits a site where the cache plugin was installed and never configured. On a site you are tuning against measurements, set one key at a time instead, because a preset that makes things slower will not tell you which of its settings did it.
Actions that are not settings, and the ones you cannot undo
Crawling, preloading and database clean-up are listed by cache-list-actions and run with cache-run-action. Each entry says whether the action blocks, whether it is destructive and whether its entry point resolves on this install, and an unavailable one is refused rather than reported as done. Database clean-up deletes rows such as old revisions; it needs confirm and the change ledger cannot bring them back, because the ledger restores settings, not deleted content. Take a backup before any destructive action, and re-measure later after a non-blocking one, since it only queued the work.
One page cache per site
Stacked caching is normal: a page cache, an asset optimiser, an object cache and a CDN each do a different job. Two page caches doing the same job is not. Run cache-check-setup on an inherited site and, if it reports more than one page-cache plugin, pick one to keep, usually the one your host recommends, and deactivate the other in wp-admin before tuning anything. Measurements taken with two page caches answering tell you about whichever one won the request, not about the setting you changed.
FAQ
Caching and page speed and AI, answered
Why did my edit not show up on the front end?
Almost always a cache rather than a failed write. Confirm the database actually changed by reading the post back; if it did, a page cache is still serving HTML built before the edit. Purging one layer is not enough on a stacked site, which is why the purge here reaches every detected WordPress-side layer at once and reports which entry point it called for each. A CDN or host edge in front of the site is not purged by it and needs its own purge.
Can an agent safely turn on things like combining CSS or deferring JavaScript?
Those are gated. Combining CSS or JavaScript, critical CSS, unused-CSS removal, deferring JavaScript and caching for logged-in users are refused without an explicit confirmation, and the refusal names which keys it stopped. They are the settings that most often break a site while leaving the settings screen looking perfectly correct.
Does GoBuildWP give a PageSpeed score?
It reports Google's and never invents one. GoBuildWP Free's pagespeed-check asks PageSpeed Insights through Site Kit, or through GoBuildWP Cloud with GoBuildWP's own Google key, so no key is needed from you; a key of your own is optional. Separately, server-side measurement reports time to first byte, whether the cache answered HIT or MISS, HTML weight, and how many stylesheets and scripts block the first paint. Lighthouse figures are one simulated load; real visitors' LCP, CLS and INP come only from field data, when Google has it for the page.
What if the fix is not a WordPress setting at all?
Then it says so, and says whose job it is. A host with no rewrite file makes browser-cache headers and WebP delivery inert while both still read back as enabled; an edge reporting DYNAMIC for the HTML means every visitor reaches the origin however well the page cache performs. Each of those comes back with which settings it silently neutralises and the steps for whoever owns that panel.
Start in Read Only, then add what the site runs
Connect your AI client to the free MCP foundation and check what it can see. Add Pro when a job needs the module for your installed plugin.