WordPress

WordPress Cron and Scheduled Tasks

By the Domain India teamPublished 8 min read
Knowledge base article
Contents (7 sections)

WordPress has its own scheduler, WP-Cron, which runs scheduled posts, plugin update checks, backup plugins, newsletter digests and clean-up jobs. It doesn't run on a clock: it runs when someone visits your site. This guide explains how WP-Cron works, why scheduled tasks run late or not at all on quiet or cached sites, and how to replace it with a real cron job on Domain India cPanel and DirectAdmin hosting.

Key takeaways

WP-Cron only fires when a page request reaches WordPress, so on a low-traffic or heavily cached site scheduled posts show "Missed schedule" and plugin jobs run late. Fix it by adding define( 'DISABLE_WP_CRON', true ); to wp-config.php and running wp-cron.php from a real cron job every 5 to 15 minutes. On our shared servers the shortest interval that actually runs is every 4 minutes.

1. How WP-Cron works

When a visitor opens any page, WordPress checks its list of scheduled events. If one is due, it sends a quick background request to wp-cron.php on your own site, and that request runs the due events while the visitor's page loads normally.

This has three consequences:

  • Timing depends on traffic. A post scheduled for 9:00 is published by the first visit after 9:00, which on a quiet site might be 9:40.
  • Busy sites check constantly. Every request can trigger the check, which is wasted work on a site with steady traffic.
  • It depends on a loopback request. WordPress has to be able to call itself over HTTP. If that request fails, due events never run.

Plugins add their own events. WooCommerce, for example, uses Action Scheduler, which is kicked off by WP-Cron, so order emails and stock updates can also queue up when WP-Cron stalls.

2. Signs that WP-Cron is not running

"Missed schedule" on posts
Scheduled posts stay unpublished after their time and the Posts list shows Missed schedule.
Backups that never appear
A backup plugin's schedule shows the next run in the past.
Site Health warnings
Tools › Site Health reports "A scheduled event has failed" or "Your site could not complete a loopback request".
Piled-up past-due actions
WooCommerce › Status › Scheduled Actions shows many Pending actions with past dates.

3. Why it is unreliable on shared hosting

Three things work against visitor-triggered cron:

  • Low traffic. A small business site may get no visits for hours overnight.
  • Caching. A page served from a cache plugin's stored copy, or from a server-side cache, never starts WordPress, so it never checks the schedule. On our cPanel servers an nginx cache sits in front of Apache and answers many requests on its own; that is good for speed, and it also means fewer requests reach WordPress.
  • The loopback request. Security rules or disabled PHP functions can stop WordPress from calling itself. See PHP disabled functions on shared hosting for what is switched off on our servers.

A real cron job avoids all three: the server runs WordPress's scheduler on a fixed timetable, whether anyone visits or not.

4. Replace WP-Cron with a real cron job

  1. Stop the visitor trigger.
    Open wp-config.php in the File Manager and add this line above "That's all, stop editing": define( 'DISABLE_WP_CRON', true );
  2. Open Cron Jobs in your panel.
    In cPanel it is under Advanced › Cron Jobs. In DirectAdmin, open Cron Jobs (type "cron" in the search box if you can't see it).
  3. Choose the timing.
    Every 15 minutes (/15 *) suits most sites; use every 5 minutes if exact publishing times matter.
  4. Enter the command
    for your panel from the table below, with your own username and folder.
  5. Save, then test.
    Schedule a draft post for 20 minutes ahead and check that it publishes on time.
cPanel Cron Jobs page with the Cron Email setting, the Add New Cron Job form with Common Settings and time fields, and Current Cron Jobs
cPanel Cron Jobs: choose the timing, enter the command, add it.
PanelCommand for the main website
cPanelcd /home/USERNAME/public_html && /usr/local/bin/php wp-cron.php >/dev/null 2>&1
DirectAdmincd /home/USERNAME/domains/example.com/public_html && /usr/local/php83/bin/php wp-cron.php >/dev/null 2>&1

On cPanel, /usr/local/bin/php runs the PHP version selected for your account. On DirectAdmin each PHP version has its own binary, so change php83 to the version your site uses (php82, php81 and so on). For a WordPress site on an addon domain, cd into that domain's folder instead. On Webuzo, ask support for the PHP path to use.

Every 1, 2 or 3 minutes becomes every 4

On our cPanel and DirectAdmin servers, cron jobs set to run every 1, 2 or 3 minutes are rewritten to every 4 minutes automatically. Anything faster than every 4 minutes won't happen, and a WordPress site rarely needs it. Our shared servers run on Indian Standard Time.

More on cron timing and commands is in How to set up a cron job, Setting up cron jobs in DirectAdmin and the cron expression guide.

5. Check that it is working

  • WP Crontrol. This free plugin adds Tools › Cron Events, listing every scheduled event, when it runs next and which plugin added it. Events with a next-run time well in the past mean cron still isn't running.
  • A temporary log. While testing, replace >/dev/null 2>&1 in your cron command with >> /home/USERNAME/wp-cron.log 2>&1. If the log shows a PHP error, fix it; once the job works, switch back so the log doesn't grow.
  • WP-CLI over SSH. WP-CLI is available in the jailed shell on our cPanel and DirectAdmin servers. SSH is off by default; ask support to enable it for your account. Then, from your WordPress folder, wp cron event list shows the queue and wp cron event run --due-now runs everything that is due.

6. Common problems and fixes

ProblemLikely causeFix
Posts still show Missed scheduleThe cron command never runs, or runs in the wrong folderCheck the path and the cd part, and read the temporary log
The log shows "Could not open input file"The folder or file name is wrongCheck that wp-cron.php is in the folder you cd into
A plugin's task fails from cron but works in the browserThe task needs a PHP function that is disabled on shared hostingCheck the disabled functions list, or ask the plugin's developer
Old events keep appearingA deleted plugin left its events behindDelete them in Tools › Cron Events
Cron emails you after every runThe output is not discardedEnd the command with >/dev/null 2>&1
"Resource Limit Is Reached" around cron timesA heavy plugin task runs too oftenRun cron less often, or move the heavy task to a quieter hour

Keep one cron job per WordPress site. Two jobs for the same site, or WP-Cron left on alongside a real cron job, just run the same events twice as often.

7. WordPress hosting at Domain India

WordPress runs on all our shared hosting. cPanel has Softaculous and WP Toolkit for one-click installs and updates, and DirectAdmin has Softaculous. Both panels have a Cron Jobs tool, and weekly JetBackup backups sit alongside any backup plugin you use. Our shared servers run Apache, so for page caching use WP Super Cache or W3 Total Cache rather than LiteSpeed Cache.

On 19 September 2026, Domain India list prices were ₹125 a month for cPanel Starter, ₹200 for cPanel Growth and ₹100 for DA Starter, excluding 18% GST. For several WordPress sites, Growth plans host 5 websites in one account.

cPanel Starter
₹125/mo + GST
  • 25 GB NVMe SSD Storage
  • 50 GB Monthly Bandwidth
  • 1 Website
  • 10 Email Accounts
See plan details
cPanel Growth
₹200/mo + GST
  • 50 GB NVMe SSD Storage
  • 100 GB Monthly Bandwidth
  • 5 Websites
  • 50 Email Accounts
See plan details

Prices on the cards exclude 18% GST.

What is WP-Cron in WordPress?

WP-Cron is WordPress's built-in scheduler. It runs scheduled posts, update checks and plugin tasks, but only when a visit reaches WordPress, so tasks can run late on quiet or cached sites.

Why does my scheduled post say Missed schedule?

WP-Cron did not run at the scheduled time, usually because no visit reached WordPress or its loopback request failed. Disable WP-Cron in wp-config.php and run wp-cron.php from a real cron job every 5 to 15 minutes.

Is it safe to set DISABLE_WP_CRON to true?

Yes, as long as you add a real cron job that runs wp-cron.php. Without one, scheduled posts and plugin tasks stop running entirely.

How often should the WordPress cron job run?

Every 15 minutes suits most sites, and every 5 minutes if exact publishing times matter. On Domain India shared hosting, jobs set to every 1, 2 or 3 minutes run every 4 minutes.

Which PHP path should I use for the cron job?

On Domain India cPanel hosting use /usr/local/bin/php, which runs your account's selected PHP version. On DirectAdmin use the versioned binary, for example /usr/local/php83/bin/php. On Webuzo, ask support.

Do I need SSH to set up a WordPress cron job?

No. You create the cron job in your control panel's Cron Jobs tool. SSH is only needed if you want to use WP-CLI, and support can enable jailed SSH on request.

Ready to make your scheduled posts publish on time? Set up the cron job from your hosting list, read the complete WordPress guide, or compare cPanel hosting plans. Stuck? Open a support ticket or use the 24/7 live chat.

WordPress hosting with the tools built in

Softaculous, WP Toolkit, a Cron Jobs tool, free SSL and weekly backups on every cPanel plan.

See cPanel hosting plans

Was this article helpful?

Your answer helps us decide what to improve next.

Still need help? Open a support ticket and our team will reply.

Prefer an app? Add this site to your home screen.Get the app
WordPress Cron (WP-Cron): Fix Missed Schedule | Domain India