WordPress checks its schedule only when a page is requested, so quiet or heavily cached sites run scheduled posts, backups and updates late. Switch that off and have the server run the schedule every few minutes.

The post that was set for seven

You write a post on Thursday, schedule it for seven on Monday morning and plan an email around it. At nine the post is still not on the site.

In the dashboard it may still say Scheduled, or it may say Missed schedule. Either way, the time you chose was treated as a suggestion.

This is not a fault in one site. It follows from the way WordPress keeps time, and the same mechanism runs backups, update checks and security releases.

WordPress has no clock of its own

WordPress does not run continuously. It wakes up when someone requests a page, builds that page, and goes back to sleep.

To handle scheduled jobs, it borrows those moments. On each request it checks whether anything is due, and if so it starts the job with a quick background call to itself.

The system is called WP-Cron, after cron, the scheduler on most web servers. On a busy site, where requests arrive every few seconds, it works well.

On a quiet site, a job due at seven waits for the first visitor after seven. If nobody comes until noon, the post appears at noon.

What runs on the same schedule

The second matters most. WordPress applies its own minor security releases automatically, but only through this schedule, so a site whose schedule stalls can sit unpatched while its owner assumes otherwise.

Why quiet sites are not the only ones

Two other things stop the schedule. The first is page caching, which hands visitors a stored copy of each page without starting WordPress at all.

On a well-cached site most visits never reach WordPress, so the schedule waits for an uncached request, often someone logging in.

The second is a blocked call. If a security plugin, a firewall rule or a password on the whole site stops WordPress calling itself, the jobs never start, and Missed schedule appears and stays.

A real scheduled task instead

The fix is to stop relying on visits. One line in the site's wp-config.php file, setting DISABLE_WP_CRON to true, switches off the check on each page request.

Then a cron job on the server, set up in the hosting control panel, calls the WordPress scheduler every five or fifteen minutes, whether anyone visits or not.

A post set for seven then appears by quarter past at the latest, and backups run when they were meant to.

Most hosting accounts allow this. Your web developer or host can set it up in a few minutes, and it should be tested the same day.

A worked example

A skin care clinic posts its treatment specials on the first of each month, scheduled a week ahead for six in the morning. The client email goes out at nine with a link to it.

On the first of February the email went out on time. The link led to a page saying nothing was found, and the post sat in the dashboard marked Missed schedule.

The cause was a security plugin installed in January. Among other things, it blocked requests from the server's own address, including WordPress's call to its own scheduler.

Nothing scheduled had run for weeks. The nightly backups had stopped, and the security release from late January, which should have installed itself, was still waiting behind a notice nobody had read.

The developer allowed the site's own requests, switched off the page-visit check and added a server cron job every fifteen minutes. A test post set for the next morning went up within fifteen minutes of its time.

The clinic now checks the backup log and the Updates screen on the second of every month.

Set the time zone properly

One more cause of posts at the wrong time has nothing to do with visits. WordPress publishes by its own clock, set under Settings, General, Timezone.

A site left on UTC publishes a post set for seven in the morning at eleven the night before, Vancouver time.

Choose a city, such as Vancouver, rather than a fixed offset like UTC-8. The city setting follows daylight saving time, which starts on March 12 this year.

Check that the jobs actually run

A server task that nobody checks can fail as quietly as the original problem. Look, rather than assume.

The Posts screen shows any post marked Missed schedule. A backup plugin's log shows the dates its backups really ran, which should match the schedule you chose.

A plugin such as WP Crontrol lists every scheduled job and when it is next due. A job whose time is already in the past is a job that is not running.

After any change to security plugins, caching or hosting, schedule a test post for an hour ahead and see whether it appears.

Who should own this

The schedule sits between the site and the server, which is exactly why it gets missed: the developer assumes the host runs it, and the host assumes WordPress does.

Ask whoever maintains the site to confirm how scheduled jobs run, and to add a check to their regular maintenance.

If nobody maintains the site, that is the larger problem, and the missed post is only the first sign of it.

The counter-case

A busy site with steady visits around the clock, and no full-page caching, rarely notices any of this. Jobs run within seconds of their time.

A site that never schedules posts and has its backups handled by the host, outside WordPress, has less riding on the schedule as well.

Even then, automatic security releases depend on it, and they are the one job no site can afford to have stall.

For any site that is quiet, cached or protected by a security plugin, switch off the page-visit check and let the server run the schedule.

Checking the schedule

  1. Look for Missed schedule in your Posts list.
  2. Check the backup log against the schedule you set.
  3. Confirm the time zone is set to a city.
  4. Ask whether a server cron job runs the schedule.
  5. Add one if the answer is no.
  6. Schedule a test post an hour ahead.
  7. Repeat the test after any security or caching change.

Step two is the one that finds the hidden damage. A late post is visible to everyone; a backup that has not run since January stays invisible until the day it is needed.

Why the security releases on that same schedule cannot wait is covered in security releases and the sites that wait for a quiet week.


Frequently asked questions

Why did my scheduled post publish late?

WordPress checks its schedule only when a page is requested. On a quiet or heavily cached site, a post due at seven waits for the first uncached visit.

What does Missed schedule mean?

The post's time has passed and WordPress has not published it, usually because its call to its own scheduler is blocked by a security setting, firewall or password.

What else runs on that schedule?

Automatic security releases, update checks, most backup plugins, timed plugin emails and housekeeping. If scheduled posts are late, these are probably late too.

How does a server cron job fix it?

With the page-visit check switched off in wp-config.php, the server calls the WordPress scheduler every five or fifteen minutes, whether anyone visits or not.

Why did my post appear the night before?

The time zone is probably set to UTC. Choose a city such as Vancouver under Settings, General, so the clock also follows daylight saving time.

How do I know scheduled jobs are running?

Look for Missed schedule in the Posts list, compare backup logs with the schedule, and use a plugin that lists jobs. Any job overdue is not running.

West Coast Media Solutions Inc. provides web design, web development, hosting, digital marketing, and business consulting to organisations across Canada, drawing on more than twenty-five years in the field.

Scheduled posts going up late?

Tell us the site address. We will check how its scheduled jobs run and set up a proper server task.

Start a Conversation