-
How to remove orphaned post meta in WordPress
Orphaned post meta is metadata whose parent post no longer exists, sitting in one of WordPress's largest tables and slowing every meta query. Here is how to find and delete it safely.
Databaselowmoderate10 min -
How to find and remove abandoned WordPress plugins
An abandoned plugin has not been updated in years but still loads its code on every request, and unmaintained code is the most common way WordPress sites get compromised. Here is how to spot one and remove it safely.
Backendloweasy15 minApply Fix -
How to reduce autoload size in WordPress
Autoloaded options in wp_options are loaded into memory on every request, and oversized autoload data adds a fixed cost to every page. Here is how to measure it and get it back under 1 MB.
Databaselowmoderate15 min -
How to flush expired transients in WordPress
Expired transients pile up in wp_options and get read into memory on every page load. Here is how to check the count, delete them safely with WP-CLI, and stop them from rebuilding into bloat.
Databaseloweasy5 minApply Fix -
How to enable page caching in WordPress
Without page caching, WordPress rebuilds every page from PHP and database queries for every single visitor. Page caching saves the finished HTML the first time and serves that copy to everyone after, cutting server response time from seconds to milliseconds.
Infrastructuremediumeasy15 minApply Fix -
How to disable cart fragments in WooCommerce
WooCommerce's cart fragments feature updates the mini-cart via an admin-ajax call on nearly every page view, including pages with no cart in sight, and the call bypasses all caching. On busy stores it is routinely the single slowest request on the page.
Backendmediummoderate10 min -
How to defer render-blocking scripts in WordPress
A render-blocking script is JavaScript loaded in the page head without defer or async, forcing the browser to stop building the page until the file downloads and runs. Moving non-critical scripts out of the critical path lets the page paint first and run JavaScript after, which is one of the biggest first-paint wins on mobile.
Frontendmediummoderate20 min -
How to convert images to WebP in WordPress
WebP delivers the same visual quality as JPEG or PNG at roughly 25 to 35% smaller file sizes, and every current browser supports it. Converting your media library to WebP cuts image weight across the whole site.
Frontendmediumeasy15 minApply Fix -
How to compress oversized images in WordPress
Oversized images are the single most common cause of slow WordPress pages. The fix is to compress existing images, serve appropriately sized versions, and let WordPress generate the right thumbnails.
Frontendmediumeasy10 minApply Fix -
How to clean up post revisions in WordPress
WordPress saves a copy of a post every time you click update, forever, unless told otherwise. The fix is to delete old revisions and cap how many WordPress keeps in the future.
Databaseloweasy10 minApply Fix -
How to add missing database indexes in WordPress
An index lets MySQL find rows without scanning the whole table. Adding the right index can turn a 2-second query into a 20-millisecond one.
Databaselowhard30 min -
Minify JavaScript to cut payload
Unminified JS ships with comments, full variable names, and whitespace. Minification (often paired with mangling) routinely cuts 50–70% of bytes.
Frontendmediumeasy5 minApply Fix -
Minify CSS to cut payload
Unminified CSS ships with comments, whitespace, and verbose property values. Minification typically saves 20–40% of CSS bytes with no behaviour change.
Frontendloweasy5 minApply Fix -
Enable a persistent object cache (Redis/Memcached)
WordPress's default object cache is per-request. Persistent object caching makes every cache_get hit a shared store instead of re-doing the database work each time.
Backendhighmoderate30 minApply Fix -
Delete existing post revisions
A one-shot cleanup that removes existing revision rows from wp_posts. Pair it with the post-revisions cap so the table doesn't grow back.
Databasemediumeasy5 minApply Fix -
Limit post revisions per post
WordPress keeps a revision row for every edit by default. Without a cap, long-lived posts accumulate hundreds of revisions and bloat wp_posts.
Databaseloweasy2 minApply Fix -
Clean up expired transients in wp_options
Expired transients aren't deleted by WordPress on schedule. On busy sites they accumulate in `wp_options` and bloat the autoloaded subset.
Databasemediumeasy5 minApply Fix -
Strip ?ver= query strings from static asset URLs
Some CDNs and proxies don't cache URLs with query strings. WordPress appends `?ver=...` to nearly every CSS/JS URL it enqueues, which can completely defeat edge caching.
Infrastructureloweasy5 minApply Fix -
Enable native lazy loading for images
Loading every image at page boot is wasteful when most are below the fold. Native `loading="lazy"` defers them until they're about to scroll into view.
Frontendmediumeasy3 minApply Fix -
Enable gzip (or brotli) compression on the server
Without compression, HTML/CSS/JS go over the wire at full size. Gzip cuts most text responses by 70–80%; brotli does a few percent better.
Infrastructurehigheasy5 minApply Fix -
Enable full-page caching for anonymous traffic
Without a page cache, every anonymous visitor triggers the full WordPress PHP boot + database round-trips. A page cache turns that into a single file read.
Infrastructurecriticalmoderate20 minApply Fix -
Enable browser caching for static assets
Without cache headers, repeat visitors re-download every CSS/JS/image on every page. Adding a long max-age makes the second visit nearly instant.
Infrastructurehigheasy10 minApply Fix -
Truncate a runaway wp-content/debug.log
When WP_DEBUG_LOG is on, errors and notices accumulate in wp-content/debug.log forever. A noisy plugin can grow this file to hundreds of MB and slow every write.
Backendloweasy2 minApply Fix -
Clean up failed Action Scheduler records
WooCommerce's Action Scheduler keeps failed jobs (and their logs) forever by default. On busy stores this can balloon the database with millions of dead rows that no longer affect anything.
Databasemediumeasy5 minApply Fix