Docs → Performance

Performance

Make the site faster, then measure that it got faster.

Before you change anything here. Open Page speed and press Check page speed so you have a before number. Then turn on one setting at a time and check again. Every switch in this area can be turned back off, the Past measurements list can restore the settings from any earlier run, and if a setting breaks the site, safe mode brings it back in one click.

Safe mode

MetaWrench → Performance, top of the page — or yoursite.com/?mw_safe_mode=1

The undo button for this whole area. Safe mode switches every Performance setting off for visitors — cache, minification, defer, delayed JavaScript, image handling, fonts, CDN — without changing what is saved. The site goes back to how it was before you touched anything, you find the setting that caused the problem, turn that one off, and leave safe mode. Admin screens keep showing your saved settings the whole time so you can see what was on.

While it is on, a notice sits at the top of every admin screen and a dark bar at the bottom of the site, visible only to administrators.

Settings

Turn safe mode on / off
The button on the Performance page. Clears the page cache when switched either way.
The URL
Visit yoursite.com/?mw_safe_mode=1 while logged in as an administrator. =0 turns it off. Works even when the page looks broken, because it runs before anything is drawn.
The wp-config line
If the site will not load at all, add define( 'MW_SAFE_MODE', true ); to wp-config.php above That’s all, stop editing. Safe mode is forced on until you remove the line; the button and the URL cannot override it.

When something looks wrong

Safe mode is on but the site still looks broken
Then the cause was not a Performance setting. Clear your host’s cache and hard-refresh. If it is still broken, see Recovery.
The URL does nothing
You are not logged in as an administrator on that browser. Log in at /wp-login.php first, then visit the URL again.
I cannot turn it off
The wp-config line is present. Remove it; the notice tells you when that is the case.
Visitors saw the dark bar
They cannot; it only renders for logged-in administrators.

Page speed

MetaWrench → Performance → Speed

Measures your site the way Google’s tools do and keeps every result, so you can see what a setting changed and go back to the best one. The score out of 100 is how Google grades the page. The times underneath are what a visitor waits for: when something first appears, when the main content has loaded, when the page is ready to use, how long it is blocked by scripts, and how much the layout shifts while loading.

Below the numbers is What is slowing it down: the findings from the last check, each with the MetaWrench setting that fixes it and a button to open that setting.

Settings

Check page speed
Runs a fresh measurement of your homepage. Takes twenty to sixty seconds.
See what a visitor gets / Back to my real results
Switches the findings between what the measurement found and what a visitor actually receives now, after any fixes applied since. A finding marked “already handled” was fixed after the measurement was taken; measure again to clear it.
Fix now / Fix all now
Switches on the MetaWrench settings that address the listed findings. Nothing you have already chosen is changed. Undo last fix reverses the most recent one.
Show every possible finding
Shows example text for every check the tool knows about, with made-up file names, so you can read the wording. Nothing is measured and no setting changes.
Past measurements
Every run, newest first, with score, load time and date. The best so far is marked. Use these restores the Performance settings that were active for that run. The last twenty runs are kept; tick and Delete selected to prune.

When something looks wrong

The score is different from PageSpeed Insights
Tests run from different locations on different simulated devices and network speeds, so the absolute number varies. Compare MetaWrench runs to each other to see what a setting did; compare Google’s runs to Google’s.
The check never finishes or errors out
The measurement calls an external service; if your host blocks outbound requests it cannot run. Ask your host whether outbound HTTPS is allowed from PHP. Also check the site is publicly reachable — a staging site behind a password cannot be measured.
A finding stays after I fixed it
Findings are from the measurement, not live. Press Check page speed again.
Use these made the site slower
It restored the exact settings from that run, which may have been before you turned other things on. Pick the run marked best so far instead, or switch settings by hand.

Images

MetaWrench → Performance → Images

Photos are the heaviest thing on most sites. This tab converts them to a smaller format, compresses them, delays the ones below the fold, serves the right size to each device, fills in missing alt text and dimensions, loads the main image first, and turns animated GIFs into video. Each is its own switch.

Settings

Enable lazy loading
Images below the fold are not downloaded until the visitor scrolls near them. Images to load immediately sets how many at the top of the page are exempt — those are visible on arrival, so delaying them makes the page feel slower, and the first one is marked high priority so the browser fetches it first. Default 3; a hero plus a row of logos might need 5.
Convert new uploads to WebP
JPG and PNG uploads are converted to WebP, which is 25–35% smaller at the same visible quality. Originals are kept.
Compress images on upload
Recompresses JPG and PNG on upload. Quality defaults to 82: most people cannot tell it from the original at about a third of the size. Below 70 starts to show on photographs.
Images you already have → Start bulk conversion
Applies the conversion and compression settings to everything already in the media library, in batches in the background. You can leave the page. Images are converted from the original, so quality is applied once, not stacked.
Enable responsive images
Adds srcset so phones get a small copy and desktops a large one, instead of every device downloading the full-size file. WordPress does some of this already; this fills in the gaps themes leave.
Auto-generate missing alt text
Images with no alt text get one from their caption, title or filename. Existing alt text is never overwritten. Helps accessibility and the Image descriptions check on the SEO tab.
Load the main image first
Tells the browser up front which image is the biggest visible one — the featured image or the first image on the page — and keeps it out of lazy loading. Usually the single largest improvement to how quickly a page looks finished.
Convert animated GIFs to video
The same animation as a muted, looping video is a fraction of the size. Plays exactly like the GIF did.
Auto-add image dimensions
Adds width and height to images that are missing them so the browser reserves the space before they load. Stops the page jumping about, which Google measures as layout shift.

When something looks wrong

Images look soft or blurry
Quality is too low. Raise it to 82 or above, then re-run the bulk conversion; because it converts from the original, raising quality later works.
An image at the top of the page appears late
It is being lazy-loaded. Raise Images to load immediately, or turn on Load the main image first.
Bulk conversion stopped partway
It runs in the background in batches and resumes on the next page load or cron run. Leave it; if the count has not moved in an hour, your host may be killing long requests — run it again and it continues where it stopped.
The page still jumps while loading
The theme sets its own image sizes in CSS that override the width and height. Check the image in the browser inspector: if it has width and height attributes but still shifts, the theme is the cause.
Another plugin already does WebP
Two converters fight over the same files. Keep one. If you keep the other, turn off both conversion switches here.
Related: Page speed

CSS / JS / HTML

MetaWrench → Performance → CSS / JS / HTML

Four jobs on one tab. Making stylesheets and scripts smaller (minify). Not loading stylesheets a page has no use for (reduce unused CSS). Loading scripts later so the page can paint first (defer), or holding them until the visitor does something (delay). And cleaning up the HTML itself, including tags a theme sometimes forgets.

This is the tab most likely to break something, because themes and page builders depend on their scripts loading in a particular order. Every switch has an exclusion list for exactly that reason.

Settings

Minify CSS files
Strips whitespace and comments from every stylesheet. Only minify these files: if left empty, every stylesheet is combined, which changes load order and can move a page builder’s styling; naming a few keeps the rest alone. Exclude files from minification: partial paths, one per line.
Reduce unused CSS
Skips plugin stylesheets on pages that do not use them. Reduce these files: paste the stylesheets a page speed report lists; they still load but the page no longer waits for them. Never reduce these files: always loaded normally. The Recently skipped list shows what it has done on real visits.
Minify JavaScript files
Same as CSS minification, for scripts. Exclusions work the same way.
Defer JavaScript loading
Scripts load after the page content instead of blocking it. jQuery is excluded by default because deferring it breaks most themes. Exclude files from deferring and Defer only these specific files give you either direction of control.
Enable delayed JavaScript
The files you name in Files to delay wait for the first scroll, tap or key press. Part of the name is enough: googletagmanager catches Tag Manager wherever it loads from. Nothing you do not list is touched; leave it empty and nothing is delayed. Run anyway after is the fallback for visitors who read and leave without scrolling: with Tag Manager delayed and no fallback, that visit is never counted. Load after 5 seconds is recommended if you rely on analytics.
Minify HTML output
Strips whitespace from the page itself. Safe on every theme.
Declare the page language / character set / mobile viewport
Adds three head tags some themes leave out. The lang tag is used by screen readers and search engines; the charset stops the browser guessing and restarting; the viewport tag stops phones showing the desktop layout zoomed out.
Send security headers
Stops other sites framing yours. Safe defaults that do not break embeds. The same headers are also on Security → General; turning them on in either place is enough.
Enable text compression
Compresses HTML, CSS and JavaScript before sending, typically cutting transfer size by 60–80%. Uses Brotli where the server supports it, Gzip otherwise. Check if compression is working tests it.

When something looks wrong

A slider, form, menu or popup stopped working
Turn off Enable delayed JavaScript first and reload. If that fixed it, the script was delayed; add it to Never reduce / Exclude from deferring, or remove it from Files to delay. If not, turn off Defer and repeat. If it is still broken, turn off Minify JavaScript. Re-enable each one once the culprit is excluded.
The page flashes unstyled for a moment
A stylesheet that styles what visitors see first is in the Reduce these files list. Move it to Never reduce these files.
The page builder editor is broken
MetaWrench never runs on the editor, so the cause is a cached copy. Clear the MetaWrench cache and the host cache and try again.
Google Analytics numbers dropped after delaying scripts
Visitors who leave without interacting are not counted. Set Run anyway after to 5 seconds.
Text compression check fails
The server is not compressing. On Apache, the .htaccess rules need mod_deflate or mod_brotli enabled; on Nginx, compression is set in the server config. Ask your host to enable it; most will.

Cache

MetaWrench → Performance → Cache

Two different caches. The page cache saves a finished copy of each page as a plain HTML file and serves it before WordPress even starts, which is typically two to ten times faster to first byte; it helps every visitor including first-timers. The browser cache tells each visitor’s browser to keep your images, stylesheets, scripts and fonts so repeat visits do not download them again.

The top of the tab shows how many pages are cached and when it was last cleared, with a Clear & preload cache button that empties it and rebuilds it from the sitemap.

Settings

Enable static page cache
Switches the page cache on. Logged-in visitors, carts, and any address with a query string are never cached. Cached pages are cleared automatically whenever you edit content, so your changes still show immediately.
How long to keep cached pages
A backstop only, since edits clear the cache anyway. The default is fine.
Enable browser caching
Sends the cache headers. Cache duration applies to images, CSS, JavaScript and fonts only; your pages themselves are never browser-cached by this setting, so edits appear immediately. One year passes Google’s efficient cache policy check.

When something looks wrong

Edits are not showing on the live site
Press Clear & preload cache. If that does not do it, your host has its own page cache (WP Engine, Kinsta, SiteGround, Hostinger and Cloudflare all do) — purge that too. If you edited a stylesheet directly and it is not updating, that is browser cache: hard-refresh.
My host already has a page cache
Turn off Enable static page cache and keep browser caching. Two page caches do not add up to a faster site, and they disagree about when to clear.
A logged-in visitor sees stale content
They should never be served from the cache. If they are, another caching plugin is active; deactivate it.
Pages cached shows 0 after enabling
The cache fills as pages are visited or preloaded. Press Clear & preload cache to build it now. If it stays at 0, the cache folder is not writable; ask your host to make wp-content writable by the PHP user.
Related: Page speed · CDN / DNS

Fonts and videos

MetaWrench → Performance → Fonts & Videos

Two things that quietly cost seconds. Browsers hide your text until the font file arrives, and fetch that file from Google’s servers every time. And a single YouTube embed pulls down more than a megabyte of scripts before anyone decides to press play.

Settings

Show text while fonts load
Text appears immediately in a fallback font, then switches when the real one arrives. Safe on every site.
Connect to Google Fonts early
Opens the connection to Google’s font server before it is needed. Ignored automatically once fonts are hosted on your own server.
Host Google Fonts on my own server
Downloads the font files to your site so visitors never contact Google. Removes a third-party request and helps with privacy rules. Press Download fonts now after turning it on; Remove downloaded fonts undoes it.
Load fonts as early as possible
Starts downloading your two main fonts straight away instead of waiting to discover them. Limited to two so they do not compete with the hero image. Extra font files to load early is for fonts your theme loads itself; leave blank unless you know the exact file.
Load videos only when clicked
Shows the video thumbnail and loads the player on click. Works with YouTube and Vimeo. The visitor sees the same thing until they press play.

When something looks wrong

The font briefly shows wrong, then changes
That is Show text while fonts load working. If the swap is distracting, turn it off — but the page will then show blank text for that moment instead.
Fonts look wrong after self-hosting
A weight or style the theme uses was not in the download. Press Remove downloaded fonts, then Download fonts now again; if it persists, turn self-hosting off.
Download fonts now fails
The server could not reach Google. Ask your host whether outbound HTTPS is allowed from PHP.
A video shows a thumbnail but will not play
The embed is not a standard YouTube or Vimeo iframe, or a script is being delayed on the CSS / JS / HTML tab. Turn off Load videos only when clicked for that page, or exclude the player script.

CDN / DNS

MetaWrench → Performance → CDN / DNS

A CDN serves your static files from a server near each visitor. MetaWrench does not provide one; if you have Cloudflare, BunnyCDN, KeyCDN or similar, this tab points your files at it. The DNS settings below help even without a CDN, by opening connections to outside services before the page needs them.

Settings

CDN URL
The full address your CDN gave you, with https. Every static file on the page is rewritten to load from it. Leave blank to turn it off.
Remove version query strings
Strips the ?ver=6.4 WordPress adds to file addresses. Some older CDNs refuse to cache files with a query string. Leave this off unless a CDN specifically requires it: that version number is what tells browsers a file changed, and with a one-year browser cache, removing it means visitors can keep your old CSS for a year after a theme update — a broken layout only you cannot reproduce. Modern CDNs cache query strings fine.
Enable DNS prefetch
Adds hints for commonly used external domains so the browser resolves them early.
Connect early to other services
Goes one step further and opens the connection to analytics, fonts and your CDN before the page asks for them.

When something looks wrong

Images and styles 404 after entering a CDN URL
The CDN is not set up to pull from your site. MetaWrench only rewrites the addresses; the CDN has to know your origin. Check the pull zone or origin setting in the CDN dashboard, or clear the URL here until it is configured.
The layout broke after a theme update and only some visitors see it
Remove version query strings is on with a long browser cache. Turn it off and ask affected visitors to hard-refresh; the rest clears as their caches expire.
Cloudflare is on but nothing is faster
Cloudflare proxies the whole site at DNS level, so it does not need a CDN URL here at all. Leave the field blank and use Cloudflare’s own caching settings.
Related: Cache

Cleanup

MetaWrench → Performance → Cleanup

Every edit you ever made is still in the database as a revision, alongside auto-drafts, trashed posts and comments, spam, and expired temporary data. None of it is live, all of it slows queries down. This tab shows the count of each before you delete anything, cleans them one type at a time or all at once, and can run on a schedule.

It also holds the one setting that controls what happens to your data if you delete the plugin.

Settings

The cleanup table
Post revisions, auto-drafts, trashed posts, spam comments, trashed comments and expired transients, each with a live count and a Clean up button. A type with nothing to remove shows Clean. Clean all removes every type at once.
Run cleanup automatically
Off, Weekly (recommended) or Daily. Runs the table above on that schedule so the database does not refill between visits.
Revisions to keep per page
WordPress keeps every revision forever by default. Keep 5 is recommended; 3, 10, 20 and none are also available. Applies to new edits from now on; use the cleanup above for revisions already stored.
Also remove everything I have set up
Off by default. With it off, deleting the plugin leaves your business details, services, hours, per-page SEO and settings in the database, so reinstalling picks up where you left off. Turn it on only if you want all of it gone for good. Either way, the cache rules, generated files and scheduled jobs the plugin added are removed on deactivation.

When something looks wrong

A count does not go down after Clean up
Some hosts restrict large DELETE queries. Clean one type at a time, or run it again; each pass removes what it can.
I lost a revision I needed
Cleanup is permanent. Restore the page from a backup taken before the cleanup ran, under Backup → Restore → Database only.
Expired transients come straight back
Normal. Plugins create transients constantly; expired ones are removed on each run. A count in the hundreds a week later is healthy, thousands a day is a plugin misbehaving.
Related: Backup