WordPressでTimezoneが9時間ずれる問題

wordpress_time9

このブログはWordPressで書いていますが、エラーがあると管理画面上部にダイアログが出ます。

ここ最近、プラグインの”WP to Twitter”に
{¨twitterとあなたのserver-timeが9時間ずれていますよ¨}
というエラーがEnglishで出るようになりました。

また、COUNTERIZEⅡというページカウンタープラグインのカウント数も本来なら0時に前日と切り替わる筈なのですが、午前9時になるまで前日のままクリアーされず、当日のカウントは午前9時から翌日8時59分までという変な区切りになっていることにも気付きました。

対処方法がわかりましたので備忘録として書いて置くことにします。

原因はwp2.9からPHPのdefault_timezoneがUTC(協定世界時)になった為でした。

通常、日本国内のサーバーでPHPを使う場合、 php.ini のタイムゾーン設定は

date.timezone="Asia/Tokyo"

とすることで問題なく動作しますが、 wp-settings.php が上書きでこれを邪魔しているようです。

対処法はふたつあります。
ひとつは、wp-settings.php の36, 37行目をコメントアウトする方法
(php.iniのデフォルト設定が適応される)

// Set default timezone in PHP 5.
#if ( function_exists( 'date_default_timezone_set' ) )
#  date_default_timezone_set( 'UTC' );

もうひとつは上と同じ箇所の”UTC”の後に+9を付け加えることで回避できます。

// Set default timezone in PHP 5.
if ( function_exists( 'date_default_timezone_set' ) )
    date_default_timezone_set( 'UTC+9' );

(※wp-setting.phpの場所はWPインストールフォルダ直下です)

どちらのやり方も変更したら元のファイルに上書きします。

【2012-12-10 追記】

WordPressをバージョンUPしたところ、またしても元に戻ってしまいました。
毎回変更を加えるのも面倒なのでテーマの function.php に

date_default_timezone_set( ‘Asia/Tokyo’ );

を書き加えることで退避するようにしました。

【2014-03-02 追記】
WordPressでは、ローカル日時を取得する場合 date() の代わりに date_i18n() を使用します。

例:< ?php echo date_i18n( $dateformatstring, $unixtimestamp, $gmt ) ?>

関数リファレンス/date i18n – WordPress Codex 日本語版に解説されています。
この記事はあくまでも回避策です。9時間ずれているプラグインのコードはdate関数にこのdate_i18n() を使用していません。コードを書き換えれば9時間のズレは解消できます。
(※date_i18n()はwp-includes/function.phpにて定義されています。)

【2015/10/18 追記】
依頼されているWPテーマで投稿時刻やコメント欄に「◯◯時間前に投稿(コメント)」と出るタイプがあるのですが、やはり9時間ずれて表示されていました。上記とダブりますがテーマのfunction.phpに以下のようにデフォルトタイムゾーンを追記して対処しました。
今のところ問題なく動作しています。
wp-function

【2017-03-23 追記】
最近のWordPressのバージョンアップにより上記問題は解消されました。
テーマのfunction.phpでdate_default_timezone_set( ‘Asia/Tokyo’ ); を書き加えていましたが、削除しました。そのままだと9時間進んでしまいます。