Contents
はじめに
お仕事でシングルテンプレート作成中につまづきました。
ちなみにやりたいことは、カスタムフィールドを簡単に作ることができるプラグイン「Types」で作った
カスタムフィールドの日付を表示したい。
例:開始日:2014/05/21(date_s) ~ 終了日:2014/8/31(date_e)
↑日付部分をカスタムフィールド(カッコ内がスラグ名)で作成中
日付がうまく表示できない
そこでせんぱーーい!!!
カスタムフィールドの日付表示方法
1970-01-01 00:00:00からの秒数を表す値 = Timestamp値が入ってます
そもそも、Typesで作成したカスタムフィールドの日付にはTimestamp値が入っているらしい。
(デジタル・)タイムスタンプってなんだ?
コンピュータやデジタルカメラ等の電子機器にて記録されるタイムスタンプ(他との区別のため「デジタル・タイムスタンプ」 英: Digital timestampとも呼ばれる[2]。)は出来事(イベント)が発生した時刻そのものを指すのではなく、コンピュータにイベントが記録された時刻を指す。多くの場合、その違いは重要ではない。タイムスタンプによりイベントが記録された時刻(例: ログ書き込み時刻)と記録されたイベントの発生時刻の差は極めて0に近づくべきである。
中略
タイムスタンプは次の意味でも使われる。
UNIX時間。1970年1月1日00:00:00 UTCからの経過秒数。プログラミングにおいてはこちらをさすことが多い。
ふむふむ。
なので基本としては、以下でよい。(Typsで作成したフィールドは先頭に「wpcf-」をつける)
$date_s = get_post_meta($post->ID, 'wpcf-date_s', true); $start = date('Y年m月d日', $date_s); echo $start;
ですが、
PHPはわりと最近のアップデートで「タイムゾーンを明示的に設定しておかないといけません」という仕様になりました。
とのことで、以下が正解になります。
date_default_timezone_set('Asia/Tokyo'); $date_s = get_post_meta($post->ID, 'wpcf-date_s', true); $start = date('Y年m月d日', $date_s); echo $start;
なるほど。
そして、そのままそれを私は利用したかというと、しなかったんです←オイッ
ググってでてきた「Types Fields API」の「types_render_field」を利用したんです。
ところが・・・
時刻がずれる可能性もあるかも?というこで利用をやめました。
そして続きが。
Warning: date() expects parameter 2 to be long, string given
こんな警告がでたとのこと。
和訳:「date()関数の第2引数はlong(長精度整数型)が求められていますが、string(文字列型)が渡されました」
2行目で、wpcf-date_sカスタムフィールドから値を取得した時に、値が入力されていれば日付を表す数値が入っています。
が、「なにも入力されていない」という場合もあり得るので、3行目でそのままdate()に渡してしまうと、「空の文字列」が渡されることになって先の警告が出るとのこと。
プログラミングでは、「例外処理」といって、
「入力してくれることを期待しているけれど、入力してくれないかもしれない」とか、
「数値を入れてくれるはずだけど、文字が入っているかもしれない」とか、
期待していないデータが渡ってくるケースのことも考える必要があります。一般的に、期間を表すときは、
・「$date_s」に値が入っていなかったら、日付は空欄にする。
・調査期間の開始日がなくて終了日だけ入っている場合も空欄にする。
・開始日〜終了日の「〜」だけ表示されてたらおかしいので、開始日がなければ「〜」も表示しない。
といったルールが多いそうです。
ということで、以下になりました。
$date_s = get_post_meta($post->ID, 'wpcf-date_s', true); $date_e = get_post_meta($post->ID, 'wpcf-date_e', true); if ($date_s) { $start = date("Y年m月d日 h:i:s", $date_s); $end = date("Y年m月d日 h:i:s", $date_e); echo $start . '〜' . $end; }
へぇ〜〜〜!!なんか、すごいなぁ。