WordCamp Haneda 2019 - 4月20日(土)、4月21日(日) 大田区産業プラザPiOにて開催

data_i18nフィルターとdate_formatsフィルターを使用して新しい日付のフォーマットを作成

はじめに

新元号が「令和」に決まりました。「令和」がとても気に入ってしまったのと、ちょうど桜の花が綺麗で気分が高揚した勢いで「Wareki」という日付を和暦にするプラグインを作成してしまいました。

初めは、get_the_dateget_the_modified_dateget_the_comment_date、フィルターを利用して、日付を書き換えていたのですが、テーマによっては、これらのフィルターが使えずに、 get_the_timeget_the_modified_time、フィルターを利用する事になりました。フィルターが多くなり過ぎて、面倒になり、設定->一般->日付のフォーマットに和暦のフォーマットを追加する事を思いつきました。functions.phpdate_i18n関数 を見たらフィルターを提供しているようなので使用してみました。

コード

/* ==================================================
 * Construct
 * @since	1.00
 */
public function __construct() {

	// 日付のフォーマット
	add_filter( 'date_formats', array( $this, 'wareki_date_formats' ), 10, 1 );
	// 時刻フォーマット
	add_filter( 'time_formats', array( $this, 'wareki_time_formats' ), 10, 1 );
	// date_i18n フィルター
	add_filter( 'date_i18n', array( $this, 'wareki_date_i18n' ), 10, 4 );

}

/* ==================================================
 * Date Format Hook
 * @param	array	$date_array
 * @since	1.10
 */
public function wareki_date_formats( $date_array ) {

	// 元号を K とし、元号の略号を k とする
	$add_array = array( "K年n月j日", "k年n月j日" );

 	return array_merge($date_array, $add_array);

}

/* ==================================================
 * Time Format Hook
 * @param	array	$time_array
 * @since	1.10
 */
public function wareki_time_formats( $time_array ) {

	// 午前午後を E とする
	$add_array = array( "Eg時i分" );

 	return array_merge($time_array, $add_array);

}

/* ==================================================
 * Wareki date_i18n Hook
 * @param	string	$j
 * @param	string	$req_format
 * @param	int	$i
 * @param	bool	$gmt
 * @return	string	$j
 * @since	1.10
 */
public function wareki_date_i18n( $j, $req_format, $i, $gmt ) {

	// それぞれのフォーマット文字が見つかったら、
	// タイムスタンプ $i、文字 $j などを関数に送り、
	// 変更した文字を返す。
	if ( strpos($req_format, 'K') !== false ) {
		$j = $this->gengo_date_i18n( $i, $j, 'K' );
	}

	if ( strpos($req_format, 'k') !== false ) {
		$j = $this->gengo_date_i18n( $i, $j, 'k' );
	}

	if ( strpos($req_format, 'E') !== false ) {
		$j = $this->ampm_date_i18n( $i, $j);
	}

	return $j;

}

/* ==================================================
 * Gengo date_i18n
 * @param	int	$timestamp
 * @param	string	$j
 * @param	string	$k
 * @return	string	$j
 * @since	1.10
 */
private function gengo_date_i18n( $timestamp, $j, $k ) {

	// タイムスタンプを受け取り判断
	// とりあえず令和と平成のみ

	$reiwa = 1556636400;
	$year = intval(date_i18n('Y', $timestamp));

	if ( $reiwa <= $timestamp ) {
		$y = $year - 2019 + 1;
		if ( $y == 1 ) $y = "元";
		if ( $k == 'K' ) {
			$gengo = "令和";
		} else if ( $k == 'k' ) {
			$gengo = "R";
		}
		$j = str_replace($k, $gengo.$y, $j);
	} else {
		$y = $year - 1989 + 1;
		if ( $y == 1 ) $y = "元";
		if ( $k == 'K' ) {
			$gengo = "平成";
		} else if ( $k == 'k' ) {
			$gengo = "H";
		}
		$j = str_replace($k, $gengo.$y, $j);
	}

	return $j;

}

/* ==================================================
 * AM PM date_i18n
 * @param	int	$timestamp
 * @param	string	$j
 * @return	string	$j
 * @since	1.10
 */
private function ampm_date_i18n( $timestamp, $j) {

	// タイムスタンプを受け取り判断
	// 午前か午後を返す

	$ampm = date_i18n('a', $timestamp);
	if ( $ampm == 'am') {
		$e = "午前";
	} else {
		$e = "午後";
	}

	$j = str_replace("E", $e, $j);

	return $j;

}

各種画面

設定

投稿

プラグイン(Legacy Google Calendar Events 2.4 )のイベント画面

おわりに

get_the_dateget_the_modified_dateget_the_comment_dateget_the_timeget_the_modified_time フィルターが不要になりました。

なお、年別、月別、日別、アーカイブとウィジェットにはこの方法は使用できません。