Lazy load plugins for WordPress used to be essential. Then WordPress 5.5 shipped native lazy loading, and most of what those plugins did became a core feature that is already switched on for you. So the useful question is not which plugin is best. It is whether you need one at all. Some sites do. Most do not. Here is what core already handles, the three gaps it leaves, and which plugins are worth installing to close them.
Quick verdict
- Best overall: Perfmatters, because it covers the parts core cannot reach: CSS background images, YouTube preview thumbnails, and per-image exclusions.
- Best free: no plugin. If your images already carry
loading="lazy", a free lazy load plugin adds JavaScript to redo work the browser is doing for nothing. If you genuinely need more than core and cannot pay, a3 Lazy Load is the free option that reaches widget areas, gravatars and embedded video, and it still gets releases. - Skip it if: your site is a normal blog or brochure site with images in post content. Core has you covered, and a plugin can make LCP worse by lazy loading your hero image.
- Our call: view the page source before you install anything. If you see
loading="lazy"on your below-the-fold images andfetchpriority="high"on your hero, the job is done and your speed problem is somewhere else.
What WordPress core already does
This is the part most roundups leave out, so it goes first. Native lazy loading has been in WordPress since 2020, and core has been sharpening it ever since.
- 5.5 added
loading="lazy"to images in post content, excerpts, text widgets and avatars, on by default, for any image that has width and height attributes. Core back-fills those attributes when a theme omits them. - 5.7 extended the same treatment to iframes, which covers YouTube and Vimeo embeds added through the block editor or auto-embeds.
- 5.9 stopped lazy loading the first image or iframe on the page, because deferring the thing at the top of the screen was hurting Largest Contentful Paint. Testing across 50 popular themes showed LCP improvements up to 30% faster page load.
- 6.3 started adding
fetchpriority="high"to the image core thinks is the LCP element, provided it is at least 50,000 pixels in area. Core will never putfetchpriority="high"andloading="lazy"on the same image.
Put plainly: on a stock install running WordPress 7.1, images in your content are lazy loaded, your hero is not, and your hero gets a priority hint. That is the behaviour a paid plugin was selling you in 2019.
Check yours in ten seconds. Load a post, view source, and search for loading. If your below-the-fold images have it and the top one does not, core is working and you can stop reading roundups and go fix server response time instead.
The three gaps core leaves
Core only rewrites img and iframe tags that pass through the content filters. Three things fall outside that, and they are the only honest reasons to install a plugin.
1. CSS background images. Anything set with background-image in a stylesheet or an inline style attribute is invisible to core. On sites built with Elementor Pro or any other visual page builder, section backgrounds and image boxes are frequently CSS backgrounds, and a long page can carry a dozen of them below the fold.
2. Video embeds still cost you. Core defers the iframe, which is good. But the moment a visitor scrolls it into view, the YouTube player pulls its own scripts and assets. A facade, sometimes called a preview thumbnail, swaps the embed for a static image and only loads the real player when someone clicks play. Core does not do facades.
3. Grid layouts above the fold. Core skips exactly one image by default. On a three-across archive grid, images two and three sit in the viewport and still get lazy loaded, which is the same LCP problem 5.9 was meant to fix. Developers can raise the threshold with the wp_omit_loading_attr_threshold filter; the rest of us want a settings field. If that grid is also shifting as images arrive, read up on stopping layout shift in WordPress before you blame lazy loading.
Lazy load plugins compared
| Plugin | What it adds beyond core | Price | Renewal | Directory status |
|---|---|---|---|---|
| Perfmatters | CSS background images, YouTube facades, exclude leading images, DOM monitoring | $29.95/yr, 1 site | Stated 15% discount on all renewals | Not on WordPress.org, sold direct |
| WP Rocket | Images, iframes and video, plus full page caching | $59/yr, 1 site | Auto-renews after one year, no discount published | Not on WordPress.org, sold direct |
| Optimole | Image CDN with resizing and compression, lazy loading built in | Free up to 2,000 monthly visits | Paid prices not published as a fixed figure | 200,000+ installs, v4.2.11 |
| a3 Lazy Load | Images and videos in widgets, gravatars, iframes core misses | Free | Free | 90,000+ installs, v2.7.9 |
| Lazy Load for Videos | YouTube and Vimeo facades only | Free | Free | 9,000+ installs, v2.18.11 |
| Autoptimize | Lazysizes-based image lazy loading, plus CSS and JS optimization | Free | Free | 800,000+ installs, v3.1.15.1 |
| Smush | Image compression with a lazy load toggle | Free | Free | 1 million+ installs, v4.3.2 |
Perfmatters
Perfmatters is the one to buy if you actually have the gaps described above. Its lazy loading module handles inline and stylesheet background images, iframes and self-hosted video, and it can replace YouTube embeds with a preview thumbnail so the player only loads on click. The Exclude Leading Images setting is the fix for the grid problem: you tell it how many images to skip from the top, no filter required.
- Key features: images, iframes and video, CSS background images, YouTube preview thumbnails, exclude leading images, DOM monitoring, viewport threshold and fade in.
- Price: $29.95/year for one site, $59.95 for three, $124.95 unlimited, in USD. That is roughly half of WP Rocket’s single-site price. Renewals carry a stated automatic 15% discount, so the single site renews near $25.
- Best for: page-builder sites, and anyone who wants to disable unused scripts per page in the same plugin.
- Skip it if: you already run WP Rocket. The lazy loading overlaps almost entirely, and running both means turning one off.
WP Rocket

Two things get confused here. LazyLoad is a feature inside the paid WP Rocket caching plugin, and there is also a separate free plugin called LazyLoad by WP Rocket on WordPress.org. The free one still has 100,000+ installs, but it now carries the directory warning that it has not been tested with the last three major WordPress releases. Treat the free version as legacy.
Nobody should buy WP Rocket for lazy loading alone. You buy it for page caching, preloading and file optimization, and the lazy loading comes along with it. If you are already shopping for one, compare it against the other WordPress caching plugins first.
Some links below are affiliate links. If you buy through them we may earn a commission, at no extra cost to you.
- Key features: LazyLoad for images, iframes and videos, YouTube thumbnail replacement, per-post and per-image exclusions, and a fade-in option, on top of caching.
- Price: $59/year for one site, $119 for three, $299 for 50, in USD.
- Renewal: the pricing page says the licence renews automatically after one year and publishes no separate renewal figure, so budget for the same amount.
- Best for: people who want caching and lazy loading configured from one screen.
- Skip it if: your host already runs server-level caching. You would be paying for the half of the plugin you cannot use.
Optimole

Optimole is not really a lazy load plugin, and that is the point. It routes your images through a CDN that resizes and compresses them per device, and lazy loading is one setting inside that. If your problem is 2 MB photographs rather than load timing, this fixes the actual problem, and it belongs next to the other image optimization plugins rather than in a lazy load shortlist.
- Key features: automatic resizing and compression, CDN delivery, format conversion, lazy loading, and offloading images out of your media library.
- Price: the free tier covers unlimited optimizations for sites up to 2,000 monthly visits. The pricing page renders its plan figures with JavaScript and quotes in local currency, so no paid figure is quoted here; confirm at checkout.
- Best for: photo-heavy sites on modest hosting, where bandwidth is the constraint.
- Skip it if: you are uncomfortable with your images being served from a third-party domain, or your traffic is well past the free tier and you need a fixed cost you can quote a client.
a3 Lazy Load

The free dedicated lazy load plugins in the directory are mostly abandoned. a3 Lazy Load is not: version 2.7.9 landed in June 2026 with a security fix, and it is tested against WordPress 7.0.4. Its value is reach, because it will lazy load images and videos inside widgets, gravatars, and iframes that core skips.
- Key features: per-area toggles for post content, pages, custom post types, sidebar, header and footer widgets, post thumbnails, gravatars, embedded video and iframes. Currently 90,000+ active installs, tested to WordPress 7.0.4.
- Price: free.
- Best for: older themes that push a lot of media through widget areas core does not filter.
- Skip it if: you need CSS background images handled. It does not do them, despite what a lot of roundups claim.
Lazy Load for Videos

Narrow, and better for it. This does one thing core does not: it replaces YouTube and Vimeo embeds with a preview image and loads the player only when someone clicks. If you publish tutorials with three embeds per post, this is the free version of the facade feature you would otherwise pay Perfmatters for.
- Key features: YouTube and Vimeo facades, custom play button and thumbnail styling, and an option to strip the player chrome. 9,000+ installs, version 2.18.11, tested to WordPress 6.9.7.
- Price: free.
- Best for: video-heavy blogs that do not otherwise need a performance plugin.
- Skip it if: you embed videos rarely. One embed per post is not worth another plugin in the stack.
Autoptimize

Autoptimize is a CSS and JavaScript optimizer that happens to include a lazy load checkbox driven by the lazysizes library. Nobody installs it for that. They install it to aggregate and minify assets, and the image options are a convenience. It is worth knowing about because it is on 800,000+ sites, which means there is a decent chance it is already on yours, quietly doubling up with core.
- Key features: CSS and JS aggregation and minification, critical CSS, image optimization with WebP and AVIF support, and lazysizes-based lazy loading. 800,000+ installs, version 3.1.15.1, tested to WordPress 7.1.
- Price: free.
- Best for: sites where render-blocking CSS and JavaScript are the real bottleneck, not images.
- Skip it if: lazy loading is all you came for. Turning on its image lazy load while core is doing the same thing is how you end up with two mechanisms fighting over the same tags.
Smush

Smush is on more than a million sites, and lazy loading is free in it rather than gated behind the pro tier. Like Optimole, its real job is compression and resizing. The lazy load toggle gives you output-area control that core does not expose, so you can restrict it to content, thumbnails or widgets.
- Key features: bulk compression, automatic optimization on upload, resizing, and a lazy load module with media-type and output-area filters. 1 million+ installs, version 4.3.2, tested to WordPress 7.1.
- Price: free, including lazy loading. Pro tiers exist for CDN and bulk limits.
- Best for: a media library full of oversized uploads from clients who ignore your instructions.
- Skip it if: you already compress images at upload with another tool. Two optimizers on one library is asking for trouble.
The ones to skip
These three still show up in lazy loading lists across the web, including the earlier version of this one. They should not.
- BJ Lazy Load. Closed on WordPress.org as of 4 May 2026, reason given as a security issue. The last release was 1.0.9, tested to WordPress 4.9.31. If it is on a site you manage, remove it today, not this weekend.
- Lazy Load Optimizer. Last updated January 2021 and flagged by the directory as untested with the latest three major releases. Around 3,000 sites still run it against a plugin that predates the 5.9 and 6.3 improvements entirely.
- Speed Up – Lazy Load. The most honest plugin in the category. Its own readme now says it is no longer needed because WordPress has lazy-loaded images since 5.5 and iframes since 5.7, and a recent release added a dashboard notice telling users they can deactivate it. Its author says the only remaining reason to keep it is CSS background images.
What most roundups get wrong
They present lazy loading as free speed. It is not. It is a trade: you defer bytes in exchange for a request that starts later. Defer the wrong image and you have moved your Largest Contentful Paint backwards.
That is exactly the mistake core spent two releases fixing, and it is the mistake a plugin can reintroduce. Plugin lazy loading usually works by replacing the src with a placeholder and swapping it back in JavaScript. That is strictly slower than the browser’s native implementation, because the browser can start fetching before JavaScript has parsed. If a plugin lazy loads your hero, you are waiting on a script to tell the browser to download the picture it could already see.
The second thing they get wrong is stacking. Core lazy loads, your caching plugin lazy loads, your image plugin lazy loads. Each one rewrites the same tag. Pick one mechanism, turn the others off, and test. Google’s Core Web Vitals thresholds give you the pass mark to test against: LCP within 2.5 seconds, INP of 200 milliseconds or less, and CLS of 0.1 or less. INP replaced First Input Delay as a Core Web Vital in 2024, so any advice written against FID is out of date.
Third: lazy loading is a bandwidth optimization, not a hosting fix. If your time to first byte is 900 ms, deferring images changes nothing that matters. Look at where your site is hosted before you look at plugins.
Which one should you install?
- Standard blog or business site, images in post content. Nothing. Core handles it. Spend the effort on general WordPress speed work instead.
- Page-builder site with CSS background sections. Perfmatters, and turn off the leading-image lazy load for your hero.
- Lots of YouTube embeds, no budget. Lazy Load for Videos, on its own.
- Huge uploads and a slow media library. Smush or Optimole. Your problem is file size, not deferral.
- Already buying a caching plugin. WP Rocket, and use its LazyLoad rather than adding a second plugin.
Frequently Asked Questions
Do I still need a lazy load plugin in WordPress?
Usually not. WordPress has added loading=lazy to content images since 5.5 and to iframes since 5.7, on by default. A plugin only earns its place if you need CSS background images, video facades, or control over how many top-of-page images are skipped.
How do I check whether lazy loading is already working?
Open a post, view the page source, and search for the word loading. Below-the-fold images should show loading=lazy. Your hero image should not, and on WordPress 6.3 or later it should carry fetchpriority=high instead. If that pattern holds, core is doing its job.
Can lazy loading hurt my Core Web Vitals?
Yes. Deferring the largest image in the viewport pushes back Largest Contentful Paint, which is why WordPress 5.9 stopped lazy loading the first image. Any plugin that lazy loads your hero will do the same damage. Always exclude above-the-fold images.
Can I run two lazy load plugins at once?
No. Each one rewrites the same image tags, and the second usually breaks the first. Pick one mechanism, whether that is core, your caching plugin or a dedicated plugin, then disable lazy loading everywhere else and retest.
Why are my CSS background images not lazy loading?
Because core only rewrites img and iframe tags. Anything set with background-image in a stylesheet or an inline style is invisible to it. Perfmatters handles both inline and stylesheet backgrounds; that is the main reason to pay for a lazy load plugin in 2026.
Does lazy loading affect SEO or image indexing?
Native lazy loading does not, because Googlebot renders pages and handles the loading attribute. JavaScript-driven plugin lazy loading is riskier, since images only exist after a script runs. If image search matters to you, prefer the native attribute over a script-based plugin.
How do I turn off WordPress native lazy loading?
Add a filter that returns false from wp_lazy_loading_enabled, or set the wp_omit_loading_attr_threshold filter higher to skip more images from the top. Turning it off entirely is rarely the right move; raising the threshold for grid layouts usually is.
Is BJ Lazy Load safe to keep using?
No. It was closed on WordPress.org on 4 May 2026 over a security issue, and its last release was version 1.0.9, tested against WordPress 4.9.31. Deactivate and delete it, then rely on core lazy loading instead.
The verdict
Install nothing. That is the answer for most sites reading this, and it is the answer the rest of the internet will not give you because there is no affiliate commission in it. Core lazy loads your content images, skips your hero, and hints the browser to prioritise it. Check the page source and confirm before you spend money.
If you checked and found a real gap, buy Perfmatters at $29.95 for the year. CSS background images, YouTube facades and the leading-image exclusion are the three things core does not do, and it does all three for roughly half the price of WP Rocket. Choose WP Rocket instead only if you also need caching, in which case the lazy loading is a bonus rather than the purchase.
And if you are running BJ Lazy Load, Lazy Load Optimizer or Speed Up on a live site, deleting them tonight is the highest-value performance work available to you. Once that is done, the next lever is usually your content workflow, not your plugin list, so tighten up how you optimize posts before publishing.




[…] plugin for another. If you have not set the foundation yet, start with your caching plugin and your lazy loading setup before you blame the […]
[…] route ad containers through your lazy loading plugin. Image lazy loaders and ad scripts fight, and the ad usually […]