21+ years in hosting · Jaipur, India · INR billing with 18% GST · 24/7 email support
Blog · WebJi® India

Disable WP-Cron

Quick answer

Disable WP-Cron only after a server cron job calls wp-cron.php on a timer. Add DISABLE_WP_CRON in wp-config.php so WordPress stops checking tasks on every page load. Scheduled posts, updates and plugin backups still run when that server job hits. It worked when the next scheduled post publishes on time.

A step-by-step guide to replacing visitor-triggered WP-Cron with a real cPanel, crontab or systemd job, for WordPress sites on Indian hosting.

✓ In business since 2005
✓ INR + GST billing
✓ 24/7 Email Support — avg reply < 60 min
GuideWebJi®
knowledge
Read time
4 min
Sections
6
Updated
14 Nov 2026
Written by
WebJi® team

What does WP-Cron check on each visit?

WP-Cron is WordPress's task list, not a system clock: on each visit, wp-cron.php looks for due events and runs them. A scheduled post, a plugin update check, a backup, or a WooCommerce action such as an unpaid-order timeout all sit on that list. If nobody loads a page, the list waits — which is exactly the behaviour the WordPress developer docs describe when they note WP-Cron is only triggered on page load and missed tasks queue for the next opportunity. If every visit spawns that check, busy sites spend PHP workers on the scheduler instead of the page. The plain-English version of a cron job is in what a cron job is.

  • Low traffic: tasks wait for the next visitor, so a post can sit as Missed schedule.
  • Cached traffic: a cache hit may never reach PHP, so the check never starts.
  • High traffic: every hit can spawn wp-cron.php and queue behind real page requests.

This change turns off WordPress's visitor spawn. It does not delete every cron on the server — a Linux crontab for backups or mail is a different job, covered on the cron explainer linked above. To turn the visitor spawn back on, delete the constant and remove the server job.

When should you disable WP-Cron?

Disable WP-Cron when a scheduled post shows Missed schedule, the HTML is served from cache so PHP never runs, traffic is rare at night, or a backup must run whether anyone visits. Leave the default alone on a small uncached site where tasks already finish and the extra PHP hit is invisible.

Do not add DISABLE_WP_CRON and stop. With no server job, publishing and update checks simply pause. On WordPress hosting you add the job first, then the constant.

How do you replace WP-Cron with a cPanel job?

On cPanel hosting, create the server job before you touch wp-config.php, because the constant alone leaves scheduled posts and plugin queues waiting with no error. The Cron Jobs screen sits under Advanced in cPanel — WebJi®'s cPanel hosting plans (from ₹297 a month before 18% GST; checkout confirms current charges) include it.

  1. In cPanel, open Advanced, then Cron Jobs. Use the login for this domain; the billing screen has no cron form.
  2. Add a new job. Pick Once Per Fifteen Minutes, or set Minute to */15 and Hour, Day, Month and Weekday to *.
  3. Set Command to wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1, replacing example.com with the address that loads this WordPress site. The tail of the line drops output so cPanel does not mail you on every run.
  4. In File Manager, edit wp-config.php in the WordPress folder. Above the stop-editing comment, add define('DISABLE_WP_CRON', true); and save. That line blocks the visit spawn; the cron command can still call the file.
  5. Schedule a draft a few minutes ahead. It worked when the post is live after the next run — saving the file alone is not the test.

What if you run a VPS with no cPanel?

On a VPS you install the same call in the Linux crontab or a systemd timer instead of a control-panel form. The URL and the constant do not change; only where the schedule lives.

For the crontab of the user who owns the site (crontab -e):

*/15 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

For systemd, a service unit plus a timer with OnCalendar=*:0/15 gives the same fifteen-minute cadence and logs to journald. On a VPS with root access, curl works in place of wget if that is what the image ships with. Keep one runner: if the constant is missing, both the visitor spawn and the server job fire and events overlap.

How often should the server cron run?

Fifteen minutes is the default that fits a blog, plugin update checks and a nightly backup. Five minutes serves a post or shop action that should land close to the clock; once an hour leaves scheduled posts late; every minute overlaps on shared hosting.

Server cron interval vs what you give up
IntervalUse it whenWhat you give up
Every 15 minutes (*/15)A blog, update checks, nightly backupsA post can publish up to 15 minutes late
Every 5 minutes (*/5)A post or shop action that must land close to the clockMore PHP runs on a quiet account
Every minuteAlmost never on shared hostingOverlapping runs and cron mail

The doing_wp_cron flag on the URL tells WordPress this request is the direct run; it is not a second scheduler. On a multisite network, one URL runs tasks for that site only, so each other site needs its own cron URL or its events keep waiting.

How do you know the cron job ran?

Saving wp-config.php proves nothing — install WP Crontrol and watch next-run times move forward in Tools, Cron Events. A red missed mark that never clears means the command did not fire.

You can also let cPanel email the output for a single cycle: a blank message is normal for this wget line, while an error names a wrong domain or a blocked wp-cron.php. Turn that mail off after the one check, or the inbox fills every 15 minutes. Opening the wp-cron.php URL once in a browser runs whatever is due right then — that is a manual poke, not a schedule, so leave the server job in place.

What still fails after you disable WP-Cron?

If the constant is set and tasks still miss, the server job is the thing to fix — the notice that spawning is disabled is expected, not the fault. It becomes a fault only when no cron command calls wp-cron.php.

  • Posts still miss: the interval is wider than you need, or the command fails. Read one emailed error before tightening */15 to */5.
  • Nothing runs at all: the define line is below the stop-editing comment, or it sits outside the opening PHP tag. Move it above that comment.
  • Two runners at once: the constant is missing and a server job also fires, so events overlap. Keep one runner.
  • Backups stay idle: the plugin must be set to WP-Cron, not the URL of its own. Check its last-run time after one interval.
  • wp-cron.php returns 403: a firewall or an .htaccess rule is blocking the file. The cron mail shows the 403; allow that file for the server call.

If the cron mail shows a path you cannot change, email support@webji.services with the command and the time. The office phone line is not a support queue.

FAQ

Frequently asked questions

How do I disable WP-Cron in WordPress?

Create the cPanel cron job that calls wp-cron.php first. Then add define('DISABLE_WP_CRON', true); in wp-config.php above the stop-editing line. Visits stop spawning tasks, and the server job runs whatever is due.

What happens if I disable WP-Cron and add no server job?

Scheduled posts stay unpublished, update checks pause, and plugin queues wait — with no dashboard error. Add the cPanel job before the constant, or delete the constant until that job exists.

Where exactly do I add DISABLE_WP_CRON in wp-config.php?

Open wp-config.php in the WordPress root and put the line above the comment that says stop editing. Below that comment WordPress does not read it, and text outside the opening PHP tag breaks the file.

How often should the WordPress cron job run?

Every 15 minutes fits most sites. Use every 5 minutes when a scheduled post or a shop action must land close to the clock. Do not use every minute on shared hosting — runs overlap and the mail piles up.

Does a page cache keep WP-Cron working?

No. A cached page never reaches PHP, so the visit-triggered check never starts. That is one of the main reasons to move WP-Cron to a real server job, which calls wp-cron.php regardless of cache state.

Last editorial update: 15 November 2026.

WebJi® since 2005

Ready to get started with WebJi®?

Join 12,000+ businesses across India and overseas. INR pricing, 18% GST shown before payment and 24/7 email support in Hindi and English — average first reply under 60 minutes.