ちょっとしたイベントの一覧ページを作成しています。
Advanced Custom Fieldsでカスタムフィールドを作成し、デイトピッカーを使用して、「申込み開始日」、「申込み終了日」、「イベント開始日」、「イベント終了日」のカスタムフィールドを作成しました。
やりたいこと
- 申し込み開始前は開始前であるということのメッセージ
- 申込期間中は申込期間であることのメッセージ
- 申し込み期間終了後は終了したということのメッセージ
- イベント開催日は開催日であることのメッセージ
- 終了後は終了したという旨のメッセージ
を条件分岐させて表示したい。
たったこれだけのことだけど、かなり苦戦しました。
本を読んだりネットで検索したりしてあれこれやって、3日も悩んでやっとできました。
strototime()を使用してみたものの
なぜか「申込期間中です」というところだけ反応しますが、他は表示されません。
echoで出力を一つ一つ確認していったところ、日付のフォーマットが合っていなかったとこがわかりました。
日付のフォーマットに関しては、ここ以外にも使用しているので、カスタムフィールドに格納しているフォーマットを変更したくはありません。
文字列を切り出してつなげてみた
日付は「yyyy/mm/dd」の文字列で格納されています。
年、月、日のをそれぞれ切り出し、つなげてみれば「yyyymmdd」となり、数値として比較できるのではないかと考えました。
<?php
date_default_timezone_set(‘Asia/Tokyo’);
$today = date(“Ymd”);
$date_start = get_field(‘app_start’);
$y1 = substr($date_start,0,4);
$m1 = substr($date_start,5,2);
$d1 = substr($date_start,8,2);
$start_app = $y1.$m1.$d1;
?>
今日の日付はdate(Ymd)でyyyymmddでそのまま利用できます。
カスタムフィールドに格納した値はget_field()で呼び出し,substrで切り取ります。
substr(文字列,開始位置,切り出す文字数)
echoで確認したところ、20190603のようになり、’/’を外せたことを確認できました。
数字は思ったとおりの値になっているのに、今度は比較がおかしいことに気が付きました。
どうやら、文字列のまま比較しており、数字の比較にはなっていないようでした。
文字列を数値に変換
intval()を使用することによって、文字列を数値に変換できることがわかりました。
<?php
date_default_timezone_set('Asia/Tokyo');
$today = date("Ymd");
$to = intval($today);
$date_start = get_field('app_start');
$y1 = substr($date_start,0,4);
$m1 = substr($date_start,5,2);
$d1 = substr($date_start,8,2);
$start_app = $y1.$m1.$d1;
$sa = intval($start_app);
?>
空欄の処理
申し込み締め切り日とイベント開始日は入力必須にしてありますが、申し込み開始日とイベント終了日は必須ではありません。
イベントが1日で終了する場合は入力しなくても良いようにしてあるからです。
申込開始日も、ネット申し込みの場合は必須にしてありますが、郵送の場合は締め日があるのみで開始日がありません。
intval()を使用すると、空欄の場合は”0”が返ってきます。
はじめは異なる値を代入しようかと考えましたがうまくいかなかったので、”0”の場合の処理を加えることにしました。
$to:今日の日付
$sa:申し込み開始日
$ea:申し込み締め日
$sc:イベント開始日
$ec:イベント終了日
<?php if ($sa > $to):?>
<div> 現在申し込みを受け付けておりません </div>
<?php elseif($to >= $sa && $ea >= $to) : ?> //申し込み日より今日が小さいとき
<div> 申し込み受付中です </div>
<?php elseif($ea < $to && $sc > $to) : ?> //申し込み締め日からイベント開始日まで
<div> 受付は終了しました </div>
<?php elseif($sc <= $to && $ec >= $to) : ?> //イベント開始日と終了日の間
<div> イベント開催日です </div>
<?php elseif($sc = $to && $ec === 0 ) : ?> //イベント開始日はあるが終了日は未入力のイベント当日
<div> イベント開催日です </div>
<?php elseif($sc < $to && $ec === 0) : ?> //イベント終了日より今日が大きく,かつ終了日未入力
<div> イベントは終了しました </div>
<?php elseif($ec < $to && $ec !== 0) : ?> //イベント終了日より今日が大きく,かつ終了日に値が入ってる
<div> イベントは終了しました </div>
<?php endif; ?>
これでやっとメッセージが表示できました。
もうちょっとスマートは方法はないものかな。
コメント