+254725682556 +254725052660 info@ziprof.co.ke
Client Area

WordPress

Why Your WordPress Scheduled Posts Aren't Publishing on Time (and How to Fix It)

If a scheduled post goes live hours late, or not at all, the cause is almost always the same: WordPress does not have a real, independent scheduler. It relies on something called WP-Cron, which only checks for due tasks when a visitor loads a page on your site. On a quiet site with light traffic, there may not be a visitor around at the exact minute your post was due, so the task waits until the next page load comes along.

This affects more than just blog posts. WooCommerce order emails, scheduled backups from some plugins, and SEO or security plugin checks can all run late for the same reason.

Why This Happens

Every time someone visits any page on your WordPress site, a hidden request to wp-cron.php fires in the background and asks: "Is anything due to run right now?" If something is due, it runs then. If nobody visits your site around that time, the check simply does not happen, and the task sits waiting.

This is normal, default WordPress behavior, not a fault with your hosting account. It works fine for busy sites with constant traffic, but it becomes unreliable for sites with low or irregular visits, which is common for many small business websites.

Before changing anything, double-check Settings then General in your WordPress dashboard, and confirm your Timezone is set correctly. A wrong timezone is a separate, very common reason posts appear to publish at the "wrong" time even when WP-Cron is working fine.

How to Fix It: Use a Real Server Cron Job Instead

The fix is to turn off the unreliable, visitor-triggered version of WP-Cron and replace it with a real cron job on your hosting account that checks for due tasks on a fixed schedule, whether or not anyone is visiting the site.

Step 1: Disable the default WP-Cron behavior

  1. Connect to your site using File Manager or FTP and open wp-config.php, found in your site's root folder.
  2. Find the line that says /* That's all, stop editing! Happy publishing. */.
  3. Just above that line, add this exact line:
    define('DISABLE_WP_CRON', true);
  4. Save the file.
Only disable WP-Cron this way if you are going to complete Step 2 and set up a real cron job. If you disable it and skip Step 2, scheduled posts and tasks will never run at all.

Step 2: Create a real cron job

Now set up a cron job that visits wp-cron.php on a fixed schedule, for example every 15 minutes. Replace yourdomain.com below with your own domain.

Command to use in both panels:

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

In cPanel

  1. Log in to cPanel and click Cron Jobs under the Advanced section.
  2. Under Add New Cron Job, choose a schedule from the Common Settings dropdown, such as "Every 15 Minutes".
  3. Paste the command from above into the Command field.
  4. Click Add New Cron Job to save it.

In DirectAdmin

  1. Log in to DirectAdmin and click Cron Jobs, usually found under Advanced Features.
  2. Set the Minute, Hour, Day, Month, and Weekday fields to run every 15 minutes (for example, minute values of 0,15,30,45, with the rest left as *).
  3. Paste the command from above into the Command field.
  4. Click Create to save it.

Once the real cron job is running, scheduled posts, WooCommerce emails, and plugin tasks will fire on time, at the interval you chose, regardless of how much traffic your site gets.

A Quick Alternative If You Cannot Edit Files

If you are not comfortable editing wp-config.php, several free WordPress plugins can trigger WP-Cron reliably without a server-level cron job, or can disable the default behavior for you from the plugin settings screen. These are a reasonable option if you want a quicker fix, though a real server cron job set up as above is the more dependable long-term solution.