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 を呼ぶ設定にします。

エラーで止まる時

自動投稿で予約を使う時

記事を自動で作って投稿する場合、まとめて「今すぐ公開」にするより、予約投稿で時間をずらして公開する方が、公開前に確認する時間を取れます。当サイトのAmazon Auto Posts(¥9,000)は、商品情報の取得から記事の生成、公開前の品質チェック、予約投稿までを行う仕組みです。導入の前提はAmazon Auto Posts 導入前に確認することにまとめています。

まとめ

  • "status": "future" と date で予約する。date には +09:00 などの時差を付ける
  • 時差の無い date はサイトのタイムゾーンの時刻。date があると date_gmt は使われない
  • 1分以上先なら予約、1分未満ならすぐ公開。status の指定より日時が優先される
  • 予約の時刻に公開されない時は WP-Cron を疑う