Disable WP-Cron and Set Up a Real Cron Job
How to disable WordPress's unreliable pseudo-cron system and replace it with a real server cron job for faster, more consistent scheduled task execution.
WordPress ships with a pseudo-cron system called WP-Cron. Instead of running on a real schedule, it piggybacks on page visits: every time someone loads a page, WordPress checks whether any scheduled tasks are due and runs them. On low-traffic sites tasks can be delayed for hours. On high-traffic sites every page load triggers the check, adding unnecessary overhead. Replacing it with a real server cron job fixes both problems.
Why WP-Cron is problematic
| Problem | Cause |
|---|---|
| Scheduled posts publish late | No visitors = no cron runs |
| Backup plugins run at wrong time | Depends on traffic pattern |
| Email delays | Same dependency on page loads |
| Slow page loads on busy sites | Every request triggers a cron check |
| Plugin update checks lag | No guaranteed execution interval |
A real cron job runs on a precise schedule regardless of traffic, executes in a dedicated PHP process, and doesn’t add latency to any page request.
Step 1: Disable WP-Cron in wp-config.php
Open wp-config.php in your WordPress root directory and add this line before the /* That's all, stop editing! */ comment:
define( 'DISABLE_WP_CRON', true );
Full context:
// Disable the built-in pseudo-cron: we use a real server cron instead
define( 'DISABLE_WP_CRON', true );
/* That's all, stop editing! Happy publishing. */
Save the file. WordPress no longer runs scheduled tasks on page load from this point forward.
Step 2: Add a server cron job
In cPanel
USERNAME with your cPanel username and adjust the path if WordPress is in a subdirectory.
In DirectAdmin
* (every minute) and leave hour, day, month, weekday as *.Via SSH (any server)
# Open the crontab editor
crontab -e
# Add this line: runs wp-cron.php every minute
* * * * * php /home/USERNAME/public_html/wp-cron.php > /dev/null 2>&1
Save and exit. Verify it was added:
crontab -l
Finding the correct PHP binary
Using php in the command relies on the system’s default PHP version, which may not match what your WordPress site uses. To use a specific PHP version:
# Find available PHP binaries on a cPanel server
ls /usr/local/bin/php*
# Example output:
# /usr/local/bin/php (symlink to default)
# /usr/local/bin/php81
# /usr/local/bin/php82
# /usr/local/bin/php83
Use the full path to match your site’s PHP version:
# For PHP 8.2
* * * * * /usr/local/bin/php82 /home/USERNAME/public_html/wp-cron.php > /dev/null 2>&1
Using WP-CLI instead of php directly
If WP-CLI is installed on your server (it is on all RemarkableCloud managed servers), use it instead: it handles the WordPress bootstrap more cleanly:
* * * * * cd /home/USERNAME/public_html && wp cron event run --due-now > /dev/null 2>&1
WP-CLI automatically uses the correct PHP version for the site and outputs cleaner logs.
Check if WP-CLI is available:
wp --info
How often should cron run?
Every minute is the standard recommendation and matches WordPress’s own internal schedule (WP-Cron checks every minute when triggered). Running it less frequently means some tasks fire late.
| Frequency | Cron expression | Suitable for |
|---|---|---|
| Every minute | * * * * * | Recommended: matches WP schedule |
| Every 5 minutes | */5 * * * * | Acceptable for low-priority tasks |
| Every 15 minutes | */15 * * * * | Not recommended: delays backups and emails |
Verifying cron is working
Check with WP-CLI
cd /home/USERNAME/public_html
wp cron event list
This shows all scheduled events with their next run time. If DISABLE_WP_CRON is set but no server cron is running, events will show as overdue.
Check with a plugin
Install WP Crontrol from the WordPress plugin directory. It shows all scheduled cron events, when they last ran, and lets you manually trigger them for testing.
Check the cron log
Add logging to your cron command to confirm it’s executing:
* * * * * /usr/local/bin/php82 /home/USERNAME/public_html/wp-cron.php >> /home/USERNAME/logs/wp-cron.log 2>&1
Then check the log:
tail -f /home/USERNAME/logs/wp-cron.log
You should see output every minute. An empty log after a few minutes means the cron isn’t firing: double-check the file path and PHP binary.
Multiple WordPress installs
If you run several WordPress sites on the same server, add a cron line for each:
* * * * * /usr/local/bin/php82 /home/USER/public_html/wp-cron.php > /dev/null 2>&1
* * * * * /usr/local/bin/php82 /home/USER/public_html/shop/wp-cron.php > /dev/null 2>&1
* * * * * /usr/local/bin/php82 /home/USER2/public_html/wp-cron.php > /dev/null 2>&1
Or use a single WP-CLI loop if all sites share the same user:
* * * * * for dir in /home/USERNAME/public_html /home/USERNAME/public_html/shop; do cd $dir && wp cron event run --due-now; done > /dev/null 2>&1