WordPressのアーカイブリスト(wp_get_archives)は、wp_list_pagesなどと違い、リストに現在ページを示すclassなどが入りません。
また、ドロップダウンリストとして表示した場合でも、デフォルト選択状態になっておらず、ちょっとばかり不便ですね。
これを修正するには、get_archives_linkというフックポイントにフックして、htmlのソースを書き換える必要があります。
やり方としては、WordPressのカレンダーのthにclassを追加するコード(日本語限定)とほぼ同じで、
- フックして引数で得られるHTMLのソースを正規表現でパースし、リンクのURLを取得
- 表示しているURLと正規表現で得られたリンクのURLがマッチすれば、class or selected属性の追加したコードで置換
という流れになります。
CODE 1は、実際にテーマのfunctions.phpに追加するコードで、このフックにより、リスト表示時はcurrent-archive-item、ドロップダウンリスト表示時は、selected属性が追加されます。
■ CODE 1
function add_archive_current_class( $link_html ) {
$regex = '/^\t<(link |option |li>)/';
if ( preg_match( $regex, $link_html, $m ) ) {
switch ( $m[1] ) {
case 'option ' :
$search = '<option';
$replace = '<option selected="selected"';
$regex = "/^\t<option value='([^']+)'>[^<]+<\/option>/";
break;
case 'li>' :
$search = '<li>';
$replace = '<li class="current-arichive-item">';
$regex = "/^\t<li><a href='([^']+)' title='[^']+'>[^<]+<\/a><\/li>/";
break;
default :
$search = '';
$replace = '';
$regex = '';
}
}
if ( is_month() && $regex && preg_match( $regex, $link_html, $m ) ) {
if ( preg_match( '/' . preg_quote( $_SERVER['REQUEST_URI'], '/' ) . '$/', $m[1] ) ) {
$link_html = str_replace( $search, $replace, $link_html );
}
}
return $link_html;
}
add_filter( 'get_archives_link', 'add_archive_current_class' );
結果は、ご覧の通り。

