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
ディスカッション
コメント一覧
まだ、コメントがありません