der Gegenwart

カテゴリ一覧でアクティブなカテゴリをハイライト表示させる

カスタム分類一覧を表示したいときのお話。いや、カスタム分類に限った話じゃなくて、通常のカテゴリにも当てはまる話なんだけどね。

以下、カスタム投稿「products」にカスタム分類「productcat」が設定されているものとして話を進める。

とりあえずこんな感じにsidebar.phpに記述すると

<ul>
<?php wp_list_categories( 'taxonomy=productcat&title_li='); ?>
</ul>

カスタム分類「productcat」の一覧が順不同リストとして表示される。

で、困るのが記事なりページなりが所属するカテゴリをハイライト表示させたいとき。

カスタム分類のアーカイブページでは該当するカテゴリのli要素に「current-cat」というclass属性値が自動的に振られるから、CSS書けば簡単にアクティブなカテゴリの表示を変更できる。

ところが個別の記事ページでは「current-cat」ってclassが振られないので、どうしようこれ、みたいになって困る。というか困った。

そこでだ。以下のようにして何とかした。

<ul>
<?php
if(is_singular('products') ) :
    $catinfos = get_the_terms($post->ID, 'productcat');
    foreach ( $catinfos as $catinfo ) :
        $mycat = $catinfo;
        break;
    endforeach;
    wp_list_categories( 'taxonomy=productcat&title_li=&current_category='.$mycat->term_id);
else:
    wp_list_categories( 'taxonomy=productcat&title_li=');
endif;
?>
</ul>

まずif(is_singular('products') ) :~else:と書いて、カスタム投稿「products」の個別記事ページとそれ以外で処理内容を分岐。

「products」の個別記事ページ以外では普通に「productcat」一覧を出力させる。

問題は「products」の個別記事ページの方で、どうしようか悩んでたらCodexに都合のよさそうなパラメータが。「current_category」にカテゴリIDを記述することで、「現在表示されてるページのカテゴリは○○だ」と強制できるらしい。

これを利用したのがif(is_singular('products') ) :内の記述部分で、まずはget_the_terms関数で現在の記事が属する「productcat」情報を取得。配列でごちゃごちゃなってるのでforeach関数使って、記事が属する「productcat」の最初の1つだけを使う。必要な情報はカテゴリID(整数)なので当該連想配列の中の「term_id」を持ってくればOK。あとはwp_list_categories関数にパラメータとして記述すればいいだけなので、あんな感じに書けば終了。

上の書き方の欠点は複数のカスタム分類に所属している記事については、(たぶん)IDの若い方の情報しか得られないので、複数カテゴリに所属していても複数のリンクをハイライト表示できないところにある。パラメータ「current_category」には整数しか渡せないっぽいので、所属カテゴリすべてにclass「current-cat」をつけたいときはどうしたらいいんだろうか、と思ったり。