The causes of a slow WordPress site turn up in a fairly fixed order. Here they are, most impact and least effort first. Doing just the top three makes a clearly noticeable difference.
One ground rule—measure under the same conditions before and after each change. Record where you are now with Google’s free tool (PageSpeed Insights) or Lighthouse in your browser’s developer tools, then start.
1. Fix your images (impact: high / effort: low)
The number one cause of a heavy page is images that are too large.
- Scale to the display size—a photo shown at 1200px wide doesn’t need a 4000px original
- Compress before uploading—you can halve the file size or better while keeping it looking the same
- Choose the format—WebP for photos, SVG or PNG for diagrams and logos
- Specify featured image sizes—use
mediumrather thanfullin archives
On the theme side, just specifying the size loaded in archives makes a difference.
<?php the_post_thumbnail('medium'); ?> <!-- medium, not full -->WordPress adds srcset and lazy loading (loading="lazy") for you, so as long as you output through the functions, no difficult configuration is needed.
2. Clean up your plugins (impact: high / effort: low)
Delete plugins you aren’t using (delete, not deactivate). Here’s what to look for.
- Are two doing the same job?—install two SEO or two caching plugins and they interfere
- Is it installed for a single feature?—often a few lines of code can replace it
- Has it stopped being updated?—that’s a risk on both the slowness and the safety side
The most reliable way to find “which plugin is slow” is to deactivate them one at a time and measure.
3. Check your host and PHP version (impact: high / effort: medium)
- The PHP version—an old one is distinctly slower. Raise it to the latest stable release from your host’s control panel (back up first)
- Server performance—on a cheap shared plan, concurrent traffic means waiting
Raising PHP can break themes and plugins, so take a backup, verify on a test environment, and only then apply it to production. If your host itself is the bottleneck, moving to a faster plan or provider is worth considering.
4. Put caching to work (impact: high / effort: medium)
Caching is the mechanism of “save the HTML you built once, and serve that on the next request.” Because WordPress runs PHP and hits the database on every view, caching pays off enormously.
- Install exactly one caching plugin (several will interfere)
- If your host has a caching feature, use that first
- A CDN delivers images and other assets from somewhere closer to the visitor
5. Load fewer fonts (impact: medium / effort: low)
Each web font typeface adds another download.
- Limit how many typefaces you use (don’t get greedy with three or four)
- Only the weights you need—400 and 700 are often enough
- Since some font files are large, the compromise of system fonts for body text and a web font for headings only works well
6. Code-level wins in your theme (impact: medium / effort: medium)
If you can touch a theme of your own or a child theme, there’s more to do in code.
Load CSS and JS only on the pages that need them
function my_assets() {
wp_enqueue_style('main', get_theme_file_uri('style.css'), [], '1.0.0');
if (is_front_page()) {
wp_enqueue_script('slider', get_theme_file_uri('js/slider.js'), [], '1.0.0', true);
}
}
add_action('wp_enqueue_scripts', 'my_assets');Putting JS in the footer (true as the fifth argument) is standard too.
Lighten your list queries
// ❌ fetching everything gets heavy as posts pile up
new WP_Query(['posts_per_page' => -1]);
// ✅ set a count, and skip the total calculation when you don't need pagination
new WP_Query(['posts_per_page' => 12, 'no_found_rows' => true]);Heavy use of meta_query is slow, so making your filtering axes taxonomies speeds things up.
Stop unnecessary output
remove_action('wp_head', 'wp_generator'); // the version string
remove_action('wp_head', 'wp_shortlink_wp_head'); // the short URL
remove_action('wp_head', 'rsd_link'); // a tag for an external integration you don't useIndividually these are small, but a lighter head makes loading easier to reason about. Stopping the emoji script (print_emoji_detection_script) is another common move.
7. Tidy the database (impact: low to medium / effort: low)
- Revisions can pile up dozens deep per post
- Empty spam comments and the trash
You can limit how many revisions are kept.
define('WP_POST_REVISIONS', 5);Things not to do
- Installing several caching plugins—they interfere and become a source of bugs
- Minifying HTML and CSS first—the gain is small and the risk of breakage is larger
- Chasing a score of 100—“does it open fast on a phone?” matters more than the number
Summary
- Scaling down and compressing images helps most. Never place an image larger than it’s displayed
- Delete unnecessary plugins, and check your PHP version and host
- Caching has big impact but side effects. Introduce exactly one, after the cleanup
- In code, per-page loading, count limits and stopping unnecessary output all help
Stick to “measure, then one change at a time” and you’ll reach a fast site without detours.