WordPress で投稿を予約する方法
WordPressの投稿を予約し、Missed Scheduleを修正し、WP-Cronを実サーバーcronで設定して投稿を時間どおりに公開します。
WordPress で投稿を予約するには、投稿の 設定 → 概要 パネルを開き、公開: 今すぐ の日付をクリックして将来の日時を選択し、公開 の代わりに表示される 予約投稿 ボタンをクリックします。
ここまでは 1 分もかかりません。時間がかかるのは、午前 2 時に予約したはずの投稿が朝食の時間になってもそのまま残っていて、赤字で 公開予約を逃しました と表示されている理由を突き止める作業です。
その原因は、WordPress が予約タスクを実行する仕組みにさかのぼります。実際のタイマーではなく、ページの読み込みをきっかけに動作しているのです。本ガイドでは、まず素早い操作手順を紹介し、続いて WP-Cron の仕組みと、公開予約の失敗を根本的に解消するサーバー cron による恒久的な対処法を解説します。
要点
- WordPress はサイトのタイムゾーンで投稿を予約し、デフォルトは UTC です。予約する前に 設定 → 一般 で正しいタイムゾーンを設定しないと、投稿は現地時間とは異なる時刻に公開されます。
- WordPress は実際のシステムタイマーを使いません。WP-Cron という擬似 cron を使い、誰かがページを読み込んだときにのみ実行期限の来たタスクをチェックするため、トラフィックの少ないサイトやキャッシュが強く効いているサイトでは予約時刻を完全に逃すことがあります。
- 恒久的な対処法は、5〜15 分ごとに
wp-cron.phpへリクエストを送る実際のサーバー cron を稼働させ、その上でwp-config.phpにdefine('DISABLE_WP_CRON', true);を追加することです。必ずこの順序で行ってください。逆にすると予約タスクが何の通知もなく停止します。 - MWW Scheduled Post Trigger のようなプラグインは、公開予約を逃した投稿を「遅延が発生した後に」公開するだけです。サーバー cron はそもそも逃さないようにします。
- Kinsta や DreamHost の DreamPress といったマネージドプラットフォームでは、すでにサーバーレベルの cron(通常 15 分間隔)が動作しているため、通常は何も設定する必要がありません。
まずタイムゾーンを設定する
WordPress はサイトのタイムゾーンで投稿を予約し、デフォルトは UTC です。予約する前に 設定 → 一般 で正しいタイムゾーンを設定しないと、投稿は現地時間とは異なる時刻に公開されてしまいます。新規インストールでは時刻が協定世界時で保存されるため、「午前 8:00」に予約した投稿は、自分の所在地を WordPress に伝えていない限り UTC の午前 8:00 に公開されます。設定 → 一般 に移動し、自分のタイムゾーンにある都市を選択して(都市ベースの項目は固定の UTC オフセットとは異なり、サマータイムを自動的に処理します)、保存します。これは何かを予約する前に一度だけ行えば済みます。MWW Scheduled Post Trigger プラグイン のインストール手順でも最初にこの設定を確認するよう指示されており、FAQ でも投稿が公開されない場合はこの設定に戻って確認するよう案内されています。
Discover how at OpenReplay.com.
ブロックエディターで投稿を予約するには?
ブロックエディターで投稿を予約するには、設定 → 概要 パネルを開き、公開: 今すぐ の日付をクリックして将来の日時を選択し、公開 の代わりに表示される 予約投稿 ボタンをクリックします。WordPress はその時刻に自動的に投稿を公開します。確認方法としては、将来の日付が設定されている場合、上部のボタンが 公開 ではなく 予約投稿 と表示されます。
クラシックエディター: 公開 メタボックスで すぐに公開する の横にある 編集 をクリックし、日時を入力して OK をクリックしてから、予約投稿 ボタンをクリックします。
固定ページも同じ手順です。日付のコントロールは、どちらの投稿タイプでも同じパネル内にあります。
予約の管理、予約解除、繰り上げ公開
予約中のすべての投稿を確認するには、投稿 → 投稿一覧 に移動し、リストの上にある 予約済み フィルターをクリックします。そこから任意の項目を編集、繰り上げ公開、予約解除できます。
- 繰り上げ公開: 投稿を開いて 公開 をクリックします。予約時刻に関係なく、すぐに公開されます。
- 予約解除: 投稿のステータスを 下書き に戻します。これにより公開せずにキューから外せるので、編集を続けて後で改めて予約できます。(日付を「今」に設定して公開ボタンを押すのは 繰り上げ公開 であり、予約解除ではありません。)
- すでに公開済みの投稿への編集を予約する: デフォルトではできません。公開中の投稿への変更は、保存した時点で公開されてしまうためです。更新をキューに入れるには、PublishPress Revisions のようなプラグインを使います。リビジョンをステージングし、スケジュールに従って公開してくれます。
WordPress の予約投稿はなぜ失敗するのか?
WordPress は実際のシステムタイマーを使いません。WP-Cron という擬似 cron を使い、誰かがページを読み込んだときにのみ実行期限の来たタスクをチェックします。そのため、トラフィックの少ないサイトでは午前 2:00 に予約した投稿が、次の訪問者が来るまで公開されないことがあります。プラグインハンドブックは、それが実際に何を意味するのかを率直に説明しています。午後 2 時にジョブを予約しても、午後 5 時まで訪問者が来なければ、ジョブは午後 5 時までそのまま放置されるのです。ようやくトリガーが発火したときには投稿はすでに期限を過ぎており、WordPress は赤字で 公開予約を逃しました と表示します。
本番環境の 2 つの条件がこの問題を悪化させます。
- トラフィックが少ない、またはまったくない。 SpinupWP の解説 にあるとおり、予約イベントは誰かが訪問したときにのみ発火するため、数時間にわたってアクセスがないサイトでは、その時間帯に予定されていたものすべてを逃します。趣味のブログでの深夜の投稿は典型的な被害例です。
- 強力なフルページキャッシュ。 キャッシュされたページは PHP を実行せずに静的 HTML として配信されるため、WP-Cron はまったく実行されません。トラフィックの大部分をキャッシュから配信していると WordPress はほとんど実行されず、アクセスの多いサイトでも予約イベントの発火が止まることがあります。パフォーマンスをチューニングしたサイトでよく見られる原因です。
恒久的な対処法: 擬似 cron を無効化し、実際のサーバー cron を実行する
恒久的な対処法は、固定タイマーで実際の cron を実行し、その上でページ読み込みによるトリガーを無効化することです。これは回避策ではなく公式に文書化されたアプローチであり、プラグインハンドブックには、タスクを時間どおりに実行しなければならない場合について、まさに WP-Cron をシステムのタスクスケジューラーにフックする方法 が記載されています。
以下の手順は必ずこの順序で行ってください。代替の cron が動作する前に WP-Cron を無効化すると、予約タスクはエラーも警告もなく発火しなくなります。投稿、バックアップ、更新チェックのすべてが、気づくまで停止したままになります。
ステップ 1: 実際の cron ジョブを追加する。 cPanel の Cron Jobs モジュール、またはサーバーの crontab で、一定間隔で wp-cron.php へリクエストを送ります。信頼できるデフォルト値は 5〜15 分ごとです。この wget -q -O - の書き方は Kinsta のものです。
*/15 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
*/15 は 15 分ごとの実行を意味します。example.com は自分のドメインに置き換えてください。ハンドブックの標準的な書き方では、同じ間隔で wget --delete-after http://YOUR_SITE_URL/wp-cron.php を使用しています。どちらでも動作するので、ホストがサポートしている方を選んでください。
ステップ 2: ページ読み込みによるトリガーを無効化する。 サーバー cron を設定したら、wp-config.php の /* That's all, stop editing! */ コメントより上に次の行を追加します。
define('DISABLE_WP_CRON', true);
応急処置としてのプラグイン。 MWW Scheduled Post Trigger や Missed Scheduled Posts Publisher のようなプラグインは、すでに遅延が発生した 後に 投稿を公開するだけです。MWW 自身の FAQ でも、cron が発火しない理由をユーザーとホスティング事業者が突き止めるまでの応急処置であると説明されています。実際のサーバー cron は、事後に対応するのではなく、そもそも公開予約を逃さないようにします。一部のプラグインは特定のホスト構成で動作しないため、単一のプラグインを確実な手段として頼るのは避けてください。
| 応急処置プラグイン | 実際のサーバー cron(推奨) | |
|---|---|---|
| 動作内容 | すでに逃した 投稿を次回の訪問時/実行間隔で公開 | トラフィックに関係なく固定タイマーで wp-cron.php を発火 |
| 適した用途 | トラフィックの少ない趣味のブログ、素早い問題解消 | 本番環境、キャッシュ利用サイト、低トラフィックサイト、マルチサイト |
| 失敗を防げるか? | 不可(事後対応) | 可能(事前予防) |
| セットアップ | インストールして有効化 | wp-config.php の編集 + cron エントリーの追加(またはマネージドホストの利用) |
マネージドホスト。 Kinsta は全サイトで 15 分ごとにサーバーレベルの cron を実行しており、DreamHost の DreamPress はデフォルトで WP-Cron を無効化し、同じ間隔のシステム cron に置き換えています。こうしたプラットフォームでは、通常は何も設定する必要がありません。WP-Cron を無効化する前に、利用中のホストのドキュメントを確認してください。
WP-CLI での確認と強制実行。 SSH が利用できるサーバーでは、wp cron event list で予約イベントとその次回実行時刻を確認でき、wp cron event run --due-now で期限切れのすべてのイベントを即座に強制実行できます。これは、止まっている投稿が公開されるかを確認する最速の方法です。
まとめ
WordPress で投稿を予約するのは 1 分程度の操作ですが、それらの投稿を確実に公開し続けるのはサーバー側の課題です。設定 → 一般 でタイムゾーンを設定し、概要 パネルから投稿を予約しましょう。予約投稿に 公開予約を逃しました と表示されるようであれば、ページ読み込みによる擬似 cron に頼るのはやめてください。5〜15 分ごとに wp-cron.php を呼び出す実際のサーバー cron を設定し、その上で define('DISABLE_WP_CRON', true); を追加します。このたった 1 つの変更で、予約公開はベストエフォートから信頼できる仕組みへと変わります。アクセスの少ないサイトやキャッシュを効かせたサイトであっても同様です。
よくある質問
Kinsta や DreamHost のようなマネージド WordPress ホストを使っている場合、WP-Cron を無効化すべきですか?
いいえ。Kinsta や DreamHost の DreamPress のようなマネージドプラットフォームでは、通常は自分で WP-Cron を無効化する必要はありません。これらのプラットフォームでは、トラフィックに関係なく wp-cron.php を発火させるサーバーレベルの cron(通常 15 分間隔)がすでに動作しているためです。まずはホストのドキュメントを確認してください。多くのマネージドプランではこれが自動的に設定されており、重ねて設定してもメリットはありません。ホストがサーバー cron を実行していないと確認できた場合にのみ、wp-config.php に手を加えてください。
公開予約の失敗に対応するプラグインと、実際のサーバー cron の違いは何ですか?
MWW Scheduled Post Trigger や Missed Scheduled Posts Publisher のような公開予約の失敗に対応するプラグインは、すでに遅延が発生した後に、次のページ読み込みや実行間隔のタイミングで反応して投稿を公開するだけです。一方、実際のサーバー cron はトラフィックに関係なく固定タイマーで wp-cron.php を発火させ、そもそも失敗が起きないようにします。プラグインはトラフィックの少ない趣味のブログ向けの素早い応急処置であり、サーバー cron は本番環境、キャッシュ利用サイト、マルチサイトのための事前予防的な解決策です。
予約した投稿が違う時刻に公開されたのはなぜですか?
WordPress を新規インストールすると時刻は協定世界時(UTC)で保存されるため、「午前 8:00」に予約した投稿は、設定 → 一般 でタイムゾーンを設定していない限り UTC の午前 8:00 に公開されます。固定の UTC オフセットではなく都市ベースの項目を選んでください。都市ベースの項目はサマータイムに自動で対応します。何かを予約する前に一度これを設定しておけば、以降のすべての投稿が現地時間に従います。
予約した投稿が実際に公開されるかどうかを確認する方法はありますか?
SSH アクセスが可能なサーバーでは、wp cron event list を実行してすべての予約イベントとその次回実行時刻を確認し、続いて wp cron event run --due-now を実行して期限切れのすべてのイベントを即座に実行させます。この WP-CLI の 2 つのコマンドは、止まっている投稿が公開されるかを確認し、WP-Cron がそもそも発火しているかを診断する最速の方法です。SSH が使えない場合は、WP Crontrol プラグインが同じイベント一覧を管理画面から確認できるようにしてくれます。
フルページキャッシュは公開予約の失敗を引き起こしますか?
はい。強力なフルページキャッシュは、公開予約の失敗のよくある原因であり、見落とされがちです。キャッシュされたページは PHP を実行せずに静的 HTML として配信されるため、トラフィックが多い場合でもそれらのリクエストでは WP-Cron が実行されません。トラフィックの大部分をキャッシュから配信していると WordPress はほとんど実行されず、予約イベントの発火が止まります。対処法はトラフィックの少ないサイトと同じです。ページ読み込みによるトリガーを無効化し、実際のサーバー 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