WordPressでwp_get_archivesを使って年別のリストを表示させると、右図のように数字だけの表示になってしまい、なんとなく物足りない感じになってしまいます。
これは、なにも日本語化がうまくいっていないのではなく、そもそも翻訳のための機能を通っていないため、英語圏そのままの表示にしかならないためです。
ただ、やっぱり日本人としては「nnnn年」のような表示にしたいところではないでしょうか。
wp_get_archives のフックは、表示する項目ごとに get_archives_link というフィルターフックを通るので、このフックを用いて「年」を追加します。
フックの引数として、wp_get_archivesの引数があれば、条件に応じた正規表現を用いることができるのですが、ここでは、単にフィルターの対象となるHTMLのソースしか取れないため、全パターンに対応できるような正規表現での書き換えを行うことにします。
HTMLのソースを生成しているのは、wp-includes/general-template.phpのget_archives_link関数で該当部分のコードはCODE 1のようになっています。
CODE 1
if ('link' == $format) $link_html = "\t<link rel='archives' title='$title_text' href='$url' />\n"; elseif ('option' == $format) $link_html = "\t<option value='$url'>$before $text $after</option>\n"; elseif ('html' == $format) $link_html = "\t<li>$before<a href='$url' title='$title_text'>$text</a>$after</li>\n"; else // custom $link_html = "\t$before<a href='$url' title='$title_text'>$text</a>$after\n"; $link_html = apply_filters( "get_archives_link", $link_html );
ここで、年の数字は、$text または $title_text として扱われていています。
これらを網羅するパターンは下記の3つ
- 半角スペース + title= + シングルクォートに挟まれた4桁の数字
- 半角スペースに挟まれた4桁の数字
- > + 4桁の数字 + </a>
これらのパターンに対して、それぞれ4桁の数字の後に「年」付け加える場合の置換を行う文字列を配列として、preg_replaceで置換処理を行います。
CODE 2を適用させた場合の表示は、右図のとおりです。
CODE 2
function add_nen_year_archives( $link_html ) { $regex = array ( "/ title='([\d]{4})'/" => " title='$1年'", "/ ([\d]{4}) /" => " $1年 ", "/>([\d]{4})<\/a>/" => ">$1年</a>" ); $link_html = preg_replace( array_keys( $regex ), $regex, $link_html ); return $link_html; } add_filter( 'get_archives_link', 'add_nen_year_archives' );