OK Desu Ka?

wordpress内の時間を設定する

問題発生

  • 設定→一般→タイムゾーン

管理画面のタイムゾーン設定は、記事の投稿時間などに反映される。
「東京」を選択することで日本時間(JST)に設定される。

しかし、php内で問題が起きる。
phpの日時を扱う関数であるDateTime()から情報を取得してみると…
9時間ずれた協定世界時(UTC)を拾ってきてしまう。

原因

wordpressフォルダ直下「wp-settings.php」内で、日付/時刻関数のタイムゾーン設定を行う箇所があり、協定世界時(UTC)を使うように設定されている。


// WordPress calculates offsets from UTC.
// phpcs:ignore WordPress.DateTime.RestrictedFunctions.timezone_change_date_default_timezone_set
date_default_timezone_set( 'UTC' );
  • wordpressが置いてあるサーバ(OS)上のタイムゾーン設定
  • 管理画面のタイムゾーン設定

php内ではこれらのタイムゾーン設定が適用されない。

対処法

wp_date()を使うと良い。
管理画面のタイムゾーン設定で日時を取得してくれる。

日本時間(JST)は協定世界時(UTC)プラス9時間。
日本時間(JST)を設定する手段はいくつか挙げられるが、何かしらの不具合が起きたりするので公式で推奨しているwp_date()を使おう。

  • DateTime()で取得した協定世界時(UTC)に9時間足して日本時間(JST)を作り出す
    →手間が掛かる
  • date_default_timezone_set設定を「’UTC’」から「’Asia/Tokyo’」にする
    →wordpress公式で非推奨
    wordpressのコアを正しく動かすために必要で、変更してはいけない
    バグの原因
  • wordpressで用意された関数date_i18n()を使う
    →wp_date()と同じ日時を取得してくれるがwordpress 5.3より非推奨
    非推奨となったapi関数は段階的に廃止される
    date_i18n()に置き換わる新しいapi関数がwp_date()
    また、パラメータで日時を渡すとwp_date()とは違う挙動を見せる

//現在日時の取得
$objDate = new DateTime();
//日時の書式変更
echo $objDate->format('Y/m/d H:i:s');	// 2023/01/14 03:34:56 協定世界時(UTC)
echo date_i18n('Y/m/d H:i:s');		// 2023/01/14 12:34:56 日本時間(JST)
echo wp_date('Y/m/d H:i:s');		// 2023/01/14 12:34:56 日本時間(JST)

//日時を指定した場合、wp_date()は管理画面のタイムゾーン設定である日本時間(JST)分の9時間が足される
echo date_i18n('Y/m/d H:i:s', strtotime('20230102 11:22:33'));	// 2023/01/02 11:22:33
echo wp_date('Y/m/d H:i:s', strtotime('20230102 11:22:33'));	// 2023/01/02 20:22:33