WordPress Cron Jobs: Why Scheduled Tasks Stop Running on Time

Fix late scheduled posts, emails, and updates by replacing visit-triggered WP-Cron with reliable server timing.

WordPress cron jobs are scheduled background tasks such as publishing scheduled posts, checking updates, and sending emails. They stop running on time because WordPress Cron, or WP-Cron, does not run continuously and fires only when a page visit triggers it. That design works well on busy sites but causes delays on low-traffic, cached, or error-prone sites. A scheduled post may publish minutes or hours late, or not at all, until the next visit wakes the scheduler.

Table of Contents

How WordPress Cron Really Works

WP-Cron is a scheduler that pretends to be a system cron. A true server cron runs at fixed times set by the host. WP-Cron instead checks its task list whenever WordPress loads a page. When a visit occurs, WordPress looks for overdue tasks and runs them in the background.

No visit means no check. High traffic means frequent checks. This visit-based model keeps WordPress portable across shared hosts. It also means timing is approximate rather than exact.

Why Scheduled Tasks Miss Their Timing

Low traffic is the most common cause. A small business site may have no visits overnight, so a task due at 3 a.m. waits until morning visitors arrive. Caching, maintenance mode, and server errors can also block triggers.

A cached page may serve without loading WordPress fully. A fatal error in a plugin or theme may stop the scheduler during its check. Long or stuck tasks create another problem. A backup, import, or feed fetch that times out can block later tasks. Too many low-value schedules from plugins can crowd the queue and slow normal tasks.

How to Tell Cron Is the Problem

Suspect WP-Cron when scheduled posts publish late, scheduled emails arrive in bursts, or backup and feed plugins report missed runs. The pattern is often irregular delay rather than total failure. Site owners can narrow it down with a few checks: If tasks succeed after a manual visit but fail overnight, visit-triggered scheduling is usually the cause.

  • Confirm the site had visits near the missed time, especially for low-traffic sites
  • Look for caching rules, firewall blocks, or maintenance mode that prevent WordPress from loading
  • Check plugin and server logs for fatal errors, timeouts, or failed HTTP requests around the scheduled time
  • Review active plugin schedules and remove duplicate or unnecessary recurring tasks

Should You Switch to Real Server Cron?

Many hosts let you run WP-Cron on a true schedule. The usual method is to disable page-load triggering and add a server cron job that calls the WordPress scheduler every five to fifteen minutes. This gives low-traffic sites regular checks without waiting for visitors.

It also spreads load more evenly and makes timing more predictable. Managed hosts often provide this as a one-click setting or support request. Server cron does not fix broken tasks. A task that fails from bad code, wrong time zones, blocked outbound requests, or expired logins will still fail on a perfect schedule.

Keeping Scheduled Tasks Reliable

Keep the task list short and intentional. Disable unused recurring checks in plugins, avoid overlapping backups, and set heavy imports for off-peak hours. Test after major changes to themes, plugins, caching, or hosting.

Publish a private test post with a near-future schedule, send a test email, and confirm each arrives near the expected time. For revenue, membership, or marketing tasks, add monitoring. An uptime check that visits key pages also wakes WP-Cron, while alerts for missed posts or failed backups catch problems before readers notice.

Frequently Asked Questions

Will more traffic fix late cron jobs?

More visits trigger WP-Cron more often, but traffic is unreliable timing. A short-interval server cron gives steadier timing for low-traffic sites.

Does disabling WP-Cron break scheduled posts?

Disabling page-load triggering alone stops scheduling. It works only when a server cron job calls the scheduler on a regular interval.

Why do tasks run but still show as missed?

The task may have started late and timed out, hit a fatal error, or been blocked by authentication, time-zone, or outbound-request problems.


You Might Also Like