Wordpress 14 August 2026 7 min read

5 WordPress Plugins Quietly Killing Your Core Web Vitals

Pick up any WordPress site that has sat untouched for a year and you will almost always find the same thing. The theme looks fine, the content is solid, but the Core Web Vitals scores are in the red. Most of the time, it is not the theme causing it. It is the plugins. Specifically, a handful of well-intentioned tools that add far more weight to the front end than anyone realised when they were first installed.

On this page
  1. Page Builder Plugins With Unloaded CSS Everywhere
  2. What Slider and Carousel Plugins Actually Load
  3. Do Chat and Pop-Up Widgets Hurt INP Scores?
  4. Font and Icon Plugins That Block the First Render
  5. WooCommerce Add-Ons That Load on Non-Shop Pages
  6. Finding Which Plugin Is Actually Responsible
Share:

Page Builder Plugins With Unloaded CSS Everywhere

Elementor is the clearest example of this pattern. Install it, build five pages with it, and it will load its full stylesheet on every single page of your site, including your contact form, your blog archive, and any page built entirely in the native editor. Open Chrome DevTools, run the Coverage tab while the page loads, and you will often see 60 to 80 percent of Elementor’s CSS flagged as unused. That unused payload sits between the browser and your content, pushing up the render-blocking time and dragging LCP with it. The browser has to parse the whole file before it can paint anything meaningful to the screen.

Trimming that dead CSS makes a measurable difference to LCP because the browser gets to the content sooner. The practical fix is to use Elementor’s built-in “Improved Asset Loading” option, which attempts to load only the widgets present on each page, though it does not always catch everything. A more thorough approach is to test each template in the Coverage panel after enabling it, check what remains flagged as unused, then decide whether a lighter page builder or a hand-coded plugin audit makes more sense for that site. There is no shortcut here. It takes time to do it properly.

Slider plugins look tidy inside the WordPress dashboard. Pick a layout, drop in some images, publish. What you don’t see is the payload being sent to every visitor, a full JavaScript library, often multiple CSS files, and in some cases lazy-load scripts that fire before the page has even painted its first meaningful content.

Plugins like Slider Revolution and Smart Slider 3 are common offenders, not because they’re poorly built, but because the feature set they carry is enormous relative to what most sites use. That weight lands directly on your Largest Contentful Paint score, pushing the metric out by hundreds of milliseconds before a single product image or headline has rendered.

The practical problem is that sliders almost always sit above the fold, right where Google measures LCP. The browser ends up waiting for JavaScript to initialise before it can even work out what the largest visible element is. You end up serving a complex animation framework to every visitor, including those on a 4G connection in a rural area, just to display three images cycling on a five-second timer. Most clients who remove a slider and replace it with a single static image see a measurable LCP improvement without touching anything else on the page. The trade-off rarely makes sense once you see it clearly laid out in PageSpeed Insights.

Do Chat and Pop-Up Widgets Hurt INP Scores?

Chat widgets and pop-up builders are among the worst offenders for Interaction to Next Paint, and the reason sits in how they load. Most of these tools inject third-party scripts that register dozens of event listeners the moment the page initialises, long before a visitor has clicked anything. Every tap or keypress then has to work through that stack before the browser can respond, and INP measures exactly that delay. A live chat plugin from a well-known provider can add 80 to 120 milliseconds to an INP reading on its own, which is enough to push a borderline site from “Needs Improvement” into the failing band.

When scripts load matters as much as what they load

Scripts loaded synchronously in the <head> block the main thread during the most sensitive part of page startup. Any interaction shortly after load hits a thread that is already busy. Lazy-loading the widget until after the first user interaction cuts that cost dramatically, but most pop-up plugins don’t do this by default.

If you open Chrome DevTools and run a trace while clicking a button on a page with a chat widget active, you’ll often see long tasks of 200ms or more attributed directly to the third-party script. The fix is rarely about the widget itself. It’s about controlling when and how those scripts reach the main thread.

Font and Icon Plugins That Block the First Render

Most font and icon plugins drop their stylesheet into the document <head> as a standard blocking resource. The browser has to fetch that external file before it can paint anything on screen, which pushes your Largest Contentful Paint further out than it needs to be. A site running a Google Fonts plugin alongside a Font Awesome icon library can easily add 300 to 600 milliseconds of render delay on a slow connection, simply because both stylesheets sit in the critical path. That might sound marginal, but it shows up plainly in LCP and the other Core Web Vitals metrics that Google uses as ranking signals.

Self-hosting is the cleaner fix

Load these resources asynchronously or, better still, self-host the fonts and inline only the subset you need. Most out-of-the-box font plugins ship with synchronous loading because it’s the safe default, not because it’s the right one. Swapping a Google Fonts plugin for a self-hosted font with a font-display, swap declaration removes the third-party round-trip entirely.

With icon libraries, the better approach is to load only the specific icons a page uses rather than the entire library, which is what most plugins fetch by default. None of this is complicated once you know where to look, but it does take a methodical eye across what your plugin stack is requesting on each page load.

WooCommerce Add-Ons That Load on Non-Shop Pages

WooCommerce itself is reasonably well-behaved about where it loads its scripts, but the ecosystem around it is far less careful. Extensions for wishlists, product reviews, currency switchers and dynamic pricing almost all enqueue their JavaScript and CSS globally by default. That means a visitor reading a blog post or landing on your homepage still downloads the full payload for features they cannot possibly use there. A currency switcher script that belongs on a product page has no business adding weight to your contact form. That extra load hits your Largest Contentful Paint and Interaction to Next Paint scores before the visitor has even seen a product.

Conditional loading is usually the biggest single win

A short block of PHP in your functions file checks whether the current page is a shop, product, cart or checkout page, and only registers the extension’s assets there. For most WooCommerce sites carrying four or five add-ons, stripping those scripts from non-shop pages can shave several hundred milliseconds off Time to First Byte and LCP on the pages that actually drive traffic.

It takes careful testing to confirm nothing breaks on edge cases, but the payoff is real. This is the kind of methodical, under-the-hood work that rarely shows up in a plugin’s changelog, yet it changes what real visitors experience the moment they land on your site.

Finding Which Plugin Is Actually Responsible

The most reliable starting point is Chrome DevTools, specifically the Coverage tab. Open it via the three-dot menu, go to More Tools, then Coverage, and hit the record button while your page loads. What you get is a breakdown of every JavaScript and CSS file loaded on the page, with a column showing how much of each file ran. A plugin serving 400KB of JavaScript where 80 percent goes unused is a clear signal that something is adding far more than the page needs. That unused code still has to be downloaded, parsed and evaluated by the browser, and it shows up in your Largest Contentful Paint and Interaction to Next Paint scores before a single user clicks anything.

Once you have suspects, WordPress plugins that load scripts on every page are the ones to isolate first using staged deactivation. Disable plugins in small batches, clear your cache, and re-run PageSpeed Insights after each round.

It takes time, but it is the only way to be certain. Two plugins can each look fine individually while causing problems in combination. Query Monitor is worth installing alongside this process because it surfaces database queries, HTTP requests and script enqueues tied to specific plugins, giving you a second layer of evidence beyond raw file sizes. Between Coverage, Query Monitor and a methodical deactivation sequence, you can usually pin down the exact offender within an hour or two.

Share:

Ready to take the next step?

Get in touch today and find out how we can help.

Get In Touch
Privacy Overview

Yorkshire Design uses cookies so that we can provide you with the best user experience possible.

Cookie information is stored in your browser and performs functions such as recognising you when you return to our website and helping our team to understand which sections of the website you find most interesting and useful.