1. Plugin overlap
The single most common cause. Three plugins doing similar jobs each load their own CSS and JavaScript on every page, including pages that don't use them. Auditing and consolidating the plugin list often removes a second or more of load time on its own.
2. Images shipped at the wrong size
A 3000px photo displayed in a 600px slot is the most expensive mistake on most pages. Serve modern formats, generate proper sizes, and lazy-load anything below the fold — but never lazy-load your hero image, which is usually the element Core Web Vitals measures.
3. No caching layer
WordPress rebuilds pages from the database on every request unless you tell it not to. Page caching plus a CDN in front is the highest-return hour of work available on almost any WordPress site.
4. Hosting that can't keep up
Very cheap shared hosting throttles PHP and databases under load. If your Time To First Byte is above roughly 800ms with caching enabled, the host is usually the bottleneck and no amount of front-end work will hide it.
5. Page builders left unoptimised
Elementor and similar tools are not inherently slow, but the default output includes far more markup and CSS than most pages need. Disabling unused widgets, trimming global assets and avoiding deeply nested sections makes a measurable difference.
How to prioritise
Measure first with a real field-data tool rather than guessing, fix hosting and caching, then images, then the plugin stack. Re-measure after each change so you know what actually helped.
- Run a baseline on mobile, not just desktop
- Fix TTFB before front-end micro-optimisation
- Track Core Web Vitals for four weeks after changes