Core Web Vitals aren't a mystery box—they're three measurable signals Google uses to judge real-world page experience: LCP (loading), INP (responsiveness), and CLS (visual stability). On WordPress, bad scores usually come from a stack of small sins, not one villain plugin.
LCP: get the main content visible fast
Largest Contentful Paint tracks when the biggest above-the-fold element renders—often a hero image, featured image, or large heading block.
- Serve images in modern formats with explicit width/height
- Preload the LCP image:
<link rel="preload" as="image" href="..."> - Reduce TTFB: better hosting beats micro-optimizations
- Strip render-blocking CSS/JS from critical templates
Page builders and slider plugins are frequent LCP killers. Test the homepage with WebPageTest before blaming the theme.
INP: interactions should feel instant
Interaction to Next Paint replaced FID. It measures delay across clicks, taps, and keyboard input during the whole visit—not just the first interaction.
Fix INP by:
- Breaking long JavaScript tasks (defer analytics, chat widgets)
- Limiting third-party scripts (ads, heatmaps, social pixels)
- Using native lazy loading instead of heavy JS libraries where possible
- Updating plugins known for main-thread blocking
CLS: stop the layout jump
Cumulative Layout Shift spikes when ads, fonts, or images load without reserved space.
- Always set dimensions on images and embeds
- Reserve ad slot height in CSS
- Use
font-display: swapwith matched fallback metrics - Avoid injecting banners above existing content after load
WordPress-specific workflow I use
- Baseline in PageSpeed Insights and Chrome UX Report (field data if available)
- Disable plugins in staging groups of five—measure each batch
- Enable object caching (Redis) on traffic sites
- Configure CDN cache rules for static assets
- Audit database autoloaded options—yes, they affect TTFB
Caching plugins: pick one strategy
Stacking WP Rocket, Cloudflare APO, and host caching without understanding purge rules creates stale content and hard-to-debug INP regressions. Document what caches HTML, what caches objects, and what bypasses cache for logged-in users.
Measuring after AdSense
Ad scripts affect CLS and INP. Load ads below the fold first, use fixed-size containers, and test with ads enabled—not on a clean staging site with ads disabled. AdSense approval requires decent UX; approved sites can still fail CWV if ad density is aggressive.
Realistic targets for 2026
Aim for green field scores on mobile for templates you control (single post, homepage). Archive pages with 20 thumbnails may sit in "needs improvement" unless you paginate aggressively. Ship improvements incrementally and track CrUX monthly—not just lab scores after each tweak.
Database and autoload bloat
Run a query on wp_options where autoload='yes'. Plugins that store megabytes autoloaded crush TTFB. Clean transients with reputable tools—avoid random "speed booster" plugins that delete data unpredictably.
Image pipelines in WordPress
WordPress generates multiple sizes on upload. Themes that call 'full' everywhere waste bytes. Audit which size handles featured images in your theme files or block patterns. Consider WebP delivery plugins only after baseline measurement—they add complexity.
Font strategy
Self-host Google Fonts or use system stacks for body text. Each font weight is a render-blocking request. Limit to two weights of one family for UI-heavy headers.
Third-party script audit template
List every external script: analytics, ads, chat, heatmaps, social pixels. Remove one per week and measure INP. Teams that keep scripts "because marketing might need them" usually find half unused.
When to hire help
If field CrUX stays red after hosting upgrade and plugin diet, a performance audit beats installing another cache plugin. Document fixes so AdSense reviewers see a maintained site, not a plugin graveyard.