How to Schedule Posts in WordPress
Schedule WordPress posts, fix missed schedules, and set up WP-Cron with a real server cron to keep posts publishing on time.
To schedule a post in WordPress, open the post’s Settings → Summary panel, click the Publish: Immediately date, pick a future date and time, then click the Schedule button that replaces Publish.
That part takes under a minute. What takes longer is working out why the post you queued for 2 a.m. was still sitting there at breakfast, flagged Missed Schedule in red.
The reason traces back to how WordPress runs scheduled tasks: not on a real timer, but on page loads. This guide covers the fast click-path first, then the WP-Cron mechanism and the permanent server-cron fix that stops missed schedules for good.
Key Takeaways
- WordPress schedules posts in your site’s timezone, which defaults to UTC. Set the correct zone in Settings → General before scheduling, or posts fire at the wrong local time.
- WordPress doesn’t use a real system timer; it uses WP-Cron, a pseudo-cron that only checks for due tasks when someone loads a page, so a low-traffic or heavily cached site can miss the scheduled moment entirely.
- The permanent fix is to run a real server cron that requests
wp-cron.phpevery 5–15 minutes, then adddefine('DISABLE_WP_CRON', true);towp-config.php. Do it in that order, or scheduled tasks stop silently. - Plugins like MWW Scheduled Post Trigger only publish missed posts after they’re late; a server cron prevents the miss in the first place.
- Managed platforms such as Kinsta and DreamHost’s DreamPress already run a server-level cron (typically every 15 minutes), so you usually don’t need to configure anything there.
Set your timezone first
WordPress schedules posts in your site’s timezone, which defaults to UTC. Set the correct zone in Settings → General before scheduling, or posts will publish at the wrong local time. A fresh install stores times in Coordinated Universal Time, so a post you queue for “8:00 AM” fires at 8:00 AM UTC unless you’ve told WordPress where you are. Go to Settings → General, choose a city in your zone (city-based entries handle daylight saving automatically, unlike fixed UTC offsets), and save. Do this once, before you schedule anything. The install notes for the MWW Scheduled Post Trigger plugin tell you to check this setting first, and its FAQ sends you back to it when posts still fail to appear.
Discover how at OpenReplay.com.
How do you schedule a post in the block editor?
To schedule a post in the block editor, open the Settings → Summary panel, click the Publish: Immediately date, pick a future date and time, then click the Schedule button that replaces Publish. WordPress publishes the post automatically at that moment. To confirm, the top button reads Schedule rather than Publish whenever a future date is set.
Classic editor: in the Publish meta box, click Edit next to Publish immediately, enter your date and time, click OK, then click the Schedule button.
Pages work the same way. The date control lives in the same panel for both post types.
Manage, unschedule, and publish early
To see every queued post, go to Posts → All Posts and click the Scheduled filter above the list; from there you can edit, publish early, or unschedule any entry.
- Publish early: open the post and click Publish. It goes live immediately, regardless of the scheduled time.
- Unschedule: switch the post’s status back to Draft. This removes it from the queue without publishing it, and you can keep editing and reschedule later. (Setting the date to “now” and hitting Publish is publishing early, not unscheduling.)
- Schedule edits to an already-published post: by default you can’t, because any change to a live post goes public the moment you save. To queue an update, use a plugin such as PublishPress Revisions, which stages a revision and publishes it on a schedule.
Why do WordPress scheduled posts miss?
WordPress doesn’t use a real system timer. It uses WP-Cron, a pseudo-cron that only checks for due tasks when someone loads a page, so on a low-traffic site a post scheduled for 2:00 AM may not publish until the next visitor arrives. The Plugin Handbook is blunt about what that means in practice: queue a job for two in the afternoon, get no visitors until five, and the job sits there until five. When the trigger finally fires, the post is already past due and WordPress flags it Missed Schedule in red.
Two production conditions make this worse:
- Low or no traffic. As SpinupWP explains, scheduled events only fire when somebody shows up, so a site that goes quiet for hours will miss anything due in that window. Overnight posts on a hobby blog are the classic casualty.
- Aggressive full-page caching. A cached page is served as static HTML without executing PHP, so WP-Cron never runs at all. Serve enough of your traffic from cache and WordPress barely executes, which means even a busy site can stop firing scheduled events. It’s a common cause on performance-tuned sites.
The permanent fix: disable pseudo-cron and run a real server cron
The permanent fix is to run a real cron on a fixed timer and then disable the page-load trigger. This is a documented approach rather than a workaround: the Plugin Handbook covers hooking WP-Cron into the system task scheduler for exactly the case where a task has to run on time.
Do these in order. If you disable WP-Cron before a replacement is running, scheduled tasks stop firing with no error and no warning: posts, backups, and update checks all go quiet until you notice.
Step 1: add a real cron job. In cPanel’s Cron Jobs module or your server’s crontab, request wp-cron.php on an interval. A reliable default is every 5–15 minutes. This wget -q -O - form is Kinsta’s:
*/15 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
The */15 runs it every 15 minutes; replace example.com with your domain. The Handbook’s canonical form uses wget --delete-after http://YOUR_SITE_URL/wp-cron.php on the same interval. Either works; pick whichever your host supports.
Step 2: disable the page-load trigger. Once the server cron is in place, add this line to wp-config.php, above the /* That's all, stop editing! */ comment:
define('DISABLE_WP_CRON', true);
Plugin as a stop-gap. Plugins like MWW Scheduled Post Trigger or Missed Scheduled Posts Publisher only publish missed posts after they’re already late, and MWW’s own FAQ describes it as a stop-gap until you and your host work out why cron isn’t firing. A real server cron prevents the miss instead of reacting to it. Don’t rely on any single plugin as guaranteed, since some fail on certain host configs.
| Stop-gap plugin | Real server cron (recommended) | |
|---|---|---|
| What it does | Publishes already-missed posts on next visit/interval | Fires wp-cron.php on a fixed timer regardless of traffic |
| Best for | Low-traffic hobby blogs, quick unblock | Production, cached, low-traffic, or multisite installs |
| Prevents the miss? | No, reacts after | Yes, proactive |
| Setup | Install and activate | Edit wp-config.php + add cron entry (or use managed host) |
Managed hosts. Kinsta runs a server-level cron on every site every 15 minutes, and DreamHost’s DreamPress disables WP-Cron by default and replaces it with a system cron on the same interval. On platforms like these you usually don’t need to configure anything. Check your host’s docs before disabling WP-Cron.
Verify and force-run with WP-CLI. On a server with SSH, wp cron event list shows scheduled events and their next-run times, and wp cron event run --due-now forces every overdue event immediately, which is the fastest way to confirm a stuck post will publish.
Wrapping up
Scheduling a WordPress post is a one-minute click-path, but keeping those posts reliable is a server concern. Set your timezone in Settings → General and queue posts from the Summary panel. If scheduled posts ever show Missed Schedule, stop trusting the page-load pseudo-cron: point a real server cron at wp-cron.php every 5–15 minutes, then add define('DISABLE_WP_CRON', true);. That single change turns scheduling from best-effort into dependable, even on a quiet or cached site.
FAQs
Should I disable WP-Cron if I'm on a managed WordPress host like Kinsta or DreamHost?
No, on managed platforms like Kinsta and DreamHost's DreamPress you usually don't need to disable WP-Cron yourself, because these platforms already run a server-level cron on their end (typically every 15 minutes) that fires wp-cron.php regardless of traffic. Check your host's documentation first — many managed plans configure this automatically, and doubling it up adds no benefit. Only touch wp-config.php if your host confirms it doesn't run a server cron.
What's the difference between a missed-schedule plugin and a real server cron?
A missed-schedule plugin like MWW Scheduled Post Trigger or Missed Scheduled Posts Publisher only publishes posts after they're already late, reacting on the next page load or interval, while a real server cron fires wp-cron.php on a fixed timer regardless of traffic and prevents the miss from happening at all. Plugins are a quick stop-gap for low-traffic hobby blogs; a server cron is the proactive fix for production, cached, or multisite installs.
Why did my scheduled post publish at the wrong time of day?
A fresh WordPress install stores times in Coordinated Universal Time (UTC), so a post queued for '8:00 AM' fires at 8:00 AM UTC unless you set your zone in Settings then General. Choose a city-based entry rather than a fixed UTC offset, because city entries adjust for daylight saving automatically. Set this once before scheduling anything to keep all future posts on your local clock.
How can I check whether my scheduled posts will actually publish?
On a server with SSH access, run wp cron event list to see every scheduled event and its next-run time, then run wp cron event run --due-now to force all overdue events to execute immediately. This WP-CLI pair is the fastest way to confirm a stuck post will publish and to diagnose whether WP-Cron is firing at all. Without SSH, the WP Crontrol plugin exposes the same event list through the admin dashboard.
Does full-page caching cause scheduled posts to miss?
Yes, aggressive full-page caching is a common and often-overlooked cause of missed schedules. A cached page is served as static HTML without executing PHP, so WP-Cron never runs on those requests even when traffic is high. Serve enough of your traffic from cache and WordPress barely executes, so scheduled events stop firing. The fix is the same as for low-traffic sites: disable the page-load trigger and run a real server cron.
Gain Debugging Superpowers
Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers.
Star on GitHub12k