Image Load Lab

Guides WordPress Workflow Tested Oct 18, 2026 Live site · 7 loads per version

Our Theme Lazy-Loaded the First Archive Image: What WordPress Does Instead

Forcing loading=lazy on archive cards overrode WordPress. Letting WordPress 7.1.2 decide gave the first card fetchpriority=high, and it was requested 360 to 500 ms sooner.

Since version 5.5, WordPress adds loading="lazy" to images automatically. Later versions refined that: in the main list of posts, WordPress leaves the first images eager and gives the first one fetchpriority="high", so the images a visitor sees first are not delayed. A theme can override all of this by passing its own loading value, and ours did. What did the override cost on this site’s archive pages, and what does WordPress 7.1.2 do when the theme lets it decide? We found the problem in our own theme, fixed it, and measured both versions on the live site.

What we found

We listed the attributes of every <img> on six pages of this site. On the guide index and the category archives, every card image carried loading="lazy", including the first, which sits in the first screen on a phone. The cause was one line in our theme: the function that prints a card passed 'loading' => 'lazy' to get_the_post_thumbnail(). When a theme passes a value, WordPress uses it and skips its own logic.

In theme version 2.0.5 we stopped passing loading for the archive cards and let WordPress choose. The cards further down the home page and the related guides under each article keep loading="lazy", since they are never in the first screen.

Attributes in the HTML of the guide index, WordPress 7.1.2
Card Theme forced lazy (2.0.4) WordPress decides (2.0.5)
1 loading=lazy, fetchpriority=(none), sizes=auto… loading=(none), fetchpriority=high
2 loading=lazy, fetchpriority=(none), sizes=auto… loading=(none), fetchpriority=(none)
3 loading=lazy, fetchpriority=(none), sizes=auto… loading=(none), fetchpriority=(none)
4 loading=lazy, fetchpriority=(none), sizes=auto… loading=lazy, fetchpriority=(none), sizes=auto…
5 loading=lazy, fetchpriority=(none), sizes=auto… loading=lazy, fetchpriority=(none), sizes=auto…

WordPress then marked the first card fetchpriority="high", left the second and third without a loading attribute (eager), and lazy-loaded the fourth card onwards with sizes="auto, …". The category archives received the same pattern.

How we measured the difference

Once the fix was live, we loaded the guide index and the “Formats & compression” archive seven times each in two versions. The first was the page as WordPress now serves it. The second was the same page with its HTML rewritten in the browser to put loading="lazy" back on every card and remove fetchpriority, which reproduces the old theme exactly. We used Chrome 155.0.8059.82 driven by Playwright, with a phone viewport, 150 ms latency, 1.6 Mbit/s and the CPU slowed four times. We recorded when the first card image was requested and finished, and the Largest Contentful Paint. See our methodology.

Results

Grouped bar chart: on the guide index the first card image was requested at 1,068 ms when WordPress chose the attributes and at 1,563 ms with loading=lazy forced; on both pages it finished loading 263 and 193 ms sooner without forced lazy loading
When the first card image was requested and finished loading on two archive pages of this site, with WordPress’s own loading attributes and with loading=lazy forced on every card. Chart generated from the linked CSV.
Chrome 155.0.8059.82 via Playwright on the live site, October 18, 2026; the forced-lazy version reproduces theme 2.0.4 by rewriting the HTML
Page Card images First image: loading / fetchpriority Request starts Image loaded LCP (element)
Guide index WordPress decides none / high 1,068 ms 2,454 ms 1,412 ms (p)
Guide index loading=lazy forced lazy / none 1,563 ms 2,717 ms 1,572 ms (p)
Category archive WordPress decides none / high 854 ms 2,248 ms 1,172 ms (p)
Category archive loading=lazy forced lazy / none 1,216 ms 2,441 ms 1,224 ms (p)

The first card image was requested 360 to 500 ms earlier when WordPress decided: at 1,068 ms instead of 1,563 ms on the guide index, and at 854 ms instead of 1,216 ms on the category archive. A lazy image is only requested after layout, when the browser knows it is near the screen; an eager one can be found by the preload scanner while the HTML is still arriving.

It finished loading 193 to 263 ms sooner. The gap shrank because the image, once requested, still had to share the slow connection with the page’s other resources.

LCP did not depend on it. On both pages, the largest element in the first screen was the introductory paragraph, not the card image, so LCP stayed between 1.2 and 1.6 seconds in both versions. The medians were slightly lower without forced lazy loading, but within the variation between loads. The visible benefit is that the first card’s picture appears sooner, not a better LCP score.

What to check in your theme

  • Search your theme for 'loading' => 'lazy' in calls to get_the_post_thumbnail(), the_post_thumbnail() and wp_get_attachment_image(). In the main loop of archive and home templates, leave the attribute out so WordPress can decide.
  • Keep explicit lazy loading where it is always right, such as related posts at the bottom of an article or a footer gallery.
  • Look at the rendered HTML, not the template. View the page source as a logged-out visitor and check the first images for fetchpriority="high" and the absence of loading="lazy".
  • Do not lazy-load the LCP image. If your archive’s largest element is a card image, forced lazy loading would cost LCP directly, as in our lazy-loading test and the Lighthouse discovery test.
  • Check the content images too. Our own publishing script writes loading="lazy" on the figures inside each guide. That is right on this site, where every article opens with a title, a summary and an introduction before the first figure, but not for an article that starts with an image.

Practical conclusion

Our theme forced loading="lazy" on every archive card and so disabled WordPress’s own handling of the first images. Letting WordPress 7.1.2 decide gave the first card fetchpriority="high", kept the first three eager and lazy-loaded the rest. On a throttled phone, the first card image was requested 360–500 ms earlier and finished 190–260 ms earlier. LCP did not change here because a paragraph was the largest element.

Limitations

Two archive pages of one site, seven loads per version, one network profile, Chrome only. The “before” version was reproduced by rewriting the HTML in the browser rather than by reinstalling the old theme, which keeps everything else identical but is not a byte-for-byte copy of the old server response.

Data and files

Download wp-archive-lazy-live.csv (28 rows, 3.6 KB) · Download wp-img-attributes-theme-204.csv (105 rows, 17.8 KB) · Download wp-img-attributes-theme-205.csv (105 rows, 17.8 KB) · Method: testing methodology.

When Alt Text Breaks srcset: A WordPress sizes Quirk

WordPress checks for an existing sizes attribute by searching the whole img tag, alt text included. Five of our images lost sizes that way and downloaded full-size files on desktop.

WordPress Workflow 4 min read