How to Speed Up a WordPress Website Without Installing Too Many Plugins

Content Team |
How to Speed Up a WordPress Website Without Installing Too Many Plugins

You ran PageSpeed Insights and got a red score. The instinct is to install a speed plugin.

Before you do that, consider what a speed plugin actually fixes. Most handle caching, image compression, or script deferral. But if your hosting has a slow server response, if your images are large uncompressed files, if your theme loads unnecessary scripts on every page, a caching plugin will mask some of those problems without fixing them.

This guide covers the foundational layer: the things you control through configuration, choices, and basic upkeep. Most steps require no optimization plugin at all.

Before You Start

ItemNotes
BackupTake a full backup before editing wp-config.php, running database cleanup, or changing your PHP version.
StagingUse a staging copy if your host provides one, especially for theme or database changes.
Baseline scoreRecord your PageSpeed Insights score before making any changes so you can measure actual improvement.
Admin accessYou need WordPress admin access and hosting control panel access for several steps.
TimeAllow 1 to 3 hours depending on how many layers need attention.

Quick Fix Summary

  1. Measure baseline with PageSpeed Insights on your homepage and one key conversion page.
  2. Check server response time (TTFB). If it exceeds 800ms, hosting is the first problem to fix.
  3. Compress and convert images to WebP before uploading them.
  4. Check whether your host includes built-in page caching before installing a caching plugin.
  5. Audit what your theme loads on every page.
  6. Identify scripts loading on pages where they are not needed.
  7. Reduce or eliminate external font requests.
  8. Clean up post revisions, transients, and expired database entries.
  9. Measure again and compare results to baseline.

Step 1: Measure Your Baseline

Before changing anything, record where your site stands.

Go to PageSpeed Insights and test your homepage and one high-traffic page such as a product page, blog post, or booking page.

Write down:

  • Performance score (0 to 100)
  • LCP (Largest Contentful Paint): good under 2.5 seconds
  • INP (Interaction to Next Paint): good under 200 milliseconds
  • CLS (Cumulative Layout Shift): good under 0.1
  • TTFB (Time to First Byte): good under 800ms; excellent under 200ms

Also run the same URL through GTmetrix. Its waterfall chart shows which files take the longest to load and which external requests fire on each page load. This is useful before you start changing anything.

Run each test at least twice. Results can vary slightly. Use the average.

What each metric tells you:

MetricIf it is high, the likely cause is...
TTFBSlow server response. Fix starts with hosting, not a plugin.
LCPLarge or slow-loading hero image, or slow server response.
CLSImages without explicit dimensions, late-loading ads, or embeds.
INPHeavy JavaScript on the page.

Step 2: Fix Hosting First

Hosting is foundational. Optimization on top of a slow server helps, but it starts from a worse position.

Signs your hosting plan is the bottleneck:

  • TTFB is above 800ms even when the page is cached.
  • The WordPress admin dashboard is slow even with few active plugins.
  • The site slows noticeably under moderate traffic.

What to check in your hosting control panel:

PHP version. WordPress recommends PHP 8.1 or higher. Check under "PHP Manager" or "Software" in cPanel or your host's dashboard. Upgrading from PHP 7.x to 8.1 can reduce server response time. Change the version, then immediately check the site frontend and admin area for errors. If anything breaks, a theme or plugin is incompatible with the newer PHP version. Revert until the conflict is resolved.

Server-level caching. Managed WordPress hosts include built-in page caching at the server level. This is faster than any WordPress caching plugin can achieve because it serves cached HTML without running PHP or hitting the database. (More on this in Step 4.)

Resource limits. Entry-level shared hosting plans share CPU and memory across many sites. If your site has consistent real traffic and you are on a basic shared plan, the limiting factor may be the plan itself rather than any specific configuration.

Step 3: Compress and Optimize Images

Images are the most common cause of a high LCP score. A single uncompressed JPEG at 3 to 4MB can hurt an otherwise clean page.

Before uploading:

  • Resize to the actual display size. A 4000px photo displayed at 1200px wastes bandwidth.
  • Compress with a lossless or light lossy tool. Squoosh is free and runs in the browser. TinyPNG is another common option. JPEG at 80% quality is sufficient for most web use.
  • Convert to WebP. WebP files are roughly 25 to 35 percent smaller than equivalent JPEG or PNG at the same visual quality. WordPress has supported WebP uploads since version 5.8 (July 2021).

After uploading:

  • WordPress 5.5 added native lazy loading. Images below the first visible screen get loading="lazy" applied automatically. No plugin needed.
  • Add explicit width and height attributes on images to prevent CLS. When you upload an image through the WordPress Media Library, WordPress sets these automatically.
  • For your hero or featured image (the first large visible element): keep file size under 200KB at 1200px width where possible.

For existing uploaded images:

If you have a large library of old unoptimized images, this is the case where a conversion plugin earns its place. It is a one-time or periodic job, not a permanent load. Once images are converted, you can deactivate the plugin.

Step 4: Use Hosting-Level Caching or CDN

Page caching stores a static HTML version of each page and serves it without running PHP and database queries for every visitor request.

Check your host before installing a caching plugin:

HostBuilt-in caching
KinstaYes (full-page caching via Nginx and Redis)
WP EngineYes (EverCache)
SiteGround GrowBig and aboveYes (SuperCacher, FastCGI)
CloudwaysYes (Varnish and Redis, depending on stack)
Generic shared hostingRarely
Self-managed VPSNo; you configure it yourself

If your host provides caching, enable it in the control panel. Do not install a WordPress caching plugin on top of it. Two caching layers working at the same time cause stale content and hard-to-diagnose problems.

If your host does not provide caching:

Add Cloudflare's free plan. It acts as a CDN and caches static assets globally. You can also configure Cloudflare page rules or caching rules to cache HTML for a set period. This reduces origin server load without adding a WordPress plugin.

If Cloudflare is not an option, one focused caching plugin is the right tool. The guide to free WordPress speed optimization plugins covers the most reliable options if you need one.

Step 5: Audit Your Theme

A theme loads on every page of your site. A heavy theme adds load to every URL at once.

Signs of a bloated theme:

  • Three or more separate stylesheets load on a basic page.
  • An icon font library (Font Awesome, Flaticons, Dashicons) loads site-wide even on pages with no icons.
  • Google Fonts are loaded via remote request on every page.
  • The theme requires a proprietary page builder framework.

How to check:

Open a plain page such as a blog post in GTmetrix. Look at the number of CSS and JavaScript files loading. If you see six or more stylesheets and eight or more JavaScript files on a simple page, the theme is contributing significant overhead.

Lightweight alternatives:

Block themes built on WordPress full-site editing generate CSS scoped to the blocks used on each page instead of loading all theme styles globally. Themes like Kadence, GeneratePress, and Astra in their base configurations add minimal CSS and JavaScript overhead.

If switching themes is not an option now:

Check your current theme's settings panel for:

  • "Disable Google Fonts" toggle
  • "Disable icon fonts" option
  • Asset loading controls per page type

Some premium themes include these. If yours does not, it is a candidate for future replacement.

Step 6: Control Where Scripts Load

Many plugins load their CSS and JavaScript on every page of your site, even on pages where the plugin is not active.

A contact form plugin loading on your blog archive serves no purpose. A slider plugin loading its library on a page with no slider wastes bandwidth and adds render time.

How to check:

  1. Open a page where the plugin is not in use (a standard blog post, for example).
  2. Right-click and choose View Page Source.
  3. Search for and .
  4. Check whether assets from plugins you use only in specific places are loading here.

You can also see this in the GTmetrix waterfall on a simple page. Look for JS or CSS files from plugins that have no role on that page type.

What you can do:

  • Check plugin settings for an option like "load assets only where used" or "disable on pages where plugin is inactive." Many well-maintained plugins include this.
  • If no such setting exists, a developer can conditionally prevent loading with wp_dequeue_script() and wp_dequeue_style() in functions.php.
  • If a plugin has no way to control where it loads and adds heavy assets site-wide, that is a strong signal to look for a leaner replacement.

Plugins worth auditing first: slider plugins, contact form plugins, social sharing plugins, chat widget plugins, popup plugins. These most commonly load assets on every page by default.

Step 7: Reduce External Font Requests

Every Google Fonts declaration adds a DNS lookup, a connection request, and a font file download before your text can render. On a clean page, this can add 100 to 300ms to first visible text.

Option 1: Host fonts locally

Download your Google Font files from google-webfonts-helper. This tool packages the font files with the correct CSS declarations for self-hosting. Upload the files to your server and reference them in your stylesheet instead of loading from Google's servers.

Some themes include a "local fonts" toggle that does this for you automatically. Check your theme customizer or typography settings.

Option 2: Use a system font stack

System fonts are already installed on the visitor's device. No download, no external request, no latency. They load instantly. A modern system font stack:

font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;

This is the fastest option and produces clean readable results across all modern operating systems.

Option 3: Add font-display: swap

If you continue loading external fonts, add font-display: swap to your font-face declarations. This tells the browser to show system text immediately and swap in the web font when it finishes loading. It prevents invisible text during the font download.

Many themes expose this as a setting in the customizer. Check your typography panel.

Step 8: Clean Up the Database

A bloated database adds to server response time. Every page load runs database queries. Unnecessary rows increase the work involved.

Take a database backup before running any cleanup.

Post revisions:

Every time you save or update a post, WordPress stores a revision. A post edited frequently over several months can accumulate hundreds of revisions. Most sites do not need unlimited revision history.

To limit future revisions, add this line to wp-config.php above the line that reads /* That's all, stop editing! */:

define('WP_POST_REVISIONS', 3);

This limits each post to 3 saved revisions going forward. Existing revisions stay in the database until cleaned separately.

To remove existing revisions, you can use WP-CLI if your host provides it:

wp post delete $(wp post list --post_type=revision --posts_per_page=500 --format=ids) --force

Run this in small batches on large sites. Test on staging first.

Expired transients:

Plugins store temporary data in the database using WordPress transients. After plugins are removed or updated, expired transients can accumulate in the wp_options table.

Clean expired transients safely with WP-CLI:

wp transient delete --expired

Spam, trash, and auto-drafts:

Remove from the WordPress admin area:

  • Comments > Spam > Empty Spam
  • Comments > Trash > Empty Trash
  • Posts > Trash > Empty Trash
  • Pages > Trash > Empty Trash

Auto-draft posts accumulate if you started drafts and abandoned them. Remove them from the All Posts or All Pages list filtered by "Draft" status.

Autoloaded options:

Data stored in wp_options with autoload=yes is loaded on every single page request. Plugins sometimes leave large autoloaded records behind after deactivation.

Check the total size of your autoloaded options with this SQL query in phpMyAdmin or your host's database tool:

SELECT SUM(LENGTH(option_value)) AS total_bytes
FROM wp_options
WHERE autoload = 'yes';

If the result is above 1MB, investigate which option names contribute the most. A developer can identify and remove abandoned plugin records safely.

Step 9: Measure Again

After completing the steps that apply to your site, run PageSpeed Insights again on the same pages you tested in Step 1.

Compare:

  • Performance score before and after
  • LCP before and after
  • TTFB before and after
  • CLS before and after

Also run GTmetrix again. Compare the number of requests, total page weight, and which scripts still appear in the waterfall.

A clean set of changes (compressed images, host-level caching enabled, one fewer remote font request) can produce a 10 to 30 point score improvement without adding any optimization plugin.

If This Does Not Work

TTFB is still slow after addressing hosting. If you are on shared hosting and cannot move to a managed plan, full-page caching (via Cloudflare or a caching plugin) reduces the number of PHP and database executions per request. This is the most practical option until a hosting upgrade is possible.

LCP element is a CSS background image, not an HTML img tag. CSS background images cannot receive loading="lazy" or standard lazy loading treatment. A developer can add fetchpriority="high" to the correct element, or restructure the hero section to use an HTML img tag with the correct priority hint.

CLS is high and does not respond to image fixes. Check: late-loading ads or embeds that do not reserve layout space, web fonts swapping in visibly after text appears, and elements that shift when JavaScript loads. Each has a specific targeted fix.

All these steps are done and the score is still under 70. The remaining problem is likely a specific slow plugin. Use the guide to finding which plugin is slowing down your site to isolate it systematically.

Common Mistakes to Avoid

  • Installing multiple caching or optimization plugins. Two caching layers often create stale content and make debugging harder, not faster. Choose one layer: host-level caching or a plugin, not both.
  • Optimizing without a baseline. Without a before score, you cannot confirm whether a change helped or hurt. Always record before and after.
  • Treating the PageSpeed score as the only metric. The score is a lab simulation. The "Field Data" section of the same PageSpeed report shows real visitor experience from the Chrome UX Report. Both matter.
  • Loading Google Fonts without font-display: swap. Text is invisible until the font loads. This hurts user experience and FCP.
  • Skipping the revision limit. The wp-config.php setting only limits future revisions. Without it, the count grows indefinitely with every post edit.
  • Running database cleanup without a backup. Cleanup queries are irreversible. Always back up first.
  • Removing a plugin without checking what data it stores. Plugins that handle forms, bookings, or orders store business data. Review what is in the database before a full removal.

When to Ask for Help

Stop and contact a developer or your host's support team when:

  • TTFB stays above 2 seconds after moving to a managed hosting plan.
  • Updating the PHP version causes white screens or errors you cannot trace to a specific plugin.
  • The database autoloaded data is above 3MB and you cannot identify what is causing it.
  • The LCP element is inside a complex page builder template and cannot be addressed without code changes.
  • Your site handles live transactions (bookings, payments, subscriptions) and requires zero downtime during testing or changes.

For performance issues that survive these steps, server-level tools such as New Relic or your hosting provider's APM dashboard can identify bottlenecks invisible at the WordPress admin layer.

Final Checklist

  • Baseline PageSpeed score recorded (LCP, INP, CLS, TTFB all noted)
  • PHP version checked and updated to 8.1 or higher if needed
  • Images compressed and converted to WebP before upload
  • Hero or featured image under 200KB at intended display size
  • Explicit width and height on all images in the editor
  • Host-level caching confirmed or Cloudflare added (or one caching plugin if neither is available)
  • Theme audited for unnecessary stylesheets, icon fonts, and remote font requests
  • Plugin assets scoped to pages where plugins are actually active
  • Google Fonts replaced with locally hosted fonts or a system font stack
  • Post revision limit set in wp-config.php
  • Expired transients, spam, and trash emptied
  • Autoloaded options size checked; any large abandoned records identified
  • Final PageSpeed score recorded and compared to baseline

For ongoing performance upkeep, database cleanup and speed checks belong in your regular maintenance routine. The WordPress website maintenance checklist covers these as recurring tasks alongside backups, updates, and security checks.

If the score still lags after all these steps and you suspect plugin stack overlap is part of the problem, the WordPress plugin stack audit guide helps you evaluate load, overlap, and maintenance risk across your active plugins.