• 解決済 4017B

    (@4017b)


    WordPressの関数である get_lastpostmodified() を使って、
    サイト全体の最終更新日の取得し表示させたいと思っています。
    以下の様なローカル関数を、テーマ内のfunction.phpに追記しました。

    function my_lastPostModified() {
      $timezone = 'UTC+09';
      $lastModTime = mysql2date('Y/m/d. H:i', get_lastpostmodified($timezone), false);
      printf( $lastModTime );
    }

    表示させたい部分に <?php my_lastPostModified()?> と記述して使った所、何も表示されませんでした。
    $timezone の部分を完全に削除して、

    function my_lastPostModified() {
      $lastModTime = mysql2date('Y/m/d. H:i', get_lastpostmodified(), false);
      printf( $lastModTime );
    }

    ~としたところ、UTCでのタイムゾーンでのみ正常に表示されます。
    色々試したのですが、UTCでしか正常に表示されません。
    WordPressの英語版のドキュメントにはタイムゾーンを指定出来る様に書いてあるのですが…設定方法が全く分りません。

    仕方がないので自分なりに試行錯誤し、以下の様なコードにした所、日本時間で表示出来ました。

    function my_lastPostModified() {
      $lastPostModTime = get_lastpostmodified();
      $lastTimeNum = strtotime ( $lastPostModTime ) +32400;
      $lastModTime = gmdate('Y/m/d. H:i', $lastTimeNum);
      printf( $lastModTime );
    }

    …そこで質問というか疑問なのですが。
    自分が取った手段(コード)は一般的な方法なのでしょうか?それとも他にもう少しスマートなやり方があるのでしょうか?
    若しくはWordPress内部にちゃんとした関数みたいな物があって、それを見落としてるだけなのでしょうか?

    自分としては、get_lastpostmodified('UTC+09') ~みたな簡潔なコードで取得出来ない物かと思案してます。

    >使用環境:
    ・PHP 5.1.6 (Linux鯖)
    ・WordPress 3.0.0

12件の返信を表示中 - 1 - 12件目 (全12件中)
  • 関数の説明を見ると

    $timezone
        (string) (optional) The location to get the time. Can be 'gmt', 'blog', or 'server'.
    
            Default: 'server'

    となっています。

    ですので、gmtかサーバのローカルタイムの選択です。
    サーバのローカルタイムがgmtだったら取れませんね。
    mysql2date(‘Y-m-d\TH:i:s+09:00′, get_lastpostmodified() )
    とか使えるんかな・・・テーマ内で

    こんにちは、

    参考:http://ja.forums.wordpress.org/topic/2440?replies=10

    function my_lastPostModified() {
    
     date_default_timezone_set('Asia/Tokyo');
    
     $lastModTime = mysql2date('Y/m/d. H:i', get_lastpostmodified(), false);
     printf( $lastModTime );
    }

    では、どうですか?

    トピック投稿者 4017B

    (@4017b)

    早速の回答、ありがとうございます。

    kvexさんの方法だと、単純にUTC(GMT)の時間に「+09:00」という文字列が付加されて表示されます。
    nobitaさん提示の方法も既に実験済みでして。結果はやはりUTC(GMT)の時間が表示されます。

    お二方の環境ではどの様な結果が得られているのでしょうか?
    結果芳しくないのは、もしかしてサーバ環境に依存しているのでしょうか??

    何故か自分の環境だと、date_default_timezone_set()date_default_timezone_get() がうまく働いてない感じです。

    P.S.
    get_lastpostmodified() 自体にタイムゾーンのオプションが元々、2つしか無かったとは盲点でした…!
    しかし自分がタイムゾーンに 'server' を指定した時にはUTCで表示されました。
    サーバ自体のタイムゾーンは、ErrorLog等で吐き出されている分で確認する限りには日本時間の様なのですが…??

    引き続き何か代替方法などがありましたら、手法も get_lastpostmodified() には拘りませんので、ご教授願います。

    私の環境では、

    functions.php
    date_default_timezone_set  なし
    2010/08/31. 05:30
    date_default_timezone_set  あり
    2010/08/31. 14:30

    date_default_timezone_setは、関数の外側でも、同じ動作です。(先頭)

    関数の前後で、date_default_timezone_getすると、

    UTC 2010/08/31. 14:30 Asia/Tokyo となります。

    wp-config.phpでセットすると、結果は異なるようです。

    Apache 1.3.37
    PHP  5.2.5
    wordPress 3.01 network

    (PHP 4, PHP 5 strtotime)
    echo date("Ymd h:i:s",strtotime("+9 hour".get_lastpostmodified()));
    20100831 02:30:43 でした

    http://wpdocs.sourceforge.jp/Formatting_Date_and_Timeに

    日付をローカライズする時には、date_i18n()を使えと書いてあったので、やってみたのですが、date_default_timezone_set('Asia/Tokyo') ありで、

    echo date("Ymd h:i:s",strtotime("+9 hour".get_lastpostmodified()));

    と書くと、へんなことになる模様なので、何かのお役に立てばと思い、貼り付けておきます。

    date_default_timezone_set('Asia/Tokyo');
    function my_lastPostModified() {
     $lastModTime = mysql2date('Y/m/d. H:i', get_lastpostmodified(), false);
     printf( $lastModTime );
    }
    echo my_lastPostModified();
    echo date("Ymd h:i:s",strtotime(get_lastpostmodified()));
    //echo date("Ymd h:i:s",strtotime('+'.get_option( 'gmt_offset' ) .
    ' hour '.get_lastpostmodified()));
    echo date("Ymd h:i:s",strtotime('+9 hour '.get_lastpostmodified()));
    echo date("Ymd h:i:s",strtotime(get_lastpostmodified()));
    echo date_i18n( "Y m d G i",strtotime(get_lastpostmodified()));
    echo get_option( 'gmt_offset' );
    
    結果
    //date_default_timezone_set あり
    /*
    2010/08/31. 14:30
    20100831 02:30:43
    20100831 11:30:43
    20100831 02:30:43
    2010 08 31 14 30
    9
    */
    //date_default_timezone_set なし
    /*
    2010/08/31. 05:30
    20100831 05:30:43
    20100831 02:30:43
    20100831 05:30:43
    2010 08 31 5 30
    9
    */
    トピック投稿者 4017B

    (@4017b)

    色々とありがとうございます。
    自分がnobitaさん提示のサンプルコードを実験した結果ですが…

    function my_lastPostModified() {
      $lastModTime = mysql2date('Y/m/d. H:i T', get_lastpostmodified(), false);
      printf( $lastModTime );
    }
    echo my_lastPostModified();
    echo date("Ymd h:i:s",strtotime(get_lastpostmodified()));
    echo date("Ymd h:i:s",strtotime('+9 hour '.get_lastpostmodified()));
    echo date("Ymd h:i:s",strtotime(get_lastpostmodified()));
    echo date_i18n( "Y m d G i",strtotime(get_lastpostmodified()));
    echo get_option( 'gmt_offset' );
    
    >date_default_timezone_set('Asia/Tokyo'); 有り
    2010/08/28. 21:09 JST
    20100828 09:09:43
    20100829 06:09:43
    20100828 09:09:43
    2010 08 28 21 09
    9
    
    >date_default_timezone_set('Asia/Tokyo'); 無し
    2010/08/28. 21:09 UTC
    20100828 09:09:43
    20100829 06:09:43
    20100828 09:09:43
    2010 08 28 21 09
    9

    ~以上の様になりました。

    自分が得たい結果は strtotime('+9 hour '.get_lastpostmodified()) でしか得られないみたいです。また date_default_timezone_set('Asia/Tokyo') をセットしても、結果に表示されるタイムゾーン自体は「JST」となっているのに、実際に表示されてる時間はUTCなのも謎です?

    以上の事を踏まえまして…

    function my_lastPostModified() {
      $lastModTime = date( 'Y/m/d. H:i', strtotime('+9 hour '. get_lastpostmodified()) );
      printf( $lastModTime );
    }

    ~というコードに書き直しました。自分的には行数も減ってスマートになったんじゃないかと思っています。また date_default_timezone_set() は、あんまりローカル側からタイムゾーンを弄るのは如何な物かという判断から使わない方針にしました(というか結果が同じだし…)。

    とりあえずコードの量を減らして見た目も簡素にするという目的は達成出来ましたので、これでスレッドを締めさせて貰います。タイムゾーンや時間設定に関するスレは多数有りますが、意外と get_lastpostmodified() に関する記述は少ない様だったので。ここでの議論が少しでも誰かの役に立てば幸いです。皆様もお付き合いありがとうございました。

    横からお邪魔します。><

    get_lastpostmodified() で指定できるパラメータは ‘gmt’、’blog’、’server’ のいずれかです。
    一般設定画面で指定したタイムゾーンの日時がご希望だとしたら、
    <?php echo get_lastpostmodified('blog'); ?>
    でどうでしょう。
    私のサイトでは公開済み投稿のうちの一番新しい更新日が表示されます。

    トピック投稿者 4017B

    (@4017b)

    bonoさん、わざわざ追加回答ありがとうございます。

    get_lastpostmodified('blog')
    確かに引数に 'blog' を渡しても大丈夫みたいですね。前述のソースの strtotime('+9 hour '. get_lastpostmodified()) の部分を、strtotime(get_lastpostmodified('blog')) ~と改変してみて実験してみました所、全く同じ結果になりました。

    少しでもコードは短く簡潔な方が好みなので、コレで行こうと思います。

    P.S.
    しかし相変わらずタイムゾーン自体は「UTC」に固定されたままです。WordPressの管理画面で変更したタイムゾーンはあくまでも表向きの結果表示のみで。実質、WordPress内ではUTCで統一管理されてるんですかね?

    4017Bさん、確認&採用ありがとうございます。

    実質、WordPress内ではUTCで統一管理されてるんですかね?

    DBの投稿データなどは、タイムゾーン設定とGMTの両方の値を持っています。
    get_lastpostmodified('blog')wp_postsテーブルpost_modified フィールドの値を取ってきます。
    'gmt''server'post_modified_gmt を取ってきてごにょごにょして返します。

    ごにょごにょ: wp-includes/post.php

    しかし相変わらずタイムゾーン自体は「UTC」に固定されたままです。

    これはどこで見られますか?
    (ていうか解決済みスレなのにスミマセン。。(^^; もしよかったら教えてください)

    WordPress本体wp-settings.phpで

    if ( function_exists('date_default_timezone_set') )
    	date_default_timezone_set('UTC');

    と、date_default_timezone_setがなければUTC固定になってますね。

    PHP のタイムゾーン設定と WordPress のタイムゾーン設定が別々にあるので、重複や混乱を避けるためにPHP のタイムゾーンの方は UTC に統一しておきたい、というのがdate_default_timezone_set( ‘UTC’ ) を指定する意図ではないかと思います。

    以前Miyoshiさんに返答を頂きました。
    bonoさんのおっしゃっている

    DBの投稿データなどは、タイムゾーン設定とGMTの両方の値を持っています。

    にも関係しているのかもしれませんね。
    自作テーマやプラグインでうっかりtime()とかやっちゃうと大変なことに(汗)

    トピック投稿者 4017B

    (@4017b)

    >タイムゾーン自体は「UTC」に固定
    正しい方法かどうかは分りませんが、
    date( 'Y/m/d. H:i', strtotime(get_lastpostmodified('blog')) );
    ~の日付フォーマットの部分を ‘Y/m/d. H:i T‘ とすればタイムゾーンが表示されます。

    >date_default_timezone_setがなければUTC固定
    前述の通り、自分はサーバやWordPress本体の設定の方は、個別のBlog(webサイト)の事情で弄るべきではないと考えますので。WordPress本体がUTC固定と考えているのなら、その考え方に従います。

    bono

    (@bono)

    4017Bさん、「タイムゾーン自体は「UTC」に固定」の見方を教えてくださってありがとうございます。お返事遅くなってしまい失礼いたしました。
    自分のサイトでもこの指定でUTCと表示されました。
    shoさんが教えてくださったこととも突き合わせると疑問に思ったところもあり、ただ、PHPの日時データの持ち方を理解できていないので、自分で引き続き勉強してみたいと思います。

    解決済みスレッドですみませんでした&応対してくださってありがとうございました!(^-^)

12件の返信を表示中 - 1 - 12件目 (全12件中)
  • トピック「サイト全体の最終更新日のタイムゾーン設定について」には新たに返信することはできません。