WordPressのアーカイブリストにclassを追加する

WordPressのアーカイブリスト(wp_get_archives)は、wp_list_pagesなどと違い、リストに現在ページを示すclassなどが入りません。
また、ドロップダウンリストとして表示した場合でも、デフォルト選択状態になっておらず、ちょっとばかり不便ですね。
これを修正するには、get_archives_linkというフックポイントにフックして、htmlのソースを書き換える必要があります。

やり方としては、WordPressのカレンダーのthにclassを追加するコード(日本語限定)とほぼ同じで、

  1. フックして引数で得られるHTMLのソースを正規表現でパースし、リンクのURLを取得
  2. 表示している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' );

結果は、ご覧の通り。

アーカイブリストのコード
アーカイブリストのコード

ドロップダウンリストのコード
ドロップダウンリストのコード

コメントを残す

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