WordPressで日時を扱うときはdate_i18nを使うべし – date関数の罠 –
こんにちは。スタッフのユースケです。
今日はWordPressで日時を扱う時のお話しです。
WordPressで日付を扱っててよくあるのが、投稿日のお話し。
記事を一覧で表示していて、投稿日を出力してるのにいくつかの記事で何も出力されていない!なんて現象が発生し、なんでかなーと思ってたら関数の仕様でしたってケースで、この件については以前、某7Fオーナーが詳しく解説してくれているので、コチラをご覧ください。
さて、今日はそれとはちょっと違って、思わぬところに潜んでいた伏兵?のお話しです。
日付基準で記事を抽出したりなんかしていると、稀に望んでいる記事が出力されないなんてことありません?
1日ずれれば出てくれるし、比較の条件式が間違っているわけでもないし…
そんなとき悪さをしているやつはこいつ「date関数」です!
(まぁ悪いのは自分で、date関数はいつもどおりの動きをしてくれているのですが…)
PHPのdate関数は、ローカルの日付・時刻を書式化してくれるものなのですが、
WordPress内でこの関数を使用すると、UTC(協定世界時)で取得されてしまうのです…
協定世界時って何ぞやってことですが、簡単にいうと「日本時間=協定世界時+9時間」ということなんですが、普段PHPで使ってるときはローカルのタイムスタンプで動いているので、date関数が原因だとは露ほども思わず…
じゃあタイムゾーンをいじろうと管理画面の一般設定を見てみると、すでに「東京」になってる…
なら次はphp.iniかと確認してみるも、ここも「Asia/Tokyo」になってる。そもそもPHPでは上手くいってるんだから、ここじゃないよな…
ではどこかと調べてみたら、どうも「wp-settings.php」ファイル内の下記記述が原因のようです。
// WordPress calculates offsets from UTC. date_default_timezone_set( 'UTC' );
PHPとWordPressでそれぞれにタイムゾーンを持っているために、意図的にWordPress側がやっていることのようですが、コアファイルはいじるべきじゃないし、functions.phpとかでセットし直して他に影響がでても嫌だし、どうしたもんかと。
探してみたらやっぱりありました、WordPressの関数「date_i18n」が!
この関数はローカライズされた書式で日付を取得してくれるもので、これを使うときっちり日本時間を表示してくれます!
詳しくはCodexで確認してみてください。
実際にテンプレートファイル内で使うと、下記のような結果になります。
echo date( 'Y-m-d H:i:s' ); echo date_i18n( 'Y-m-d H:i:s' ); // 出力結果 2015-02-19 05:35:21 2015-02-19 14:35:21
これで日付が変わったのに掲載期間を過ぎた記事が表示されちゃう!なんて事態を回避できますね。
普段何気なく使っているdate関数、これからは意識してdate_i18n関数を使っていきましょう。
いずれ無意識に「date_i18n」と打つようになって、思わぬトラップに引っかかることもなくなるはずです!