How to Build a Fast WordPress Site in 2026 (Without a Page Builder Tax)

Build it lean: a fast host with server-level caching and PHP 8.3+, a lightweight block theme instead of a page builder, and only the plugins you truly need. Then optimize images, fonts, and Core Web Vitals. Most speed gains come from removing things, not adding plugins.
Part of the complete web development guide.
On this page
- Start by measuring the right thing
- The hosting layer most people ignore
- Cut the page builder, or at least contain it
- Dequeue what you don’t use
- Fonts and images: where the seconds actually go
- Don’t install five caching plugins
- A realistic order of operations
- FAQ
- Do I need to switch to a static site to be fast?
- Is a page builder always bad for performance?
- How often should I re-check Core Web Vitals?
Most “slow WordPress” problems aren’t WordPress. They’re the twenty plugins, the page builder, and a theme that ships 400KB of CSS you never use. I’ve rebuilt enough of these sites to know the fix is usually subtraction, not another caching plugin. Here’s how I actually approach performance in 2026, with the code and settings that matter.
Start by measuring the right thing
Don’t chase a number in a browser extension. Core Web Vitals in Search Console, plus real user data from your own analytics, tells you what actual visitors experience. Lab tools like Lighthouse are useful for spotting problems, but they run on a fast connection with no network jitter. If your field data shows LCP over 2.5 seconds on mobile, that’s the number to fix.
Three metrics carry the weight:
- LCP (Largest Contentful Paint): usually your hero image or main heading. Target under 2.5s.
- INP (Interaction to Next Paint): replaced FID in 2024. Target under 200ms. This is where heavy JavaScript gets you.
- CLS (Cumulative Layout Shift): target under 0.1. Almost always caused by images without dimensions or late-loading fonts.
The hosting layer most people ignore
You can optimize plugins all day and still lose to bad hosting. In 2026, PHP 8.3 is the floor and 8.4 is common. If your host is still on 7.4, that’s your first fix, not a caching plugin.
What actually matters in a host:
- Server-level page caching, not just a plugin. Nginx FastCGI cache or LiteSpeed cache beats a PHP-based cache every time because it never boots WordPress.
- HTTP/3 and Brotli enabled by default.
- Object caching (Redis) if you run WooCommerce or anything with heavy database queries.
- A CDN with edge caching. Cloudflare’s free tier is fine for most sites. If you’re serving customers across the US from a Commack office, a CDN isn’t optional.
Cut the page builder, or at least contain it
This is the single biggest win, and it’s the one people resist. Elementor, Divi, and WPBakery generate DOM that’s three to five times larger than hand-written markup, and they load their own CSS and JS on every page whether you use the features or not.
You have options:
- Block editor plus a lightweight block plugin. Core blocks with a custom theme is the fastest path. GenerateBlocks or similar gives you layout control without the framework.
- Keep the builder but disable it where it isn’t used. Most builders let you turn off their assets per post type or per template.
- Build custom templates. For a business site with a handful of page types, hand-coded templates in a child theme are smaller and faster than any builder output.
If you’re past the point where a theme and plugins can get you there, this is where custom web development usually makes more sense than fighting a builder.
Dequeue what you don’t use
Every plugin that enqueues CSS or JS on every page is a tax. You can deregister assets on pages that don’t need them. Here’s a real example that drops Contact Form 7 assets everywhere except the contact page:
add_action( 'wp_enqueue_scripts', function () {
if ( ! is_page( 'contact' ) ) {
wp_dequeue_style( 'contact-form-7' );
wp_dequeue_script( 'contact-form-7' );
wp_dequeue_script( 'swv' ); // CF7's submit-button script
}
}, 100 );
Same idea for WooCommerce on non-shop pages, or a slider plugin you only use on the homepage. The 100 priority matters: you need to run after the plugin enqueues.
Fonts and images: where the seconds actually go
Self-host your fonts. Google Fonts served from fonts.googleapis.com costs you a DNS lookup, a TLS handshake, and a connection to a third party on every cold load. Download the woff2 files and serve them yourself.
@font-face {
font-family: 'Inter';
src: url('/fonts/inter-variable.woff2') format('woff2-variations');
font-weight: 100 900;
font-display: swap;
unicode-range: U+0000-00FF, U+0131, U+0152-0153;
}
Use a variable font so you ship one file instead of four weights. The unicode-range keeps the browser from downloading the file for pages that only use Latin characters.
For images, serve AVIF with WebP fallback. WordPress generates WebP by default now, but AVIF is smaller. Always set width and height in the markup to kill layout shift, and use loading="lazy" on everything below the fold. Never lazy-load your LCP image; that makes LCP worse, not better.
<img
src="/uploads/hero-1600.avif"
srcset="/uploads/hero-800.avif 800w, /uploads/hero-1600.avif 1600w"
sizes="100vw"
width="1600" height="900"
fetchpriority="high"
alt="Team working in the Commack office">
That fetchpriority="high" on the hero is one of the highest-value single attributes you can add. It tells the browser to grab that image before it gets to the rest of the queue.
Don’t install five caching plugins
One caching layer. Pick one. A page cache plugin, plus server-level caching if your host offers it, plus a CDN is a stack. Adding WP Rocket on top of LiteSpeed Cache on top of a host’s built-in cache is how sites break and how debugging becomes impossible.
Also: minification and combining files is mostly obsolete. HTTP/2 and HTTP/3 multiplex requests, so combining CSS into one giant file can hurt more than help. Minify, don’t combine.
A realistic order of operations
- Upgrade PHP and confirm the host has server-level caching and HTTP/3.
- Put a CDN in front of the site.
- Audit plugins. Delete anything not actively used. Dequeue the rest per page.
- Self-host fonts, preload the primary one, set
font-display: swap. - Convert images to AVIF/WebP, set dimensions, add
fetchpriorityto the hero. - Only then look at a caching plugin, and only one.
If you do those six things, you’ll usually land in the green on Core Web Vitals on a mid-tier host. If you’re still slow after that, the problem is the theme or the builder, and no plugin fixes that.
FAQ
Do I need to switch to a static site to be fast?
No. A well-built WordPress site with server caching and a CDN can hit the same numbers as a static site for a typical business site. Static generators win on simplicity and security, not raw speed, once caching is in place.
Is a page builder always bad for performance?
Not always, but it almost always costs something. If you’re keeping one, disable its assets on pages that don’t use it and check the rendered HTML size against a hand-coded equivalent. The gap is usually obvious.
How often should I re-check Core Web Vitals?
After any theme change, plugin addition, or major content update, and otherwise once a quarter. Field data in Search Console updates slowly, so use your own real user monitoring if you want faster feedback.


