WordPressのカレンダーのthにclassを追加するコード(日本語限定)

@yuki930 さんが、Twitter上でこんなことをつぶやいているのを目にしたので

それならば「入れて見せようホトトギス」という感じで、テーマのfunctions.phpで使えるコードを書いてみました。

WordPressのフックは豊富にあってかなり自由度が高いのですが、それでもほとんどが関数の最後の出力のみをフックしてフィルタリングできるようになっていることが多く、カレンダーについても同様の実装となっています(ver3.1)。この場合、生成されたHTMLのコードをパースもしくは正規表現で検索して、書き換えることになります。
今回の要望では、tdではなくthにclassを付加したいとのことだったので、th部分のユニークなコードパターンを正規表現として用い、preg_match_allを使って、合致パターンと回数を取得、titleで表示される文字列とclassとして付加する文字を配列でマッピングさせて、置換することにしました。

titleの文字列とclassの文字列がハードコーディングで日本語限定となってしまっている点は、もう少し調べれば言語を問わず利用できそうな気がします。
また、マッピングさせる配列についても、キーと値を逆にして、array_searchなど使わない方が、パフォーマンス的には優れているはずですが、どうにもキーにマルチバイトが入るのが気に入らないため、いちいち値の検索にしています。(マルチバイトをキーとしても、動作的には全く問題ありません。)

■CODE 1

function add_week_class2calendar( $calendar_output ) {
	$week_map = array(
		'mon' => '月曜日',
		'tue' => '火曜日',
		'wed' => '水曜日',
		'thu' => '木曜日',
		'fri' => '金曜日',
		'sat' => '土曜日',
		'sun' => '日曜日',
	);

	$regex = '/<th scope="col" title="([^"]+?)"/';
	$num = preg_match_all( $regex, $calendar_output, $m );

	if ( $num ) {
		$replace = array();
		for ( $i = 0; $i < $num; $i++ ) {
			$replace[$i] = '<th scope="col" class="' . array_search( $m[1][$i], $week_map ) . '" title="' . $m[1][$i] . '"';
		}
		$calendar_output = str_replace( $m[0], $replace, $calendar_output );
	}
	return $calendar_output;
}
add_filter( 'get_calendar', 'add_week_class2calendar' );

やり方については、他にも方法はあり、Javascriptで後から追加する方法の方が簡単かもしれませんがw

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です