はじめに
新元号が「令和」に決まりました。「令和」がとても気に入ってしまったのと、ちょうど桜の花が綺麗で気分が高揚した勢いで「Wareki」という日付を和暦にするプラグインを作成してしまいました。
[wp-pic type=”plugin” slug=”wareki” layout=”large”]
初めは、get_the_date、get_the_modified_date、get_the_comment_date、フィルターを利用して、日付を書き換えていたのですが、テーマによっては、これらのフィルターが使えずに、 get_the_time、get_the_modified_time、フィルターを利用する事になりました。フィルターが多くなり過ぎて、面倒になり、設定->一般->日付のフォーマットに和暦のフォーマットを追加する事を思いつきました。functions.php の date_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_date、get_the_modified_date、get_the_comment_date、get_the_time、get_the_modified_time フィルターが不要になりました。
なお、年別、月別、日別、アーカイブとウィジェットにはこの方法は使用できません。
コメントを残す