WordPress

How to Get Your WordPress Site to Score 90+ on PageSpeed Without a Rebuild

Muhammad Sharjeel

Muhammad Sharjeel

WordPress Developer

March 24, 2026
11 min read

Google PageSpeed Insights scores of 40-60 on mobile are not a developer vanity problem. They represent measurable, calculable conversion losses on every page load. A 1-second improvement in load time produces approximately 7% more conversions from the same traffic. Most WordPress sites have two to four seconds of recoverable load time sitting in five fixable configuration decisions - none of which require changing a word of content, modifying the design, or rebuilding anything the client would recognize as 'the website'.

7%

Conversion increase per 1-second improvement

95+

PageSpeed score we require before delivering any WordPress build

4x

Speed advantage of custom block themes over page builder builds

Google PageSpeed Insights · Mobile · Before vs. After
41Poor

Before

FCP

3.8s

LCP

7.2s

CLS

0.22

Load time

4.2s

95Good

After

FCP

0.9s

LCP

1.2s

CLS

0.01

Load time

0.8s

Fixes Applied (No Rebuild)

Images → WebP WP Rocket caching Scripts deferred Elementor removed DB optimized

Fix 1: Image Optimization - The Largest Single Source of Recoverable Load Time

Images are responsible for the majority of unnecessary payload on most WordPress sites. A hero image served as a 3MB JPEG when WebP at equivalent visual quality weighs 380KB represents 2.6MB of download waste on every page visit. On a site with 20 pages each with a hero and three body images, unoptimized image payload adds tens of megabytes per session. On mobile 4G connections averaging 10-20Mbps downlink, this is the direct difference between a 2-second and an 8-second load.

WebP and AVIF Conversion and Serving With Format Fallback

WordPress 5.8 supports WebP natively. AVIF support is available via ShortPixel and Imagify on supported hosting. ShortPixel, Imagify, or Smush handle bulk conversion of existing JPEGs and PNGs to WebP (with AVIF where supported), and serve the optimal format to supporting browsers with JPEG fallback for legacy environments. Typical image payload reduction: 60-80% compared to equivalent JPEG quality. This is consistently the single largest load time improvement available on any WordPress site without infrastructure changes.

LCP Images: The fetchpriority Attribute Most Developers Miss

WordPress added native lazy loading (loading='lazy') from version 5.5 and applies it to all images by default, including the hero image. The hero is almost always the LCP element - the largest above-the-fold render target. Lazy loading it adds 300-600ms to LCP. The correct configuration: add fetchpriority='high' and remove loading='lazy' from the first image in every page template. This single change moves LCP from 'Needs Improvement' to 'Good' on most sites where images are otherwise optimized.

Image Dimensions: Preventing CLS With width and height Attributes

Every img element without explicit width and height causes layout reflow when the image loads - the browser cannot reserve space until the image arrives. This is the primary cause of CLS scores above 0.1 on image-heavy WordPress pages. WordPress's wp_get_attachment_image() and the_post_thumbnail() include dimensions automatically when image sizes are registered in the theme. Themes that insert images via arbitrary HTML without these attributes need them added to prevent CLS.

Takeaway

Install Query Monitor (free) and run it on your homepage. In the Assets tab, filter for images larger than 200KB. Convert the three largest to WebP and add fetchpriority='high' to your hero. This alone typically moves mobile LCP from 4-7 seconds to under 2.5 seconds.

Fix 2: Page Builder Architecture - The Decision That Determines Everything Else

Elementor, Divi, and WPBakery are collectively the largest sources of preventable WordPress performance problems. Each stores layouts as serialized database entries parsed on every request, outputs hundreds of inline CSS rules across div-wrapped div-wrapped sections, enqueues icon fonts and animation libraries sitewide, and adds multiple render-blocking scripts. We have rebuilt Elementor pages in native blocks and measured 30-50 Lighthouse point improvements on mobile - at identical visual output.

The Custom Block Theme Architecture Built for Performance

The performance-first WordPress architecture: custom block theme (no parent theme dependency) with Advanced Custom Fields for data management, Gutenberg blocks for templates, and a compiled CSS stylesheet with no inline styles. The HTML output is clean, semantic, and free of wrapper divs. JavaScript is scoped to components that need it. The result is a site that renders like a hand-coded static page while maintaining the block editor interface content managers require.

Partial Recovery Without a Full Rebuild

For sites where a page builder migration is not immediately feasible: disable Elementor's global CSS on pages where it is unused, restrict plugin assets to pages where they are required using Asset Manager in Elementor Pro or Perfmatters, and convert static header and footer sections to native blocks. If you are on Elementor, switch to Flexbox Containers instead of the older Inner Section widget - they produce cleaner, lighter HTML with fewer wrapper divs and measurably less CSS output. This approach typically recovers 10-20 Lighthouse points without any design or content changes.

Fix 3: Caching - Full-Page and Object Caching Configured Correctly

Performance Checklist — 8 Steps, No Rebuild Required
01

Install WP Rocket or LiteSpeed Cache

High

Handles page caching, CSS/JS minification and lazy load in one plugin.

02

Convert all images to WebP

High

25–35% smaller than JPEG/PNG at the same quality. Use Imagify or ShortPixel.

03

Remove Elementor (if present)

High

Elementor loads 700 KB+ of JS/CSS on every page. Switch to Kadence or GeneratePress.

04

Add width/height to all images

Med

Prevents layout shift (CLS). Set in the media library or hardcode in your theme.

05

Host Google Fonts locally

Med

Eliminates render-blocking external DNS lookup. Use the Local Google Fonts plugin.

06

Defer non-critical JavaScript

Med

WP Rocket does this automatically. Otherwise add defer to script tags manually.

07

Enable a CDN

Low

Cloudflare free tier serves static assets from edge nodes near your visitor.

08

Optimize your database monthly

Low

Delete post revisions, spam comments and transients. Use WP-Optimize plugin.

An uncached WordPress page generates a database query, runs PHP template processing, executes all active plugin hooks, and buffers the output before sending a single byte to the browser. The TTFB of an uncached WordPress page on a shared hosting environment is typically 800ms to 2 seconds. A correctly cached page serves pre-generated HTML from server memory, producing a TTFB of 50-150ms. This is often the single largest improvement available on a site that has never had caching configured.

Full-Page Cache vs Object Cache: Which You Need and When

Full-page caching (WP Rocket, W3 Total Cache, LiteSpeed Cache) serves complete pre-rendered HTML without PHP or database invocation - correct for most business sites with no user-specific dynamic content. Object caching (Redis with WP Redis Plugin) stores expensive database query results in memory - correct for WooCommerce stores, membership sites, and any site with significant logged-in user activity where full-page cache cannot be served. For most business WordPress sites, full-page caching is the correct first implementation and is available with any hosting provider.

CDN for Static Asset Delivery

A CDN serves CSS, JavaScript, images, and fonts from servers geographically close to each visitor. Cloudflare's free tier handles CDN, SSL, and basic performance optimization without infrastructure complexity. Cloudflare Images adds dynamic WebP and AVIF serving with on-the-fly resizing at CDN level - removing server-side image processing overhead and improving cache hit rates across format variants. For image-heavy sites, this is worth the marginal cost over the free tier.

Takeaway

Configure WP Rocket or LiteSpeed Cache (matching your server environment) before making any other performance changes. Run PageSpeed Insights before and after. Caching typically moves mobile Lighthouse scores 15-25 points in isolation. All other fixes layer on top of this baseline.

Fix 4: Database Cleanup - The Hidden Performance Tax on Mature Sites

WordPress databases on sites more than two years old accumulate substantial bloat: unlimited post revisions saved on every draft save, expired transient API data never cleaned, orphaned post metadata from deleted plugins, and spam comment accumulation in the comments table. On a mature, actively edited site, this can produce millions of extra rows in wp_postmeta and wp_options. Database queries against bloated tables take longer - a penalty not eliminated by page caching for admin users, WooCommerce checkout pages, or any request bypassing the full-page cache.

The Cleanup Process and Maintenance Cadence

Post revisions: define('WP_POST_REVISIONS', 5) in wp-config.php limits revisions to five per post. Transients: wp transient delete --expired --allow-root via WP-CLI removes expired entries immediately. Orphaned metadata: Query Monitor's database tab identifies tables with unexpected row counts. Spam and trash: empty comment spam queue and post trash monthly. Run OPTIMIZE TABLE on wp_postmeta, wp_options, and wp_posts quarterly using phpMyAdmin or WP-CLI - on bloated tables this reclaims space and reduces query execution time measurably.

Query Monitor for Plugin Database Load Identification

Query Monitor logs every database query on each page load, showing query time, origin, and duplicate queries. A single poorly-written plugin generating 40+ database queries per page load - a pattern we find in most WordPress audits - can add 200-500ms to uncached page generation time. Identifying it with Query Monitor and replacing it with a more efficient alternative or a custom solution produces a performance improvement that no amount of caching or image optimization can compensate for.

Fix 5: Render-Blocking Script and CSS Elimination

Every CSS and JavaScript file in the page head that is not required for the initial render is a render-blocking resource. The browser cannot display the page until all render-blocking resources complete downloading and processing. A typical WordPress site with 10 or more active plugins, each enqueuing their own CSS and JS files sitewide, can accumulate 500-1000ms of render-blocking overhead on mobile - completely independent of server performance or caching configuration.

Fixing INP: The Most Overlooked Core Web Vital on WordPress

Interaction to Next Paint (INP) measures how quickly the page responds after a user interaction - a click, a tap, a key press. On WordPress sites with heavy JavaScript from plugins, INP scores above 200ms are common and directly affect rankings. The fix: use 'Delay JavaScript Execution' in WP Rocket or FlyingPress to defer non-essential scripts until after the first user interaction. This prevents third-party scripts from blocking the main thread during the period users are most likely to click. Run CrUX field data in PageSpeed Insights - not just the lab data - to confirm whether INP is a live issue on your site.

Per-Page Asset Loading With Perfmatters Script Manager

Perfmatters Script Manager provides a UI for enabling and disabling specific CSS and JavaScript files per page or post type. A contact form plugin's JS loading on pages without a form is pure overhead. A WooCommerce cart script loading on blog posts adds 50-80ms of unnecessary processing. Configuring plugin assets to load only where needed eliminates their overhead sitewide without affecting functionality on pages where they are required. For a site with 12 plugins each adding 40-80ms sitewide, this change recovers 400-900ms.

Critical CSS and Deferred Non-Critical Stylesheet Loading

Critical CSS is the minimum subset of your stylesheet required to render above-the-fold content correctly to the first paint. Inlining critical CSS in the page head and loading the full stylesheet asynchronously eliminates render-blocking CSS delay. WP Rocket and Autoptimize both include critical CSS generation. The correct outcome: First Contentful Paint occurs before the full stylesheet loads, typically improving FCP by 300-600ms on pages with large theme stylesheets.

Self-Hosting Web Fonts to Eliminate Third-Party DNS Delays

Google Fonts and Adobe Fonts introduce a third-party DNS resolution and download step before text renders. On cold connections, this adds 150-400ms. Self-hosting web fonts (download from google-webfonts-helper.io, serve with Cache-Control: max-age=31536000) eliminates this entirely. Add font-display: swap to prevent invisible text (FOIT) during font loading. This is a 30-minute implementation that eliminates a persistent, reproducible latency penalty on every page load across every device.

Stat

Across 32 WordPress performance projects between 2023 and 2025, applying all five fixes in sequence has consistently moved sites from 42-62 Lighthouse mobile to 91-97. Median improvement: 53 points. Median implementation time for a developer following this process: 14 hours.

WordPress performance optimization and PageSpeed score improvement

A 90+ Lighthouse score is achievable on any WordPress site. These five configuration decisions consistently get you there without touching a line of design code.

Unsplash

WP RocketCaching + Performance

Full-page cache, file minification, lazy loading management, critical CSS, and CDN integration. The most complete WordPress performance plugin available.

ShortPixel / ImagifyImage Optimization

Bulk converts existing JPEG/PNG to WebP format and serves next-gen formats with fallbacks. Reduces image payload by 60-80%.

PerfmattersScript Management

Per-page plugin asset loading controls. Disable specific CSS and JS files on pages where they are not needed without affecting functionality elsewhere.

Query MonitorDatabase Diagnostics

Free plugin that logs every database query per page load. Identifies slow queries, duplicate queries, and high-query-count plugins that degrade TTFB.

Performance Is a Design-Phase Decision, Not a Post-Launch Fix

Key Insight

Setting a 90+ Lighthouse score as a contractual delivery requirement, not a target, is the single process change that eliminates post-launch performance remediation.

Clients who include a minimum Lighthouse score in their web design contracts save the cost of post-launch performance work every time. When performance is a delivery criterion rather than a post-launch suggestion, it gets designed in from the first technical decision - not bolted on afterward.

Most WordPress redesign briefs specify visual output, content requirements, and functional specifications. Almost none specify a minimum Lighthouse score as a delivery acceptance criterion. The result is predictable: sites that look correct and perform poorly, requiring post-launch remediation work that costs more than designing for performance from the start. Setting 90+ Lighthouse on mobile as a delivery requirement - not a target - in every web design contract is the process change that prevents this. The five fixes covered here are always achievable within that standard, on any platform, for any WordPress site where performance is treated as a design requirement rather than an afterthought.

Want these strategies applied to your business?

Our specialists run a free $497 digital marketing audit that covers your SEO, ads, and website. You get a prioritized action plan, not a sales deck.

Get My Free Audit