WordPressのREST APIで予約投稿|dateの時差
WordPressのREST APIで予約投稿するには、POST /wp-json/wp/v2/posts に"status": "future" と、公開したい日時をdate で送ります。date に時差(+09:00 など)を付けない時は、WordPressの設定のタイムゾーンの時刻として扱われます。
「予約したはずが、すぐ公開された」「9時間ずれた」という失敗の多くは、この時刻の扱いが原因です。WordPress本体のソースコード(6.8)で、予約になる条件を確かめました。
(確認環境:WordPress 6.8 のソースコード。wp-includes/rest-api.php の rest_get_date_with_gmt()、class-wp-rest-posts-controller.php、wp-includes/post.php の wp_insert_post() を読んで確認しています)
予約投稿のリクエスト
POST https://example.com/wp-json/wp/v2/posts
Content-Type: application/json
Authorization: Basic (ユーザー名:アプリケーションパスワード)
{
"title": "記事のタイトル",
"content": "本文",
"status": "future",
"date": "2026-10-10T07:00:00+09:00"
}
認証には、WordPressの「アプリケーションパスワード」を使います。作り方はWordPressに外部から投稿する方法にあります。
date と date_gmt の扱い(ソースで確認)
| 送り方 | WordPressの解釈 |
|---|---|
date に時差なし(2026-10-10T07:00:00) |
サイトのタイムゾーンの時刻として読み、そこからUTCを計算する |
date に時差あり(+09:00 や Z) |
時差を使ってUTCに直し、そこからサイトの時刻を計算する |
date_gmt だけを送る |
UTCとして読み、そこからサイトの時刻を計算する |
date と date_gmt の両方を送る |
date だけが使われる(date_gmt は見ない) |
rest_get_date_with_gmt() は、文字列の末尾に Z か +09:00 のような時差があるかを先に調べ、無ければサイトの時刻として扱います。投稿の作成処理では date が送られていれば date を使い、date_gmt はその「それ以外の場合」でしか読まれません。
よくある「9時間ずれる」原因
WordPressの「設定」→「一般」のタイムゾーンがUTCのままのサイトに、日本時間のつもりで時差なしの date を送ると、UTCの時刻として読まれ、日本時間では9時間後に公開されます。逆に、日本時間の値を date_gmt に入れると9時間早くなります。
時差を付けた date を送るのが一番確実です。サイトのタイムゾーンの設定に左右されません。
予約になる条件:1分以上先かどうか
wp_insert_post() では、保存の直前に次の判定をしています。
"status": "publish"でも、公開日時(UTC)が今より1分以上先なら、自動で予約(future)になる"status": "future"でも、公開日時が今から1分未満(過去を含む)なら、すぐ公開(publish)になる
「予約したのに、すぐ公開された」場合は、送った日時が(時差の解釈も含めて)過去になっていなかったかを確かめてください。レスポンスの status と date_gmt を見れば、WordPressがどう解釈したかが分かります。
予約の時刻に公開されない時(WP-Cron)
予約した投稿は、WordPressの予定表(WP-Cron)に「この時刻に公開する」と登録されます(_future_post_hook())。公開の処理では、時刻が来ていなければ予定を入れ直し、来ていれば公開します(check_and_publish_future_post())。
WP-Cron は、サイトにアクセスがあった時に動く仕組みです。アクセスがほとんど無いサイトや、WP-Cron を止めている(DISABLE_WP_CRON)サイトでは、予約の時刻を過ぎても公開されないことがあります。その場合は、サーバーのcronから定期的に wp-cron.php を呼ぶ設定にします。
エラーで止まる時
- 401:認証の失敗。アプリケーションパスワードとユーザー名を確認する(WordPress自動投稿でよくあるエラー)
- 403(rest_cannot_publish):そのユーザーに公開の権限が無い。ソースでは、
futureもpublishと同じ「公開の権限」を確認している - 403(サーバー側):サーバーのWAFや国外アクセス制限で止められている(エックスサーバーでREST APIが403になる時の確認)
自動投稿で予約を使う時
記事を自動で作って投稿する場合、まとめて「今すぐ公開」にするより、予約投稿で時間をずらして公開する方が、公開前に確認する時間を取れます。当サイトのAmazon Auto Posts(¥9,000)は、商品情報の取得から記事の生成、公開前の品質チェック、予約投稿までを行う仕組みです。導入の前提はAmazon Auto Posts 導入前に確認することにまとめています。
まとめ
"status": "future"とdateで予約する。dateには+09:00などの時差を付ける- 時差の無い
dateはサイトのタイムゾーンの時刻。dateがあるとdate_gmtは使われない - 1分以上先なら予約、1分未満ならすぐ公開。status の指定より日時が優先される
- 予約の時刻に公開されない時は WP-Cron を疑う


