Google has used Core Web Vitals as a ranking signal since 2021. In theory, every WordPress site owner knows this. In practice, most South African sites still fail the mobile thresholds, and many have barely moved since the update rolled out.
The problem is not a lack of advice. There is plenty of it. The problem is that most advice lists 20 things to do without telling you which ones actually move the needle. After scanning hundreds of South African sites, these are the five that matter most.
1. Serve images in WebP and set explicit dimensions
Largest Contentful Paint (LCP) measures how long the biggest visible element takes to load. On most sites, that element is an image. If that image is a 2MB JPEG with no width and height attributes, you have found your biggest problem.
Converting images to WebP typically cuts file size by 25-35% compared to optimised JPEG, and 60-80% compared to unoptimised originals. Plugins like Imagify, ShortPixel, or the free Squoosh tool handle the conversion. The key step people miss: set explicit width and height attributes on every image so the browser can reserve space before the image loads. This eliminates Cumulative Layout Shift (CLS) caused by images.
2. Remove or defer unused JavaScript
Total Blocking Time (TBT) is the metric most WordPress sites fail hardest. It measures how long the main thread is blocked while JavaScript executes. The usual culprits: contact form plugins that load scripts on every page even if there is no form, slider plugins that were installed and then the slider removed from the page, and analytics scripts loaded synchronously.
Open Chrome DevTools, go to the Coverage tab, and load your homepage. Anything showing 60-80% unused bytes is worth deferring or removing. The defer attribute on script tags, or a plugin like Asset CleanUp, handles most cases without breaking anything.
3. Enable server-side caching
WordPress generates pages dynamically. Every request without caching means PHP, a database query, and a rendered HTML response. On shared South African hosting this can add 400-800ms to every uncached page load.
WP Super Cache (free) or W3 Total Cache with page caching enabled serves pre-built HTML files directly. The difference on Time to First Byte is usually immediate and significant. If your host supports Redis object caching, add that too for logged-in users and WooCommerce sessions.
4. Self-host Google Fonts
Loading fonts from fonts.googleapis.com requires a DNS lookup to an external domain, a connection, and then a redirect to fonts.gstatic.com for the actual font file. On a mobile connection in South Africa, this chain can add 300-600ms to your LCP.
Download the font files, host them on your own domain, and load them with a standard @font-face declaration. The Google Fonts Helper tool (gwfh.mranftl.com) generates the CSS and downloads the files for you in under two minutes. Use font-display: swap to prevent the text from being invisible while the font loads.
5. Preload the LCP image
If your hero image or banner is the LCP element, the browser should know about it as early as possible. Add a <link rel="preload"> tag in your <head> for the image. This tells the browser to fetch it before it parses the rest of the page.
<link rel="preload" as="image" href="/wp-content/uploads/hero.webp" fetchpriority="high">
Most caching plugins have a field for this. If not, add it manually to your theme's header.php or use a plugin like Perfmatters.
In what order should you do these?
Start with caching (3), then images (1 and 5 together), then fonts (4), then JavaScript (2). Caching gives the biggest across-the-board improvement immediately, and it makes the other fixes easier to measure because you are not fighting server response time in every test.
After each change, test on PageSpeed Insights using a mobile connection and an incognito window. The numbers should move within minutes of deploying the fix.
For a full picture of how your site performs across all 20 checks including Core Web Vitals, try the ecommerce sample report or blog sample report to see what the output looks like, then run your own scan.