WordPressで予約投稿を設定したのに、時間になっても記事が公開されていない。投稿一覧を見ると、日付の欄に赤字で「予約投稿の失敗」と表示されている。そんな経験はありませんか?
この「予約投稿の失敗」の多くは、WordPressの予約処理を担う「WP-Cron」という仕組みがうまく動いていないことが原因です。
本記事では、予約投稿が公開される仕組みと、公開されない主な原因、確認方法、対処法を、TCDの検証サイトで実際に「予約投稿の失敗」を起こして確かめた結果とあわせて解説します。
「予約投稿の失敗」とは
「予約投稿の失敗」は、予約した日時を過ぎても記事が公開されなかったときに、投稿一覧の日付の欄に赤字で表示されるステータスです。

記事は「予約済み」のまま止まっていて、サイトには表示されていません。このまま放っておいても、自動で公開されるとは限らないので注意しましょう。
予約投稿が公開される仕組み(WP-Cron)
WordPressには、決まった時刻に処理を実行するための「WP-Cron(ダブリューピー・クーロン)」という仕組みがあります。予約投稿の公開も、このWP-Cronに登録された「publish_future_post」という処理によって行われます。
ポイントは、WP-Cronは、サーバーが時刻どおりに動かしているのではなく、サイトへのアクセスをきっかけに実行されるという点です。ここが、予約投稿が公開されない原因の多くにつながっています。
サイトに誰かがアクセスすると、WordPressは「実行時刻を過ぎた処理がないか」を確認し、あれば自分のサイトにリクエスト(ループバックリクエスト)を送って処理を実行します。そのため、予約時刻を過ぎても、次のアクセスがあるまで公開されないことがあるのです。
予約投稿が公開されない主な原因
1. 予約時刻の前後にサイトへのアクセスがない
アクセスの少ないサイトや、深夜・早朝の予約では、予約時刻を過ぎてもしばらくアクセスがないことがあります。アクセスがなければWP-Cronが動かないため、記事も公開されません。
2. ループバックリクエストが失敗している
WP-Cronは、自分のサイトにリクエストを送って処理を実行します。セキュリティプラグインやサーバーのファイアウォール(WAF)、サイト全体にかけたBasic認証などがこのリクエストを止めてしまうと、処理が実行されません。
3. キャッシュによってWordPressが動いていない
キャッシュ系のプラグインやCDNでページを丸ごとキャッシュしていると、アクセスがあってもWordPress本体が動かないことがあります。この場合も、WP-Cronが実行されるきっかけがなくなります。
4. WP-Cronを無効にしたまま、代わりの設定がない
wp-config.phpに「DISABLE_WP_CRON」を書いてWP-Cronを無効にしている場合は、サーバーのCronなどで代わりに実行する設定が必要です。代わりの設定がないと、予約投稿を含むすべての予約処理が動きません。
5. タイムゾーンの設定が間違っている
「設定」→「一般」のタイムゾーンが日本(UTC+9)になっていないと、予約した時刻と実際に公開される時刻がずれます。「公開されない」と思ったら、時差の分だけ遅れて公開されていた、ということもあります。
原因を確認する方法
サイトヘルスで確認する
管理画面の「ツール」→「サイトヘルス」を開くと、WP-Cronやループバックリクエストに問題がないかを確認できます。予約処理が遅れているときは、次のような「予約したイベントが遅れています」という項目が表示されます。

「サイトでループバックリクエストが実行可能です」と表示されていなければ、ループバックリクエストが失敗している可能性があります。サイトヘルスの使い方は、こちらの記事も参考にしてください。
WordPressサイトのメンテナンスを行いたいなら、まずはサイトヘルス機能を使うのがおすすめです。 定期検診のようなイメージで、サイトの健康状態をチェックできます。問題があればすぐに対策できるので、安心して運営できます。 当記事では、サイトヘルスの見方や活用方法についてご紹介します。 ...
プラグイン「WP Crontrol」で予約処理を確認する
「WP Crontrol」を使うと、WP-Cronに登録されている処理の一覧や、次に実行される時刻を確認できます。
管理画面から「WP Crontrol」を検索してインストールするか、下のボタンからもダウンロード可能です。プラグインファイルを wp-content/pluginsディレクトリにアップした後、管理画面から有効化してください。
有効化すると、「ツール」→「Cron イベント」で処理の一覧が表示されます。予約投稿には、記事ごとに「publish_future_post」という処理が登録されています。予約時刻を過ぎてもこの処理が残っていれば、WP-Cronが動いていないということです。

処理の下にある「今すぐ実行」をクリックすると、その場で実行できます。
TCDの検証サイトでは、WP Crontrolで「publish_future_post」を一時的に止めて、予約時刻を過ぎるのを待ってみました。すると、投稿一覧の記事は「予約投稿の失敗」に変わり、公開されないままになりました。予約投稿の公開は、WP-Cronの処理が動いて初めて行われることがわかります。
予約投稿が公開されないときの対処法
「予約投稿の失敗」になった記事をすぐに公開する
まずは、公開されなかった記事を公開しましょう。投稿の編集画面で公開日時を現在の日時に変更し、公開し直せば公開されます。WP Crontrolで「publish_future_post」が残っていれば、「今すぐ実行」でも公開できます。
タイムゾーンを確認する
「設定」→「一般」の「タイムゾーン」が「東京」または「UTC+9」になっているか確認しましょう。
ループバックリクエストを妨げている設定を見直す
サイトヘルスでループバックリクエストに問題が出ている場合は、セキュリティプラグインやBasic認証、サーバーのWAFの設定を見直します。一時的にプラグインを停止して、サイトヘルスの結果が変わるかで切り分けると原因を見つけやすくなります。
サーバーのCronでWP-Cronを動かす(確実な方法)
アクセスの有無に左右されずに予約投稿を公開したい場合は、サーバーの「Cron(クーロン)」機能で、WP-Cronを定期的に実行する方法がおすすめです。
まず、wp-config.phpの「/* 編集が必要なのはここまでです */」より上に次の1行を追加して、アクセスをきっかけにしたWP-Cronの実行を止めます。
define( 'DISABLE_WP_CRON', true );
wp-config.phpを編集する前には、必ずバックアップを取りましょう。wp-config.phpの編集方法は、こちらの記事で解説しています。
「wp-config.phpって何?」 「wp-config.phpって編集していいの?」 触るのが少し怖い気持ちも、よくわかります。WordPressの心臓部であるwp-config.phpは、データベース情報やサイトの動作を管理する重要なファイルです。 当記事では、初心者でも安心し...
次に、サーバーのCronで「wp-cron.php」を定期的に実行します。エックスサーバーの場合は、サーバーパネルの「Cron設定」を開き(①)、「Cron設定を追加」をクリックします(②)。

入力欄が表示されたら、次のように設定します。
- 分:*/5(5分ごと)
- 時・日・月・曜日:*
- コマンド:下記のコマンド
/usr/bin/php8.3 /home/サーバーID/ドメイン名/public_html/wp-cron.php >/dev/null 2>&1
「サーバーID」「ドメイン名」はご自身のものに、「php8.3」はサイトで使っているPHPのバージョンに合わせて書き換えてください。PHPのパスは、サーバーパネルの「サーバー情報」で確認できます。
スケジュール(①)とコマンド(②)を入力したら、「追加する」をクリックします(③)。スケジュールの下に「毎日 毎時 5分毎 に実行」と表示されていれば、設定は正しく入力できています。

設定したら、WP Crontrolやサイトヘルスで、予約処理が時刻どおりに実行されているか確認しておくと安心です。
WooCommerceの注文メールなど、プラグインの裏側の処理を担う「Action Scheduler」も、WP-Cronをきっかけに動いています。予約投稿と同じように、アクセスが少ないサイトでは処理が溜まってしまいます。サーバーのCronでWP-Cronを動かしておけば、こうした処理もアクセスに左右されずに実行されます。
Action Schedulerの仕組みと、エラーが出たときの対処法は、こちらの記事で解説しています。
WordPressの管理画面に、ある日突然「予約済みアクション」というメニューが追加されたり、「action_scheduler/migration_hook failed」といった英語のエラーメッセージが表示されて、驚いたことはありませんか? 結論から言うと、これはAction Schedu...
まとめ
「予約投稿の失敗」の正体は、予約処理を担うWP-Cronがうまく動いていないことでした。
- WP-Cronはサイトへのアクセスをきっかけに動くため、アクセスがないと予約投稿が公開されない
- ループバックリクエストの失敗、キャッシュ、WP-Cronの無効化、タイムゾーンの設定ミスも原因になる
- サイトヘルスとWP Crontrolで、予約処理の状態を確認できる
- 確実に公開したいなら、サーバーのCronでWP-Cronを動かす
予約投稿をよく使うサイトほど、一度サーバーのCronを設定しておくと安心です。
WordPressテーマ集











コメント