WordPressで予約投稿を設定したのに、時間になっても記事が公開されていない。投稿一覧を見ると、日付の欄に赤字で「予約投稿の失敗」と表示されている。そんな経験はありませんか?

この「予約投稿の失敗」の多くは、WordPressの予約処理を担う「WP-Cron」という仕組みがうまく動いていないことが原因です。

本記事では、予約投稿が公開される仕組みと、公開されない主な原因、確認方法、対処法を、TCDの検証サイトで実際に「予約投稿の失敗」を起こして確かめた結果とあわせて解説します。


WordPressで記事販売ができる「YOMERU」
記事を、そのまま収益に。
WordPressサイトで記事の有料販売ができる
無料のプラグイン「YOMERU」。

「予約投稿の失敗」とは

「予約投稿の失敗」は、予約した日時を過ぎても記事が公開されなかったときに、投稿一覧の日付の欄に赤字で表示されるステータスです。

投稿一覧に表示された「予約投稿の失敗」

記事は「予約済み」のまま止まっていて、サイトには表示されていません。このまま放っておいても、自動で公開されるとは限らないので注意しましょう。

予約投稿が公開される仕組み(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やループバックリクエストに問題がないかを確認できます。予約処理が遅れているときは、次のような「予約したイベントが遅れています」という項目が表示されます。

サイトヘルスの「予約したイベントが遅れています」

「サイトでループバックリクエストが実行可能です」と表示されていなければ、ループバックリクエストが失敗している可能性があります。サイトヘルスの使い方は、こちらの記事も参考にしてください。

プラグイン「WP Crontrol」で予約処理を確認する

「WP Crontrol」を使うと、WP-Cronに登録されている処理の一覧や、次に実行される時刻を確認できます。

管理画面から「WP Crontrol」を検索してインストールするか、下のボタンからもダウンロード可能です。プラグインファイルを wp-content/pluginsディレクトリにアップした後、管理画面から有効化してください。

WP Crontrol

有効化すると、「ツール」→「Cron イベント」で処理の一覧が表示されます。予約投稿には、記事ごとに「publish_future_post」という処理が登録されています。予約時刻を過ぎてもこの処理が残っていれば、WP-Cronが動いていないということです。

WP Crontrolの「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の編集方法は、こちらの記事で解説しています。

次に、サーバーのCronで「wp-cron.php」を定期的に実行します。エックスサーバーの場合は、サーバーパネルの「Cron設定」を開き(①)、「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分毎 に実行」と表示されていれば、設定は正しく入力できています。

Cron設定の入力例

設定したら、WP Crontrolやサイトヘルスで、予約処理が時刻どおりに実行されているか確認しておくと安心です。

WooCommerceの注文メールなど、プラグインの裏側の処理を担う「Action Scheduler」も、WP-Cronをきっかけに動いています。予約投稿と同じように、アクセスが少ないサイトでは処理が溜まってしまいます。サーバーのCronでWP-Cronを動かしておけば、こうした処理もアクセスに左右されずに実行されます。

Action Schedulerの仕組みと、エラーが出たときの対処法は、こちらの記事で解説しています。

まとめ

「予約投稿の失敗」の正体は、予約処理を担うWP-Cronがうまく動いていないことでした。

  • WP-Cronはサイトへのアクセスをきっかけに動くため、アクセスがないと予約投稿が公開されない
  • ループバックリクエストの失敗、キャッシュ、WP-Cronの無効化、タイムゾーンの設定ミスも原因になる
  • サイトヘルスとWP Crontrolで、予約処理の状態を確認できる
  • 確実に公開したいなら、サーバーのCronでWP-Cronを動かす

予約投稿をよく使うサイトほど、一度サーバーのCronを設定しておくと安心です。

世界最高品質のデザインの
WordPressテーマ集
WordPressテーマ「ISSUE」
WordPressテーマ「ISSUE」
人材不足を解決する求人採用サイトを。
WordPressテーマ「SEEED」
WordPressテーマ「SEEED」
Webサービスを販売するLP型テーマ。
WordPressテーマ「GENESIS」
WordPressテーマ「GENESIS」
スタイリッシュな企業サイトの決定版。
WordPressテーマ「SOLARIS」
WordPressテーマ「SOLARIS」
一流の企業のための一流の企業サイトを。