WordPressの予約投稿が公開されない|WP-Cronはアクセスがあった時だけ動く

WordPressの予約投稿が、時刻を過ぎても公開されないのは、WP-Cron(WordPress内蔵の予定実行の仕組み)が、サイトにアクセスがあった時にしか動かないためです。アクセスが無い時間が続くと、予定の時刻を過ぎたまま「予約投稿の失敗」と表示されることがあります。

この記事では、WordPress公式のプラグインハンドブックと、WordPress 7.1.2 のソースコードにもとづいて、WP-Cronの動き方、予約投稿が公開される流れ、止まっている時に確かめることをまとめます。

(確認:WordPress公式 Plugin Handbook「Cron」、WordPress 7.1.2 のソースコード wp-cron.php・wp-includes/cron.php・wp-includes/post.php、日本語の翻訳ファイル。確認日:2026年10月6日)

WP-Cronの動き方

公式のハンドブックには、次のように書かれています。

  • WP-Cronは、ページが読み込まれるたびに、予定されたタスクの一覧を確認し、実行する時刻が来ているものを、そのページの読み込みの中で呼び出す
  • UNIXのcronのように常に動いているわけではなく、ページの読み込みで動き出す
  • 午後2時に予定したタスクでも、午後5時までページの読み込みが無ければ、実行は午後5時になる
  • 実行できなかったタスクは、キューに残り、次の機会に実行される(時刻は保証されないが、いずれ実行される)

WordPress本体の更新確認や、予約投稿の公開も、WP-Cronで動いています。

予約投稿が公開される流れ

  1. 予約した投稿は、ステータスが「future」になり、公開の時刻に publish_future_post という予定が登録される
  2. 時刻が来た後の最初のアクセスで、WP-Cronがこの予定を実行する
  3. 実行時に、ステータスが「future」のままで、時刻が過ぎていれば、公開する(下書きなどは公開しない仕組み)

このため、予定の時刻にアクセスが無いと、公開が遅れます。時刻が過ぎても公開されていない投稿には、投稿一覧で「予約投稿の失敗」と表示されます。

止まっている時に確認すること

確認 内容
アクセスが無い サイトに誰も来ないと動かない。自分でトップページを開くと、WP-Cronが動いて公開されることがある
DISABLE_WP_CRON wp-config.php に define( 'DISABLE_WP_CRON', true ); があると、ページの読み込みではWP-Cronを動かさない(ソースで確認)。サーバーのcronから wp-cron.php を呼ぶ運用の時に使う設定で、呼ぶ仕組みが無いと、予約投稿は動かない
キャッシュ ページがキャッシュから返される設定では、WordPressが動かず、WP-Cronの起動も遅れる場合がある(一般的な話)
サーバーからの自分への通信 WP-Cronは、自分のサイトの wp-cron.php へ通信して動く。サイトヘルスに「ループバックリクエスト」の警告があれば、同じ原因のことが多い(サイトヘルスのREST APIエラー)
時刻の設定 サイトのタイムゾーンと、予約した日時がずれていないか。REST APIで予約する場合は WordPressのREST APIで予約投稿|dateの時差 を確認

アクセスが少なくても確実に動かす方法

wp-cron.php のコメントには、アクセスが少ないサイトでは、このファイルを直接、またはサーバーのcronから、一定の間隔で呼び出せると書かれています。DISABLE_WP_CRON を使う方法と、wp-cron.php を直接呼ぶ方法は、互いに独立しています(DISABLE_WP_CRON を設定しなくても、wp-cron.php を呼ぶ運用はできます)。

  • レンタルサーバーの管理画面に、cron設定があれば、wp-cron.php を数分おきに呼ぶように登録する
  • 設定の方法と、使える間隔は、サーバー会社によって違うため、契約するサーバーの案内で確認する
  • 連続して動かないように、WordPressは実行中の印(doing_cron)を持ち、60秒のロックをかけている(ソースで確認)

予約投稿が確実に必要なサイトは、サーバーにcron設定があるかも、サーバー選びの条件になります(WordPressの動作環境、Amazon Auto Posts 導入前に確認すること)。

まとめ

  • 予約投稿が遅れるのは、WP-Cronがアクセスの時にしか動かないため。時刻を過ぎると「予約投稿の失敗」と出る
  • DISABLE_WP_CRON の設定、キャッシュ、自分のサイトへの通信の失敗を確認する
  • 確実に動かすなら、サーバーのcronで wp-cron.php を定期的に呼ぶ

本記事は設定を説明したものです。wp-config.php を変更する前には、バックアップを取ってください。