このサイトは WordPress を使っています。カテゴリを再編したら子カテゴリが増えてカテゴリリストがダラダラと長くなってしまいました。そして投稿ページからその投稿に関連するリンク以外を削除しようと思い、サイドバーのウィジェットで表示しているカテゴリ一覧から、その記事が属する親カテゴリとその子孫カテゴリのみ表示するようにカスタマイズしました。
目次
ウィジェットにて親カテゴリの子孫カテゴリのみ表示
ソースを見てみると、ウィジェットの中の widget_categories_args
というフィルターフックにて表示する内容を変えられそうだったので利用しました。表示したいカテゴリの ID をカンマ区切りで渡せばいいようです。
→ WordPress.org : Code Reference : widget_categories_args
/***********************
* カテゴリウィジェットにてその最上位の親の子孫カテゴリのみ表示する
***********************/
function widget_categories_top_children( $cat_args, $instance ){
//シングルページとカテゴリ以外はそのまま
if( !is_single() && !is_category()){
return $cat_args;
}
//添字を変数に変換
extract( get_top_category_and_children() );
//子カテゴリがない場合はそのまま
if( !$term_has_children ){
return $cat_args;
}
//カンマ区切りのカテゴリIDリストを作る
$id_list = "";
foreach( $cat_array as $key => $array ){
if( $key !== 0 ){
$id_list .= ',';
}
$id_list .= implode( ",", $array );
}
//添字リストを配列に入れる
$args = array( 'include' => $id_list );
//配列をマージ
$cat_args = wp_parse_args( $args, $cat_args );
return $cat_args;
}
add_filter( 'widget_categories_args', 'widget_categories_top_children', 10, 2 );
//最上位カテゴリとその子孫のIDを配列で取得
function get_top_category_and_children(){
//シングルページとカテゴリページでカテゴリを取得
if( is_single() ) {
$cats = get_the_category();
} else if ( is_category() ){
$cats[] = get_queried_object();
}
$term_has_children = false;
$cat_array = array();
foreach( $cats as $key => $cat ){
//親カテゴリを取得し配列に入れる
if ( $cat->parent ){
$parent_cat_id = $cat->parent;
} else {
$parent_cat_id = $cat->term_id;
}
$cat_array[$key]['parent'] = $parent_cat_id;
//子孫カテゴリを取得し配列に入れる
$term_children = get_term_children( $parent_cat_id, 'category' );
if( !empty( $term_children ) ){
$cat_array[$key] = array_merge( $cat_array[$key], $term_children );
$term_has_children = true;
}
}
return array( 'cat_array' => $cat_array, 'term_has_children' => $term_has_children );
}
ウィジェットのタイトル前に親カテゴリ名を追加
このままでもいいのですが、ウィジェットのタイトルを「親カテゴリ名 + のカテゴリ」というように変更します。カテゴリという文言はウィジェットの設定にてタイトルに設定しています。ここでは widget_title
というフィルターフックを使って、設定したタイトルの前にカテゴリ名を連結します。
→ WordPress.org : Code Reference : widget_title
//ウィジェットタイトルの前に「カテゴリ」を追加
function change_widget_title_widget_category( $widget_title, $instance, $id_base ) {
//ウィジェットのタイトルがカテゴリと最近の投稿以外はそのまま
if( $id_base !== 'categories' && $id_base !== 'recent-posts' ){
return $widget_title;
}
//シングルページとカテゴリ以外はそのまま
if( !is_single() && !is_category()){
return $widget_title;
}
//添字を変数に変換
extract( get_top_category_and_children() );
//子がテゴリがなかったらそのまま
if( !$term_has_children ){
return $widget_title;
}
//親カテゴリのみ配列に入れる
$cat_parent_array = array();
foreach( $cat_array as $array ){
$cat_parent_array[] = $array['parent'];
}
//重複を削除
$cat_parent_array = array_unique( $cat_parent_array );
//ウィジェットのタイトルの前に挿入する文字列を作成
$before_widget_title = '';
foreach( $cat_parent_array as $key => $term_id ){
if( $key != 0 ){
$before_widget_title .= 'と';
}
$idObj = get_term( $term_id, 'category' );
$before_widget_title .= '「' . $idObj->name . '」';
}
//ウィジェットのタイトルを作成
$widget_title = $before_widget_title . 'の' . $widget_title;
return $widget_title;
}
add_filter( 'widget_title', 'change_widget_title_widget_category', 10, 3 );
改変前後での表示の違い
下のキャプチャが改変前です。表示しているページに関係のないカテゴリも表示されています。
下のキャプチャが改変後です。現在表示されているページの親カテゴリとその子孫カテゴリのみ表示してすっきりしています。