【WordPress】投稿一覧ページのサイドバーにカテゴリー一覧を表示する方法

今回はブログのサイドバーにカテゴリー一覧を表示する方法についてご紹介します。
ブログサイトには必ず存在する、この部分です。

目次
カテゴリー一覧を表示する方法
カテゴリー一覧を表示する方法は大きく分けて2つあります。
①各カテゴリーページへのリンクを設置する

この方法は実装が簡単ですが、カテゴリを追加しても、自動で追加されることもなく、記事数を表示することも出来ません。
簡単なコード例
<ul>
<li>
<a href="<?php echo esc_url(get_category_link(get_cat_ID('HTML/CSS'))); ?>">HTML/CSS</a>
</li>
<li>
<a href="<?php echo esc_url(get_category_link(get_cat_ID('Wordpress'))); ?>">Wordpress</a>
</li>
<li>
<a href="<?php echo esc_url(get_category_link(get_cat_ID('WEBデザイン'))); ?>">WEBデザイン</a>
</li>
<li>
<a href="<?php echo esc_url(get_category_link(get_cat_ID('お知らせ'))); ?>">お知らせ</a>
</li>
</ul>
解説
<?php echo esc_url(get_category_link(get_cat_ID('Wordpress'))); ?>
「Wordpress」という名前のURLを自動取得するコードです。
カテゴリー名でなく、カテゴリのIDを指定して取得する方法は以下になります。
<?php echo esc_url(get_category_link(6)); ?>
カテゴリ名指定の場合は、カテゴリ名を変更するとリンクが壊れてしまうため、ID指定の方が安全です。
②カテゴリー名を一覧で自動取得する
今回の解説ではこちらがメインです。
全てのカテゴリを取得し、記事数が多い順に一覧表示する方法について解説します。
基本的なコード(コピペOK)
<ul>
<?php
$args = array(
'orderby' => 'count',
'order' => 'DESC',
'parent' => 0,
);
$categories = get_categories($args);
?>
<?php foreach ($categories as $category): ?>
<li>
<a href="<?php echo get_category_link($category->term_id); ?>">
<?php echo $category->name; ?>(<?php echo $category->count; ?>)
</a>
</li>
<?php
$childcatnum = count(get_term_children($category->cat_ID, 'category'));
?>
<?php if ($childcatnum > 0): ?>
<?php
$catchildargs = array('parent' => $category->cat_ID);
$catchilds = get_categories($catchildargs); ?>
<?php
foreach ($catchilds as $catchild): ?>
<?php $cat_link = get_category_link($catchild->cat_ID); ?>
<li>
<a href="<?php echo $cat_link; ?>">
<?php echo $catchild->name; ?>(<?php echo $catchild->count; ?>)
</a>
</li>
<?php endforeach; ?>
<?php endif; ?>
<?php endforeach; ?>
</ul>
このコードを貼り付けるとカテゴリが自動取得されます。
ここからclassなどを付けて、デザインに合わせてCSSで調整します。

表示例 ※画像は記事数順に並んでいない状態のスクリーンショットですが、上記のコードを使うと記事数順になります。
特定のカテゴリを除外したい場合(コピペOK)
全てのカテゴリを取得するため、あまり使用しないタグや他投稿ページのタグも出てきてしまう場合もあるかと思います。
その場合はカテゴリIDを指定して除外すれば表示されなくなります。
<ul>
<?php
$args = array(
'orderby' => 'count',
'order' => 'DESC',
'parent' => 0,
'exclude' => array(2, 7, 9, 10, 11)
);
$categories = get_categories($args);
?>
<?php foreach ($categories as $category): ?>
<li>
<a href="<?php echo get_category_link($category->term_id); ?>">
<?php echo $category->name; ?>(<?php echo $category->count; ?>)
</a>
</li>
<?php
$childcatnum = count(get_term_children($category->cat_ID, 'category'));
?>
<?php if ($childcatnum > 0): ?>
<?php
$catchildargs = array('parent' => $category->cat_ID);
$catchilds = get_categories($catchildargs); ?>
<?php
foreach ($catchilds as $catchild): ?>
<?php $cat_link = get_category_link($catchild->cat_ID); ?>
<li>
<a href="<?php echo $cat_link; ?>">
<?php echo $catchild->name; ?>(<?php echo $catchild->count; ?>)
</a>
</li>
<?php endforeach; ?>
<?php endif; ?>
<?php endforeach; ?>
</ul>
以下の部分で、除外するカテゴリIDを指定しています。
'exclude' => array(2, 7, 9, 10, 11)
解説
$args = array(以降で一覧取得の条件指定をしています。
$args = array(
'orderby' => 'count',// 投稿数で並べる
'order' => 'DESC',// 多い順で並べる
'parent' => 0,// 親カテゴリを取得
'exclude' => array(2, 7, 9, 10, 11)// 除外するカテゴリIDを指定
);

このように表示されていれば成功です!
まとめ
WordPressオリジナルテーマ作成においては、簡単なように見えて意外と実装が難しい、サイドバーの作成。
案件にもよりますが、まずは②のコードで自動取得してみて条件指定をしていく、という方法で進めています。
単純に、特定のカテゴリリンク設置をしたい場合は①のコードも使えます。
WordPressのカテゴリ取得はカスタム投稿ページとの兼ね合いで難しい場面が多いですが、今後も最適な方法を見つけて行ければと考えています。