Available — Local Digital Products
HCA · Studio
TR Contact ↗
Technical Note 05 · Performance

Four interventions that actually make WordPress fast

Installing a speed plugin raises the score on most sites but rarely cuts load time as much as expected. The real gains sit in four places: image format, the LCP element, layout shift and third-party requests.

Focus
Real load time
Scope
WordPress + static
Measure
Core Web Vitals
Short answer

Most measurable speed gain in WordPress comes from four interventions: (1) converting images to WebP server-side — on most sites the single largest item; (2) announcing the largest above-the-fold image (the LCP element) with preload and exempting it from lazy loading; (3) closing layout shift (CLS) by giving images and logos explicit dimensions; (4) moving third-party requests such as Google Fonts onto your own server. Installing a plugin does not substitute for these.

Measure first

Before optimising, know what is slowing the site down; otherwise hours go into the wrong place.

The practical method: open the network tab in developer tools, disable cache and load the page. Then answer two questions:

  • What percentage of total weight is imagery? On most WordPress sites the answer is above 70%.
  • Which is the largest element visible on first screen, and when does it arrive? That is your LCP element.

Those two answers set the order of work.

1. Convert images to WebP

This is the single largest gain on almost every site, and the most frequently skipped step.

A typical WordPress uploads folder swells over the years with unoptimised JPEGs and PNGs. In a real case, a café's image folder dropped from about 147 MB to roughly 10 MB — through format conversion alone, with no visible quality loss.

The correct approach has two parts:

  • Bulk-convert existing images. Scan the uploads folder on the server with Imagick or similar and generate WebP copies.
  • Convert new uploads automatically. Otherwise the folder swells again within months.

Things to watch: do not delete originals immediately (you may need to revert), check that transparency survives on PNGs, and actually look at the site afterwards. Over-compression costs more than the second it saves.

2. Preload the LCP element

Largest Contentful Paint measures when the largest above-the-fold element is painted. On most sites that is a hero image, and the problem is this: the browser only learns the image exists after downloading and processing CSS.

Announcing it early removes that delay:

<link rel="preload" as="image"
      href="/uploads/2026/hero.webp"
      fetchpriority="high" />

Two mistakes are common here:

  • Lazy-loading the LCP image. Applying loading="lazy" to an above-the-fold image does not improve LCP, it directly worsens it. Lazy loading is for images below the fold only.
  • Preloading everything. Preload is a priority hint; give everything priority and nothing has it. One element per page, two at most.

Note that the LCP element is not the same on every page. It may be a hero image on the home page, a product photo on a product page, and a block of text on an article page. If it is text, there is no image to preload — the work moves to fonts.

3. Close layout shift

Cumulative Layout Shift measures content jumping while the page loads. It is the most irritating behaviour from a user's point of view: the line you started reading slides away, the button you were about to tap moves.

The cause is nearly always the same: the browser does not know in advance how much space an element will take.

  • Images without dimensions. Every <img> should carry width and height. The browser derives the aspect ratio from them and reserves the space up front.
  • The header logo. It gets overlooked because it is small, but sitting at the very top it shifts everything below it. On a real site, an unsized logo alone caused a visible jump across the whole page.
  • Font swapping. If the fallback and the real font have different widths, text reflows. font-display: swap plus a closely matched fallback stack reduces it.

4. Self-host your fonts

A page using Google Fonts connects to at least two extra servers: fonts.googleapis.com for the stylesheet and fonts.gstatic.com for the font files. Each new server connection means a DNS lookup, a TCP handshake and a TLS negotiation.

Moving fonts to your own server removes both connections entirely:

  1. Take the CSS output Google serves (open the URL in a browser).
  2. Download every woff2 file it references and place them on your site.
  3. Copy the @font-face rules into your own stylesheet verbatim — keep the unicode-range lines.
  4. Point the paths at your files and preload the fonts used above the fold.

Dropping the unicode-range lines is a common mistake. They tell the browser which file covers which character range; without them the browser downloads alphabets it does not need. For Turkish there is an extra catch: characters such as İ, ş, ğ and ç live in latin-ext — take only the latin file and those letters fall back to another font, leaving the text visibly mixed.

The same principle applies to all third-party requests: every external server is a source of delay, and most are not truly necessary.

Caution: don't pay for speed in sales

The most dangerous part of optimisation is breaking what you are not measuring while improving what you are.

The commonest example: a speed plugin deferring all JavaScript. The score rises, the page feels fast — and WooCommerce's block-based checkout stops working, so customers meet "your cart is empty". The details and the fix are in a separate note.

So after every optimisation, check the flow, not the score: in a private window, add a product, go to checkout, fill the form. Sites scoring 100 that take no orders are far more common than sites scoring 80 that sell.

Summary

The order is clear: convert images to WebP, then preload the LCP element and exempt it from lazy loading, then fix images without dimensions, then move third-party requests in-house.

After those four, a speed plugin's contribution is measurable but small. Installed without them, it mostly decorates the score and leaves the experience unchanged.

Priority order
1. Images
Server-side WebP conversion + automatic conversion on new uploads
2. LCP
Preload the large above-the-fold image, exempt it from lazy loading
3. CLS
width/height on every img — including the logo
4. Fonts
Self-host; preserve unicode-range (Turkish needs latin-ext!)
Measurement
Network tab: image share of weight, and LCP element identity
Trap
Blanket JS defer breaks the payment flow — score up, sales down
Verification
Test the flow, not the score: cart → checkout → form
Frequently Asked Questions

About speed optimisation.

Isn't installing a speed plugin enough?

Usually not. Plugins handle caching, compression and concatenation, which help — but they do not fix the unoptimised images that make up most of the weight on most sites, a wrongly flagged LCP element, or images without dimensions. Installed before those four are done, a plugin mostly decorates the score.

Does converting images to WebP hurt quality?

At sensible settings, imperceptibly. In a real setup an image folder dropped from about 147 MB to roughly 10 MB with no visible quality loss. Watch three things: do not delete originals immediately, verify transparency survives on PNGs, and inspect the site visually after conversion.

Would lazy loading my LCP image make it faster?

No — the opposite. Applying loading="lazy" to an above-the-fold image makes the browser request it later and worsens LCP directly. Lazy loading is correct only for images below the fold; the LCP element should be preloaded instead.

Should I self-host fonts instead of using Google Fonts?

Yes, it is a measurable gain because two external connections disappear. When moving them, copy the @font-face rules verbatim and keep the unicode-range lines. Critical for Turkish: letters such as İ, ş and ğ live in latin-ext, so taking only the latin file leaves them rendered in a fallback font.

Availability and Quotes

Visible in local search.
Credible in the product.