WordPressのカテゴリーアーカイブページでパンくずリストを表示する
WordPressのカテゴリーアーカイブページでパンくずリストを表示する方法です。
1.概要
このエントリーでは次のように、パンくずリストの先頭にホームへのリンクを表示し、その右側にカテゴリー名をセパレータ「>」つきで表示します。

2.カスタマイズ
青色部分のコードを、アーカイブテンプレートのカテゴリー判定部分に記述します。
<?php if (is_category()) { ?>
<div class="crumbs"><a href="<?php echo get_option( 'home' ); ?>/">Home</a> >
<?php
$cat = get_queried_object();
$breadcrumbs = get_category_parents( $cat, true, ' > ' );
echo preg_replace( '/(.*) >/', '$1', $breadcrumbs );
?>
</div>
<?php } elseif (is_day()) { ?>
…後略…
3.解説
パンくずリストのトップページは次の部分で表示します。「Home」の部分のローカライズは省略しているので、適宜修正してください。
get_option( 'home' ); ?>/">Home</a> >
パンくずリストの、親カテゴリーから記事が属するカテゴリーまでは次の部分で表示します。$catへの保存は不要なのですが、分かりやすくするために用いています。
$cat = get_queried_object();
$breadcrumbs = get_category_parents( $cat, true, ' > ' );
echo preg_replace( '/(.*) >/', '$1', $breadcrumbs );
get_queried_object()で現在処理中のオブジェクトを取得します。
$cat = get_queried_object();
get_category_parents()で親カテゴリーから記事が属するカテゴリーまでのパンくずリストを取得します。第1パラメータはカテゴリーオブジェクト(またはカテゴリーID)、第2パラメータは各カテゴリーリンクの出力要否、第3パラメータはセパレータ文字列を指定します。セパレータ文字列を変更したい場合はこの部分を書き換えてください。
$breadcrumbs = get_category_parents( $cat, true, ' > ' );
ネットで調べたところ、ここまでの処理で出力している記事しかみつからなかったのですが、この状態ではカテゴリーのセパレータが一番右側のカテゴリーの末尾にも表示されてしまいます(下)。

そのため、preg_replace()を使って末尾のセパレータを除去しています。
echo preg_replace( '/(.*) >/', '$1', $breadcrumbs );
セパレータ文字列を書き換えた場合は、preg_replace()の第1パラメータに含まれる「 >」の部分(半角スペース含む)もあわせて書き換えてください。
これでカスタマイズは完了です。4項以降は興味があればご覧ください。
4.get_queried_object()の代替手段
get_queried_object()の代替手段を参考までに掲載しておきます。
$category_title = single_cat_title( '', false );
$cat_id = get_cat_ID( $category_title );
single_cat_title()で、現在表示しているカテゴリーアーカイブページのカテゴリー名を取得します。そしてget_cat_ID()でカテゴリーIDを取得します。
あとはget_category_parents()の第1パラメータに、取得したカテゴリーID($cat_id)を設定すればOKです。
$breadcrumbs = get_category_parents( $cat_id, true, ' > ' );
5.get_category_parents()について
get_category_parents()は再帰処理を行うことで、親カテゴリーから記事が属するカテゴリーまでを出力しています。再帰処理を行っているので末尾のセパレータ文字列を除去するようなフィルタは実装できないものと推測します。
参考までに、get_category_parents()のコードを掲載しておきます。この関数はwp-includes/category-template.phpに実装されています。
function get_category_parents( $id, $link = false, $separator = '/', $nicename = false, $visited = array() ) {
$chain = '';
$parent = &get_category( $id );
if ( is_wp_error( $parent ) )
return $parent;
if ( $nicename )
$name = $parent->slug;
else
$name = $parent->name;
if ( $parent->parent && ( $parent->parent != $parent->term_id ) && !in_array( $parent->parent, $visited ) ) {
$visited[] = $parent->parent;
$chain .= get_category_parents( $parent->parent, $link, $separator, $nicename, $visited );
}
if ( $link )
$chain .= '<a href="' . get_category_link( $parent->term_id ) . '" title="' . esc_attr( sprintf( __( "View all posts in %s" ), $parent->name ) ) . '">'.$name.'</a>' . $separator;
else
$chain .= $name.$separator;
return $chain;
}
6.パンくずリストを表示するプラグイン
パンくずリストを表示するには、次のプラグインもあります。
ただし、ファイルサイズを絞りたい場合は本エントリーのように個別にカスタマイズするという手もあるでしょう。
WordPress テーマ(テンプレート)のパンくずリスト修正
当サイトで配布中の WordPresss テーマ(テンプレート)のパンくずリストに不具合がありましたので、本エントリーで適正に表示するための修正方法を紹介します。なお配布テーマの方は修正済です。
2007年4月20日以前にテーマをダウンロードされた方は、下記の対処を実施することで正常に表示されるようになります。
1.問題点
エントリーに複数のカテゴリーを割り当てている状態でカテゴリーアーカイブを表示させると、パンくずリストの表示内容が、ページの最初に表示されたエントリーの1つ目のカテゴリー名が一律表示されてしまいます。
たとえばある記事に「A」と「B」と言うカテゴリーを割り当て、「B」のカテゴリーアーカイブを表示させると、パンくずリストは
Home > A
と表示されてしまいます。また、カテゴリー数が 0 の親カテゴリーの表示も正常ではありません。
2.原因
カテゴリー情報を取得するための起動関数誤り(というか知識不足)。
3.対処方法
管理ページの [表示] - [テーマエディタ] で右側のリンクより「アーカイブ」を選択し、下記の赤色部分を青色の内容に入れ替えてください。
変更前
<?php /* If this is a category archive */ if (is_category()) { ?>
<div class="crumbs"><a href="<?php echo get_settings('home'); ?>/">Home</a> >
<?php $cat = get_the_category(); $cat = $cat[0];
if($cat->category_parent) { echo (get_category_parents($cat->category_parent, true, ' > ', false)); }
echo $cat->cat_name; ?>
変更後
<?php /* If this is a category archive */ if (is_category()) { ?>
<div class="crumbs"><a href="<?php echo get_settings('home'); ?>/">Home</a> >
<?php $cat = $wp_query->get_queried_object();
if($cat->category_parent) { echo (get_category_parents($cat->category_parent, true, ' > ', false)); }
echo $cat->cat_name; ?>
</div>
4.プラグイン
有名な「パンくずリストプラグイン」もあります。
