u/AcceptableClassroom2

Performance issues we found across 500+ WordPress sites (ranked by frequency)

Over the past two months we ran web performance scans on 500+ WordPress sites. Here are the top 3 issues that we found, ranked by how often it showed up:

1. Too many plugin stylesheets (25% of sites)

A site with 15–20 plugins routinely loads 12–18 separate CSS files before it paints a single pixel. The user sees a blank white screen for 1–3 seconds.

To see what's happening on your own site: open Chrome DevTools (F12), go to the Network tab, and filter by CSS. Each row is a stylesheet your browser had to download before it could show the page.

  • The CSS minification and async loading settings in plugins like WP Rocket are the highest-impact toggles you can enable without touching code.

2. Hero image loading too late (22% of sites)

If your hero is a CSS background-image, the browser can't discover it until after it's parsed your blocking CSS. That's often 800ms+ before the image request even starts.

Several problems tend to stack on top of each other:

  • The image isn't marked as important.
  • The image is too large for mobile. Sending a 2400-pixel-wide image to a phone screen that's 390 pixels wide downloads 8–12 times more data than necessary.
  • The image format is outdated. WordPress has generated WebP images on upload since version 5.8, but only for images uploaded after that upgrade. Anything older is still being served in its original format.

Some common fixes:

  • If your hero is a CSS background, the partial workaround is adding a preload hint in the head of your theme. This tells the browser to start fetching the image early even before it processes the CSS.
  • The proper fix is converting it to a regular image tag and marking it as high priority, which you can do in your theme or page builder template.

3. JavaScript blocking interaction (7.4% of sites, highest avg impact)

Page looks fully loaded, but nothing responds to clicks or taps. Most users think the site is broken.

  • Load scripts after the page: a defer flag on a script tells the browser "download this while the page loads, but don't run it until after everything is displayed." This removes the freeze without removing the feature.
  • Move scripts to the bottom of the page: less precise than defer, but scripts at the bottom run after the visible content is ready rather than blocking it.
  • Only load scripts when needed: the best option for sliders or popups is to not load their JavaScript at all unless the user is about to interact with them. This requires a bit more work, but it eliminates the cost entirely.

Hope this info is useful. Happy to answer questions on any of these.

reddit.com
u/AcceptableClassroom2 — 10 hours ago