“WP-Cron isn’t a real cron job” is one of those facts that gets repeated in WordPress circles without much explanation of what it actually means in practice. It matters more than it sounds: it’s the reason scheduled posts sometimes publish late, and the reason a low-traffic site can have scheduled tasks that silently stop firing.
WP-Cron Is a Pseudo-Cron, Not a Real System Cron
A real system cron job runs on a fixed schedule regardless of anything else happening on the server. WordPress’s built-in wp-cron.php doesn’t work that way: it only checks for and runs due scheduled tasks when a page on your site loads and triggers it. On a busy site with steady traffic, that’s frequent enough to feel invisible. On a low-traffic site, it means scheduled tasks (a scheduled post publishing, a plugin’s daily cleanup routine) can sit overdue until the next visitor happens to load a page.

Also Read: How to Build a Custom WordPress Login Page (Branded, No Plugin Bloat) — another core WordPress fundamental worth understanding alongside how scheduled tasks work.
What Actually Uses WP-Cron
- Publishing scheduled posts at their set time
- Checking for WordPress core, plugin, and theme updates
- Plugin-scheduled tasks: cache clearing, sending queued emails, database cleanup, SEO plugin sitemap regeneration
- WooCommerce order-related scheduled actions, if you run a store
How to Check If It’s Actually Firing
The most direct way is a dedicated cron-inspection plugin (WP Crontrol is the commonly used, free option) that lists every scheduled hook, when it’s next due, and lets you run one manually to test it. If scheduled posts are consistently publishing late or a plugin’s scheduled task never seems to run, this is the first thing to check before assuming the plugin itself is broken.

The Fix: A Real System Cron Calling wp-cron.php
The standard fix for the traffic-dependency problem is two steps:
- Disable WordPress’s own page-load-triggered cron by adding
define('DISABLE_WP_CRON', true);towp-config.php. - Set up a real system cron job (through your host’s control panel, or a server-level crontab entry) that calls
wp-cron.phpdirectly on a fixed schedule, commonly every 5–15 minutes.
A typical crontab entry, running every 15 minutes:
*/15 * * * * wget -q -O - https://yoursite.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
This decouples scheduled tasks from site traffic entirely, so a quiet site still runs its scheduled jobs reliably. If your host doesn’t give you crontab or control-panel cron access (common on some managed and shared hosts), a third-party pinger service that hits the same wp-cron.php?doing_wp_cron URL on a schedule accomplishes the same thing from outside the server.
A Caveat: Don’t Disable WP-Cron Without Replacing It
Setting DISABLE_WP_CRON to true without also setting up the replacement system cron leaves every scheduled task unfired indefinitely — no scheduled posts publish, no plugin cleanup jobs run, nothing. This is a real, easy-to-make mistake: disabling the constant is only step one. Verify the system cron is actually reaching wp-cron.php (check your host’s cron job logs, or a cron-inspection plugin’s “next due” times actually updating) before considering the fix complete.
Also Read: The Technical SEO Checklist for WordPress — sitemap regeneration and other technical-SEO tasks often depend on WP-Cron firing reliably.
FAQ
Why did my scheduled post publish late?
WP-Cron only fires on a page load. If your site had no visitors right at the scheduled time, the post waits until the next page load triggers the check, which can be minutes or hours later on a low-traffic site.
Is disabling WP-Cron and using a real system cron safe?
Yes, it’s the standard, widely-documented fix for the traffic-dependency issue, and generally makes scheduling more reliable, not less — provided you actually set up and verify the replacement system cron rather than just disabling the constant on its own.
Do I need a plugin to set up a real system cron?
No, the system cron itself is set up at the server/hosting level (control panel or crontab), not through a WordPress plugin. A plugin like WP Crontrol is useful for inspecting and debugging, not for creating the underlying system cron entry.
What happens if I disable WP-Cron but forget to set up the system cron replacement?
Every scheduled task stops firing entirely — no scheduled posts publish, no plugin maintenance jobs run. Always verify the replacement system cron is actually hitting wp-cron.php before considering the fix complete.
Conclusion
WP-Cron’s traffic-dependency quirk is invisible on a busy site and a real problem on a quiet one — if you’ve ever wondered why a scheduled post landed late, this is almost always the reason. A real system cron calling wp-cron.php on a fixed schedule is a five-minute server-side fix that removes the dependency entirely, as long as you verify it’s actually firing afterward.
Suggested Reading
- How to Build a Custom WordPress Login Page (Branded, No Plugin Bloat)
- How to Find, Fix and Submit Your WordPress Sitemap
- The Technical SEO Checklist for WordPress










