【WordPress】カスタムフィールドで指定した日付の期間を省略して表示したい

【WordPress】カスタムフィールドで指定した日付の期間を省略して表示したい



WordPressで「開始日」「終了日」「場所」「主催者」をカスタムフィールドで入力してイベント情報を作成したいと考えております。
その際、入力値の

  • 開始日
  • 終了日

は通常そのままカスタムフィールドを表示しようとすると

開始日
2019年3月15日(金)
終了日
2019年3月20日(水)

のようになると思います。

これを

開催期間
2019年3月15日(金)~20日(水)

のように年月日で同じ値の場合は省略して表示したいと考えました。

しかしながら、色々と探ってみたのですが既存の関数で即出来上がり!とはいかないようなので何とか挑戦してみました。

前提条件

  • 日付のフォーマットは不問(※ここでは「Y年n月j日(D)」とする)
  • 日付のカスタムフィールド入力値は「2018-3-15」のようなフォーマット

考え方

  1. PHPの日付のフォーマットパラメータを元に日付のフォーマットを配列に置換
  2. 「年」「月」「日」を開始日と終了日で個別に比較
  3. 同じ値の場合は、終了日の日付のフォーマットからそのパラメータを取り除く

コード

<?php
// 日付のフォーマット.
$format = 'Y年n月j日(D)';
// 開始日のカスタムフィールド取得.
$from = get_post_meta(  $post->ID, 'from', true );
// 終了日のカスタムフィールド取得.
$to = get_post_meta(  $post->ID, 'to', true );
// 日付のフォーマットパラメータ配列.
$date_format_ary = array( 'd', 'j', 'S', 'l', 'D', 'm', 'n', 'F', 'M', 'Y', 'y' );
// 日付のフォーマットを#で分割.
$split_format = $format;
foreach ( $date_format_ary as $val ) {
	$split_format = str_replace( $val, '#' . $val, $split_format );
}
// 分割した日付のフォーマットを配列に変換.
$split_formatt_ary = array_filter( explode( '#', $split_format ), 'strlen' );
/* $split_formatt_aryはこのような配列になります。
Array
(
    [1] => Y年
    [2] => n月
    [3] => j日(
    [4] => D)
)
*/
// 終了日の日付のフォーマットの作成.
$to_format = $format;
foreach ( $split_formatt_ary as $val ) {
	if ( date( $val, strtotime( $from ) ) !== date( $val, strtotime( $to ) ) ) {
		break;
	} else {
		$to_format = str_replace( $val, '', $to_format );
	}
}
// 開始日と終了日をフォーマットで展開.
$from_date = date_i18n( $format, strtotime( $from ) );
$to_date   = date_i18n( $to_format, strtotime( $to ) );
// 最終出力.
return $from_date . '~' . $to_date;
?>

これで日付期間が省略して表示されているはずです。
もっと簡単な方法があるかもしれないのですが、これが今の所精一杯です。

今日はここまで

関連する記事



こちらはいかが?


コメントを残す