Tutorial 2026-03-04 By Marcus Chen

How to Speed Up WordPress Without Plugins (8 Manual Techniques)

Plugins add convenience but also weight. Here are 8 hands-on techniques to make WordPress faster without installing a single optimization plugin.

Last year I inherited a client's WordPress site that loaded in 8.3 seconds. It had eleven optimization plugins installed, and somehow each one made things worse. After removing all of them and applying the manual techniques below, load time dropped to 1.9 seconds. Sometimes the best plugin is no plugin at all.

Every optimization plugin you install adds its own PHP execution time, database queries, and file includes. The irony is real: tools designed to speed up your site can slow it down when they conflict with each other or just add overhead that outweighs their benefits.

These eight techniques work at the server and code level. No plugin needed for any of them. Some require access to your hosting control panel or the ability to edit configuration files. If you've never touched wp-config.php or .htaccess before, don't worry. I'll walk through each one.

1. Choose a Lightweight Theme

Your theme is the single biggest factor in baseline site speed, and it's the one most people ignore when troubleshooting performance. A bloated theme with dozens of built-in features you don't use loads CSS and JavaScript for all of them on every page.

Block themes built on the Site Editor tend to be the lightest option because they don't carry legacy PHP template engines or bundled page builder code. The default Twenty Twenty-Five theme, for example, produces pages under 150 KB total weight with no caching.

If you're not sure whether your current theme is holding you back, run a Lighthouse performance audit on a fresh install with just your theme active and no content. If the score is below 85 with an empty site, the theme itself is the bottleneck.

Our guide to choosing the right theme includes a section on evaluating performance before you commit to a theme.

2. Enable Server-Level Caching

Server-level caching is dramatically more effective than PHP-based caching plugins. Instead of WordPress generating each page from scratch on every request, the server stores a static HTML copy and serves it directly. The difference is often 10x faster response times.

For Nginx servers, enable FastCGI cache by adding this to your server block configuration:

fastcgi_cache_path /tmp/nginx-cache levels=1:2
    keys_zone=WORDPRESS:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";

location ~ \.php$ {
    fastcgi_cache WORDPRESS;
    fastcgi_cache_valid 200 60m;
    fastcgi_cache_valid 404 1m;
}

For Apache servers, enable mod_expires in your .htaccess file:

<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/html "access plus 1 hour"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/webp "access plus 1 year"
</IfModule>

If you're on managed hosting (SiteGround, Kinsta, WP Engine), server-level caching is usually already enabled. Check your hosting dashboard to confirm.

3. Optimize Images Before Upload

This is the lowest-effort, highest-impact technique on the list. Most people upload images straight from their camera or stock photo site at 3000+ pixels wide and 2MB+. WordPress creates thumbnails but keeps the original at full size.

Before uploading any image, run it through a tool like Squoosh (free, runs in your browser) or TinyPNG. Resize to the maximum display width you actually need (usually 1200px for full-width images) and compress to WebP format.

A 2.4 MB JPEG that you resize to 1200px wide and convert to WebP typically comes out around 80-120 KB. Multiply that savings across 30 blog post images and you've just shaved megabytes off your site without touching any code.

4. Remove Unused Themes and Plugins

Every installed plugin, even deactivated ones, adds files to your server that WordPress scans during updates. Deactivated themes still have their functions.php and style.css checked by WordPress for update availability.

Go to Plugins > Installed Plugins and delete anything you're not actively using. Do the same in Appearance > Themes, keeping only your active theme and one default theme as a fallback. This won't produce dramatic speed gains, but it reduces the attack surface and simplifies your update process.

5. Disable WordPress Heartbeat API on Non-Admin Pages

The WordPress Heartbeat API sends AJAX requests every 15-60 seconds to handle auto-saves, login session management, and real-time notifications. On the admin side, this is useful. On the frontend, it's unnecessary overhead that fires background requests your visitors never benefit from.

Add this to your theme's functions.php file to disable Heartbeat on the frontend while keeping it active in the admin:

add_action('init', function() {
    if (!is_admin()) {
        wp_deregister_script('heartbeat');
    }
});

This eliminates repeated AJAX calls that can slow down the server, especially on shared hosting where resources are limited.

6. Limit Post Revisions in wp-config.php

WordPress saves a new revision every time you click "Save Draft" or "Update." A post edited 40 times has 40 revision entries in the database. Over months, this bloats the wp_posts table and slows down database queries.

Open wp-config.php and add this line above the "That's all, stop editing" comment:

define('WP_POST_REVISIONS', 3);

This keeps the three most recent revisions and prevents unlimited growth. You can also set it to false to disable revisions entirely, but keeping a few gives you a safety net for accidental changes.

To clean up existing revisions, run this SQL query in phpMyAdmin (back up your database first):

DELETE FROM wp_posts WHERE post_type = 'revision';

7. Use a CDN (Cloudflare Free Tier)

A Content Delivery Network caches your static files (images, CSS, JavaScript) on servers around the world. When a visitor from Tokyo loads your site hosted in New York, the CDN serves files from a server in Asia instead of making the request travel across the Pacific.

Cloudflare's free plan is good enough for most WordPress sites. Setup takes about 15 minutes: create an account, add your domain, update your nameservers, and Cloudflare starts caching automatically. No plugin required.

The performance improvement varies by audience location. Sites with global audiences see the biggest gains. For a blog I manage with 60% of traffic from Europe and hosting in the US, adding Cloudflare reduced average page load from 3.2 seconds to 1.4 seconds for European visitors.

8. Defer JavaScript Loading via functions.php

By default, WordPress loads scripts in the <head> section, which blocks page rendering until they finish downloading and executing. Deferring non-critical scripts tells the browser to load them after the HTML is parsed.

Add this to your functions.php:

add_filter('script_loader_tag', function($tag, $handle) {
    $defer_scripts = ['jquery-migrate', 'wp-embed', 'comment-reply'];
    if (in_array($handle, $defer_scripts)) {
        return str_replace(' src', ' defer src', $tag);
    }
    return $tag;
}, 10, 2);

Start with non-essential scripts and test after each addition. Some scripts depend on load order, so deferring aggressively can break functionality. Add handles to the $defer_scripts array one at a time and verify nothing breaks.

For a deeper look at WordPress speed optimization, including plugin-based approaches for situations where manual methods aren't practical, check our performance optimization guide. And if you're concerned about security alongside performance, our security best practices guide covers hardening techniques that complement speed work.

Want a Head Start on Speed?

Our themes are built lightweight from the ground up. No bloat, no unused assets, just clean code that scores 90+ on Lighthouse out of the box.

Browse Themes

Related Guides