[WP] カテゴリのリストに関連するタグ一覧を付加する

[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を取得してから関連タグ情報を取得するという部分を、以下のフォーラムの回答を参考にさせていただいております。ありがとうございます!

以上です!

公開日:2019/03/26

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)