[WP] カテゴリのリストに関連するタグ一覧を付加する
ブログをリニューアルしたときに、カテゴリだけより情報があっていいかな~と思ってこういうのをやってみました(PCレイアウトのときだけ見れます)。最近Webの仕事をしてなくてトレンドや需要に疎いのですがメモ的にコードを残しておきます。
出力したいコード
まずよくある感じの、こういうのを
<ul> <li><a href='#'>AAA</a> (n)</li> <li><a href='#'>BBB</a> (n)</li> </ul>
以下のように出力される形にしました。
<ul> <li> <p>AAA</p> <dl> <dt>カテゴリ</dt> <dd><a href='#'>AAA</a> (n)</dd> <dt>関連タグ</dt> <dd><a href='#'>aaa</a> (n)</dd> <dd><a href='#'>bbb</a> (n)</dd> <dd><a href='#'>ccc</a> (n)</dd> </dl> </li> <li> <p>BBB</p> <dl> <dt>カテゴリ</dt> <dd><a href='#'>BBB</a> (n)</dd> <dt>関連タグ</dt> <dd><a href='#'>aaa</a> (n)</dd> <dd><a href='#'>bbb</a> (n)</dd> <dd><a href='#'>ccc</a> (n)</dd> </dl> </li> </ul>
ここへli
タグにマウスが載ったらdl
をドロップダウンするという動きをつけています。現状このブログではCSSとjQueryでやっていますが、いまはもうCSSだけでもできるのでは。このあたりはそんなに目新しいことしてないので割愛します。
実装
上のhtmlを出力するべく書いたコードです。
任意のファイル
<ul> <?php if( is_category() || is_single() ){ $now_cat_id = wp_get_post_categories($post->ID, 'fields=ids'); //現在のカテゴリID配列 } else { $now_cat_id = array(); //カテゴリ情報がない場合は空の配列を入れておく } $cat_ids = get_terms( 'category', 'fields=ids' ); //すべてのカテゴリID配列 foreach ( $cat_ids as $cat_id ) { //カテゴリをループでひとつずつ出力 tag_list_from_category( $cat_id, $now_cat_id ); //自作関数へ } ?> </ul>
出力したい場所に書きます。このブログでは header.php に書いています。出力するカテゴリIDと、現在位置のカテゴリID配列を持ってtag_list_from_category
という自作の関数を呼び出します。
functions.php
//カテゴリIDから関連タグを出力 function tag_list_from_category( $cat_id, $now_cat_id ){ $str = ( in_array($cat_id, $now_cat_id) ) ? "\t<li class='current'>\n" : "\t<li>\n"; //現在表示しているカテゴリに含まれていたらカレントにする $str .= "\t\t<p>".get_cat_name( $cat_id )."</p>\n"; $str .= "\t\t<dl>\n"; //ここからdl要素 $str .= "\t\t\t<dt>カテゴリ</dt>\n"; $str .= "\t\t\t<dd><a href='".get_category_link( $cat_id )."'>".get_cat_name( $cat_id )."</a> (".get_category( $cat_id )->count.")</dd>\n"; $str .= "\t\t\t<dt>関連タグ</dt>\n"; $tgt_posts = get_objects_in_term( $cat_id, 'category' ); //このカテゴリに属する投稿IDを取得 $tags = wp_get_object_terms( $tgt_posts, 'post_tag' ); //関連タグ情報を取得 foreach ( $tags as $tag ) { //タグをループでひとつずつ整形 $tag_link = get_tag_link($tag->term_id); $str .= "\t\t\t<dd><a href='".$tag_link."'>".$tag->name."</a> (".$tag->count.")</dd>\n"; } $str .= "\t\t</dl>\n"; $str .= "\t</li>\n"; echo $str; //出力 }
関数の中身はこんな感じです。カテゴリによる絞り込みではなく、そのカテゴリに使われているタグの一覧になります。
こちら、いったんカテゴリに属する投稿IDを取得してから関連タグ情報を取得するという部分を、以下のフォーラムの回答を参考にさせていただいております。ありがとうございます!
以上です!
コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)
YouTubeでQ&Aコンテンツを企画しています
運営しているYouTubeチャンネルで、ご相談やご質問を募集しています。動画のコメントやお問い合わせページからお気軽にご相談をお寄せください。