Blog · WordPress

Performance Plugins Compared: Cache, Optimize, or Snake Oil

Search “best WordPress speed plugin” and you’ll find dozens of tools claiming to make your site faster. Most of them are honest about what they do. The problem is that site owners often stack three or four plugins that all try to solve the same problem, and the result is worse performance, broken layouts, or both. Understanding what each category of plugin actually does is the fastest way to build a stack that helps instead of fighting itself.

The Real Categories, Not the Marketing Categories

Strip away the branding and “performance plugin” breaks down into a handful of genuinely distinct jobs:

  • Full-page caching: serving a rendered HTML page without running PHP or querying the database.
  • Persistent object caching: storing the results of expensive database queries in memory so PHP doesn’t repeat them on every request.
  • Asset optimization: minifying, combining, or deferring CSS and JavaScript.
  • Image optimization: compressing images and serving modern formats with lazy loading.
  • Database housekeeping: clearing out old revisions, expired transients, and orphaned metadata.

Each of these solves a different bottleneck. Confusing them, or running two plugins that both claim the same job, is where most performance stacks go wrong.

Full-Page Caching: The Biggest Lever You Have

Full-page caching is the single largest performance lever available to most WordPress sites. When it works correctly, a visitor’s request never touches PHP or the database at all. The web server hands back a pre-rendered HTML file directly. On a LiteSpeed or OpenLiteSpeed server, LiteSpeed Cache does this at the server level, which is faster than PHP-based caching plugins because the caching decision happens before WordPress even loads.

This is the layer that moves your Time to First Byte and, by extension, your Largest Contentful Paint. If LCP is your problem, page caching is almost always where you start.

Object Caching: The Quiet Workhorse

Object caching doesn’t show up in a Lighthouse score the way page caching does, but it matters just as much for logged-in traffic, WooCommerce carts, membership sites, and anything that can’t be served from a static full-page cache. Redis or Memcached, connected through a persistent object cache drop-in, stores the results of repeated database queries in memory instead of hitting MySQL every time.

This is the layer that keeps your admin dashboard, checkout flow, and dynamic pages responsive. It has a direct effect on Interaction to Next Paint, because a server that isn’t waiting on redundant database queries responds to user interactions faster.

Asset Optimization: Useful and Risky in Equal Measure

Minifying and combining CSS and JavaScript, deferring render-blocking scripts, and inlining critical CSS can meaningfully improve LCP and Cumulative Layout Shift. This is also the category where plugins most often collide.

If two plugins both try to minify and reorder your JavaScript, you can end up with scripts executing out of order, broken jQuery dependencies, or duplicate inline styles. If two plugins both generate “critical CSS,” you can get layout shift that’s worse than doing nothing, because the browser paints one version of the layout and then jumps to another once the real stylesheet loads. Asset optimization needs to be owned by exactly one plugin.

Image Optimization and Database Cleanup

Image optimization plugins compress uploads, convert them to modern formats, and lazy-load offscreen images. This is a separate concern from caching or asset minification, and it usually overlaps with CDN-level image resizing if you’re using one. Pick one tool to own image compression and let it do its job.

Database cleanup plugins (clearing revisions, expired transients, spam comments) are useful for keeping your database lean, but they’re maintenance tools, not speed multipliers. They belong in your toolkit, not at the center of your performance strategy.

Where Stacks Start Fighting Each Other

The failure pattern is almost always the same: two plugins claim ownership of the same job, and only one of them actually wins, silently.

  • Two full-page cache plugins active at once. One serves stale content while the other thinks it’s in charge of purging, and you end up debugging “random” cache issues that are really just two systems overwriting each other’s headers.
  • Two minify/combine engines running simultaneously. This is the most common cause of a site that suddenly looks broken after installing a new “speed” plugin. The layout worked with one asset pipeline; adding a second one scrambled the load order.
  • Two plugins trying to write the persistent object cache drop-in file. Only one can occupy that file. The other silently does nothing, and you think you have object caching when you don’t.
  • Edge caching and origin caching both trying to purge on the same trigger, out of sync. Cloudflare’s edge cache and your origin’s page cache are complementary, but only if they respect each other’s cache headers and purge in the right order. Configured well, this is a strength; configured carelessly, it means visitors sometimes see content from two requests ago.

A Stack That Doesn’t Contradict Itself

A clean, non-overlapping performance stack for a modern WordPress site looks something like this:

  • PHP 8.3 with OPcache as the runtime baseline. This is foundational and has nothing to do with plugins; it’s server configuration that every request benefits from.
  • One full-page cache layer. On a LiteSpeed server, that’s LiteSpeed Cache, handling both page caching and its own asset optimization features, turned on incrementally rather than all at once.
  • One persistent object cache, via Redis or Memcached, connected through a single drop-in.
  • Cloudflare in front of the origin for edge caching, WAF rules, bot mitigation, and DDoS protection, with the origin IP kept unpublished so the edge is the only path attackers can see.
  • One image optimization tool, and nothing else touching image compression.

Notice there’s exactly one plugin (or one server feature) per job. That’s the whole principle. This is also the kind of stack a managed WordPress host like ServerBorn configures by default, so you’re not left guessing which layer owns which job.

Testing Whether a Plugin Is Actually Helping

The only honest test is measuring against real thresholds, not a synthetic score. Core Web Vitals give you concrete targets: LCP at 2.5 seconds or under, INP at 200 milliseconds or under, and CLS at 0.1 or under. Add a plugin, measure again under realistic conditions, and if the numbers didn’t move, or moved in the wrong direction, that plugin isn’t earning its place.

wp-cli is useful here too, both for testing and for keeping your stack clean during deploys. Flushing caches consistently after a deploy avoids stale-cache illusions of a performance win or loss:

wp cache flush
wp transient delete --all

Building cache-purge steps into your deploy process, rather than relying on manual clicks in a plugin’s admin screen, removes one more source of “is this actually cached right now” confusion when you’re comparing before-and-after numbers.

Takeaway

Performance plugins aren’t snake oil as a category, but redundancy is. Full-page caching, object caching, asset optimization, and image optimization are four separate jobs, and each one should have exactly one owner in your stack. Get the server fundamentals right (PHP 8.3 with OPcache, a real page cache, persistent object caching, and a sane edge layer), assign one plugin per job, and measure against Core Web Vitals instead of a marketing dashboard. That’s the difference between a stack that compounds and one that quietly cancels itself out.