
WordPress Heartbeat is one of those features almost nobody chooses to turn on, yet it runs on practically every site quietly burning CPU cycles in the background. It is the API responsible for autosaving your posts, warning you when another user is editing the same content, and keeping the post-lock and login session alive while you work. Useful stuff. But the way it is implemented — a recurring browser-to-server poll — means it has a measurable cost that scales with how many people are logged in and how long they leave a tab open. On a busy WooCommerce store or a multi-author publication, that cost is not theoretical.
Heartbeat is a JavaScript timer (wp-includes/js/heartbeat.js) that fires an AJAX request to /wp-admin/admin-ajax.php with the action heartbeat. Every time it fires, WordPress bootstraps a near-full request: it loads wp-load.php, initializes the whole plugin and theme stack, runs the heartbeat hooks, and returns a JSON payload. The key detail is that admin-ajax.php is not cached. It cannot be — it is dynamic, authenticated, and unique per user. So every single tick is a full, uncached PHP execution that hits your database.
The default intervals are the part most people get wrong when they estimate the impact:
WordPress also slows the interval automatically when a tab loses focus — after about five minutes of inactivity it can back off to a 120-second interval. That mitigation helps, but it does not eliminate the cost, and it does nothing for active tabs.
Let's do the arithmetic instead of hand-waving. A single author with one post open for an 8-hour day, ticking every 15 seconds, generates roughly 1,900 uncached admin-ajax requests in that day. Each one is a full PHP bootstrap plus several database queries. Now put ten authors in your editorial team, each with a couple of tabs open, and you are looking at tens of thousands of uncached dynamic requests per day that produce zero visitor-facing value.
Where this bites hardest:
To be fair about the other side: on a low-traffic blog with one occasional author, the cost is negligible — fractions of a percent of CPU. Disabling Heartbeat there is premature optimization. The cost only becomes "real" with concurrency.
Don't guess. Open your hosting analytics or server access logs and grep for admin-ajax.php. On Kinsta and WP Engine the dashboard surfaces top requested URLs directly; on a VPS, run something like grep "admin-ajax.php" access.log | wc -l for a day and compare it to your total request count. If admin-ajax is in your top three requested URLs and you have more than a handful of logged-in users, Heartbeat is worth tuning. Query Monitor will also show you the cost of an individual heartbeat request — install it, open a post editor, and watch the queries and time per tick.
The wrong move is to nuke Heartbeat entirely with wp_deregister_script('heartbeat'). Do that and you lose autosave and the "another user is editing this post" lock — a genuine recipe for lost work and overwrites on a multi-author site. Tune it instead.
The free Heartbeat Control plugin lets you, per location, either disable, allow, or change the frequency of Heartbeat. The sensible configuration for most sites:
If you'd rather not add a plugin, change the interval with a filter. Raising it to 60 seconds in the editor cuts editor Heartbeat traffic by 75%:
add_filter( 'heartbeat_settings', function( $settings ) {
$settings['interval'] = 60; // seconds; valid range is 15–120
return $settings;
} );
To kill Heartbeat only on the front end while leaving the editor untouched:
add_action( 'init', function() {
if ( ! is_admin() ) {
wp_deregister_script( 'heartbeat' );
}
}, 1 );
Several caching and optimization plugins fold Heartbeat control into their UI, so you might not need a separate tool. WP Rocket has a dedicated Heartbeat tab (Reduce / Disable, per context). Perfmatters exposes the same interval controls. If you run either, configure it there rather than stacking plugins.
Here is the configuration I'd reach for on a typical content or commerce site with multiple logged-in users:
The goal is not to eliminate Heartbeat — it does real work that protects your editors from losing content. The goal is to stop paying for ticks you don't need: 15-second editor polling that could be 60, dashboard polling you never look at, and front-end polling that serves no purpose at all. Done right, you keep every feature that matters and shave a meaningful chunk of uncached PHP load off your busiest, most expensive request path.
Site
Tools
We do not sell your email. We do not spam.
© 2026 RevealTheme. All rights reserved.