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' );
結果は、ご覧の通り。