WordPressタイムゾーン設定を取得する方法は?
質問
WordPress管理者に設定されたタイムゾーンを取得する方法を誰かが教えてもらえますか?
たとえば、ブログが東部時間に設定されている場合、印刷するにはこの正確な文字列が必要です。
米国/東
これは、私のテーマでfunctions.phpに存在する関数用です。
解決
gmt_offsetが必要な場合
<?php echo get_option('gmt_offset'); ?>
これにより、整数のようになります 2または-2.
そして、TimeZone文字列が必要な場合
<?php echo get_option('timezone_string'); ?>
これにより、ような文字列が表示されます アメリカ/インディアナポリス
他のヒント
不幸な状況は、実際に2つの異なるオプションがあることです。
- 新しい
timezone_string
, 、PHP -Styleタイムゾーンを節約します。 - 古い
gmt_offset
, 、数時間で数値フロートオフセットを保存します。
しかし、新しい環境では timezone_string
実際に オーバーライド gmt_offset
, 、後者によって返される値は、前者に基づいています。しかし 反対 真実ではありません - gmt_offset
while timezone_string
空です。
私はこれらのことにかなりの時間を費やしてきました、そして私が私の中で実装した最新のテイク WpDateTime
図書館 フォローしています:
class WpDateTimeZone extends \DateTimeZone {
/**
* Determine time zone from WordPress options and return as object.
*
* @return static
*/
public static function getWpTimezone() {
$timezone_string = get_option( 'timezone_string' );
if ( ! empty( $timezone_string ) ) {
return new static( $timezone_string );
}
$offset = get_option( 'gmt_offset' );
$hours = (int) $offset;
$minutes = abs( ( $offset - (int) $offset ) * 60 );
$offset = sprintf( '%+03d:%02d', $hours, $minutes );
return new static( $offset );
}
}
これにより、情報がすべて利用可能である限り、可能なすべての場合に意味のあるタイムゾーンオブジェクトをインスタンス化しようとします。
を確認します オプションリファレンスページ. 。オプション gmt_offset
整数を返します。たとえば、TimeZoneが東部時間(America/New_Yorkなど)に設定されている場合、 gmt_offset
-5である必要があります。
あなたがのような文字列を手に入れるとは思わないでください 米国/東 必要なすべての文字列を配列に保存せず、それらを参照してください。 PHPを使用して、TimeZoneの略語を取得できます。 EST(東部基準時);また、必要な文字列が付いた配列にそれらの値が保存されている場合は、それらを調べることができます。
<?php date_default_timezone_set(get_option('timezone_string'));
echo date('T'); // will give you three-character string like "EST"
$timezones = array (
'EST' => 'US/Eastern',
'CST' => 'US/Central',
// etc, etc, etc.
);
echo $timezones [ date('T') ]; // should be what you want.
?>
Bainternetに追加するには(コメントできないため、これを答えとして追加しています。WP開発スタックで50ポイント未満のポイントがあります)。
WordPressは、一般的な設定でTimeZone文字列を選択した場合にのみTimeZone文字列を保存します。 UTFの選択は、リスト内のデフォルトですが、TimeZone文字列までスクロールできます。タイムゾーン文字列を設定すると、UTFとタイムゾーン文字列の両方が設定されます。それらは同じです(つまり、TimeZone文字列TimeZoneを選択すると、UTFが新しいゾーンにリセットされます)。
(WordPress 4)
いくつかのオプションがありますが、どれも本当にうまくいくものはありません。これはWordPressのバグであり、サイトをUTCに設定しない限り時間が間違っているため、それは本当にひどいです...これは混乱しており、常に可能ではありません。
この次のコードは、GMT番号のオフセットではなく、名前付き都市としてTimeZone(settings-> general)を選択した場合にのみ機能すると思います。私はこれをテストしていませんが、それは非常に可能です get_option('gmt_offset')
いつ設定されますか get_option('timezone_string')
ではありません。
date_default_timezone_set(get_option('timezone_string'));
これの欠点は、WordPressがMySQLタイムスタンプを作成するときにPHPがUTCに設定されていることを想定していることです。そのため、タイムゾーンを切り替えるたびにデータベースを少し台無しにすることができます。言うまでもなく、他のWPプラグインは、PHP環境が常にUTCにあると想定する場合があります。
したがって、正しい時間が必要な場合は、タイムスタンプをUTCに強制することができます。
get_post_time('c', true); //should work for non-post objects.
残念ながら、正しいですが、TimeZoneがUTCに設定されます。
そして、あなたはできないことに注意してください 両方とも 「真の」フラグを使用します と デフォルトのtimezone_set関数。
どれでも ちゃんとした 解決策は両方を説明するコードスニッペットになるだろう gmt_offset
と timezone_string
それらを使用して、いくつかの入力にタイムゾーンを設定します。 WPは、MySQLタイムスタンプを実行するときにPHPがUTCに設定されていることを想定しており、他のプラグインを破る可能性があります。
そのような解決策が1つあります https://www.skyverge.com/blog/down-the-rabbit-hole-wordpress-andtimezones/ しかし、再びこれはバグなので、 get_post_time($date_format, TRUE)
実際に正しいタイムスタンプを取得するコード。
WordPressがTimeZone文字列をオプションテーブルに保持するという事実を考えると、WordPressサイトで適切なタイミングを取得するオブジェクト指向の方法を使用できます。
$tz = new DateTimeZone(get_option('timezone_string'));
$dt = new DateTime("now", $tz);
$page .= "<p> DateTime " . $dt->format("Y-m-d H:i:s") . "</p>";