How to Fix WordPress Scheduled Posts Not Publishing

When a WordPress post stays marked as “Scheduled” or changes to “Missed schedule,” the cause is usually straightforward: the site time zone is incorrect, WP-Cron did not run, a server restriction interrupted the task, or a plugin caused an error.

Work through the checks below in order. Start with the settings that are easiest to verify before changing cron configuration or deactivating plugins.

Check the post status and site time zone

Open Posts > All Posts and check the affected post. A post marked “Scheduled” is waiting for its publication event. “Missed schedule” means WordPress reached the intended time but did not complete the scheduled task.

WordPress uses the time zone configured for the site, not necessarily the time zone on your computer or hosting server.

  1. Go to Settings > General.
  2. Find the Timezone setting.
  3. Select a named city, such as New York, London, or Singapore, when available.
  4. Save the settings and schedule a test post a few minutes in the future.

A named location is usually preferable to a fixed UTC offset because it can account for daylight-saving changes. If the test post publishes correctly, the original problem may have been caused by an incorrect time zone or an outdated scheduled event.

Understand how WP-Cron affects scheduled posts

WP-Cron is WordPress’s built-in task scheduler. In a standard installation, it is triggered when someone visits the site. WordPress then checks whether scheduled tasks are due and attempts to run them.

This traffic-based system can cause delays when:

  • The site receives very little traffic.
  • A caching layer serves pages without triggering cron processing.
  • A security or performance plugin blocks loopback requests.
  • The hosting server terminates a PHP request before the task finishes.
  • WP-Cron has been disabled without a replacement server cron job.

WP-Cron may be adequate for a small site, but a publishing workflow, membership site, or WooCommerce store may benefit from a real server cron job that runs on a predictable interval.

Inspect scheduled events

Install a reputable cron inspection plugin that lists scheduled events and their associated hooks. Review events that are due soon and look for warnings, failed callbacks, or a growing backlog.

Pay particular attention to events related to publishing, notifications, backups, caching, and ecommerce actions. Do not delete unfamiliar events simply because their names look technical. Record the hook name and identify which plugin or WordPress feature created it first.

If the WordPress dashboard is slow or frequently times out, address that problem as well. Overloaded PHP workers, inefficient database queries, or plugin activity can prevent scheduled tasks from completing. See our guide to fixing a slow WordPress admin and dashboard for related checks.

Check whether WP-Cron is disabled

Open wp-config.php and search for this setting:

define( 'DISABLE_WP_CRON', true );

This prevents WordPress from using its normal cron trigger. It is not necessarily a mistake, but a real server cron job must replace it.

If you want WordPress to handle cron requests normally, remove the setting or change its value to false. Make a backup before editing wp-config.php, and avoid adding a second copy of the same constant.

Configure a server cron job

A server cron job can request WordPress’s cron endpoint at a regular interval. In cPanel, this option is commonly available under Advanced > Cron Jobs. A typical example is:

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

Replace example.com with your domain. The correct command depends on your hosting environment. Some providers recommend PHP CLI instead of wget, while managed WordPress hosts may configure the job for you.

After the replacement job is active and tested, you can disable WordPress’s traffic-based trigger:

define( 'DISABLE_WP_CRON', true );

Do not disable WP-Cron first and configure the server job later, or scheduled tasks may stop running altogether. If you are unsure which command or interval to use, ask your hosting provider to verify the configuration.

Test for plugin and theme conflicts

Caching, security, optimization, membership, editorial workflow, and backup plugins can interfere with cron requests or post status changes. Use a controlled test rather than deactivating plugins randomly on a live site.

  1. Create a complete backup.
  2. Use a staging site or troubleshooting mode where possible.
  3. Temporarily deactivate all plugins.
  4. Schedule a test post a few minutes ahead.
  5. Reactivate plugins one at a time and repeat the test.
  6. Check the active theme only if the plugins do not identify the cause.

Once you find the conflicting plugin, update it and review its cron, caching, or security settings. If the problem remains, check the plugin’s support documentation or contact its developer.

Fatal PHP errors can also interrupt scheduled tasks. Review debug.log, the hosting error log, and any plugin or theme changes made before the problem began. If testing produces a 500 error, see our guide to fixing WordPress 500 Internal Server Errors.

Use WP-CLI to test cron directly

If you have server access, WP-CLI can show whether scheduled events exist and whether due events can run:

wp cron event list
wp cron event run --due-now

If manually running due events publishes the waiting post, the post itself is probably fine and the normal cron trigger is the likely problem. If WP-CLI reports a PHP error, investigate the plugin or theme named in the error before trying again.

Review caching, security, and hosting restrictions

Ask your hosting provider whether loopback requests, outgoing HTTP requests, or wp-cron.php are blocked. If recommended by the host, exclude the cron endpoint from aggressive page caching. Do not permanently disable firewall protection just to make scheduled posts work.

Also check whether PHP workers are exhausted and whether the server is using a supported PHP version. A recent hosting or PHP change can expose plugin compatibility problems. For related server checks, see our guide to changing the PHP version for WordPress in cPanel safely.

Frequently asked questions

Why do scheduled posts publish when I visit the site?

Your visit may trigger WP-Cron and process an overdue event. This usually indicates that traffic-dependent cron is delayed rather than completely broken.

Will rescheduling a missed post fix the problem?

Rescheduling may publish that post, but it does not repair the underlying scheduler. Check the time zone and WP-Cron configuration before relying on this as a permanent solution.

Should I install a plugin that publishes missed posts?

These plugins can help in specific situations, but they may hide a broken cron setup. Diagnose WP-Cron and server scheduling first.

When should I contact my host or a developer?

Ask for help when cron fails through WP-CLI, the server blocks loopback requests, or multiple plugins produce PHP errors. Hosting support can verify server cron and request restrictions, while a WordPress developer can investigate application-level conflicts.

Conclusion

WordPress scheduled posts usually fail because of an incorrect time zone, delayed or disabled WP-Cron, a missing server cron replacement, or a plugin conflict. Check the site settings first, inspect scheduled events, test plugins methodically, and use a server cron job when your publishing workflow needs more predictable execution.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top