WordPressの親カテゴリーで子孫を含めた記事数を取得する方法

WordPressの親カテゴリーで子孫を含めた記事数を取得する方法

とある有料テーマを使用されている方から相談がありました。

そのテーマを使用したサイトは「親カテゴリー」>「子カテゴリー」>「孫カテゴリー」という階層を作られていました。

作成した記事Aに「孫カテゴリー」を設定し、公開したところ、パンくずは親子孫の順番で表示されているのですが、親と子それぞれのカテゴリー一覧で表示している記事数に記事Aの数が含まれていないことに気付きました。

  • 「親カテゴリー」が表示された際には「親 + 子 + 孫」の記事数
  • 「子カテゴリー」が表示された際には「子 + 孫」の記事数

このような形に変えてほしいという内容の相談でした。

目次

親カテゴリーの記事数しか表示されない

単純に、親子孫とそれぞれカテゴリーを設定すればいいのでは?と思ったのですが、すべてのカテゴリーを設定してしまうと、パンくずが「親カテゴリー」しか表示されなくなりました。

なぜこうなるのか調べてみると、get_the_categoryで取得したカテゴリーデータの一番初めのデータに「親カテゴリー」があるかどうかを調べ、あった場合はget_ancestorsで先祖のカテゴリーIDを取得するといった感じでパンくずを表示していました。

つまり、カテゴリーデータの一番初めのデータが「親カテゴリー」だった場合、get_ancestorsで先祖のカテゴリーを調べる必要がないので、そのまま親カテゴリーのみが表示されるといった状態でした。

親子孫の記事数を取得する選択

親子孫とすべてのカテゴリーを設定した場合、パンくずリストが期待通りに表示されないページもあるという状況でしたので、パンくずの表示をカスタマイズするより、子や孫カテゴリーの記事数も含めて表示するカスタマイズを選択しました。

では、どのように親 + 子 + 孫の記事数を取得したかというと、以下のようにしました。

function archive_post_count(){
  $cat_data = get_queried_object();
 $cat_id = $cat_data->term_id;
 $current_post_num = $cat_data->count;
 $children = get_term_children($cat_id,'category');

  if(!is_wp_error($children)){
    $child_post_num = 0;
    foreach($children as $child){
      $child_data = get_category($child);
      $child_post_num += $child_data->category_count;
    }
    $post_num = $current_post_num + $child_post_num;   
  }else{
    $post_num = $current_post_num;
  }
  return $post_num;
}

まず、get_queried_object()で現在のカテゴリー情報を取得します。

$cat_id = $cat_data->term_id;
$current_post_num = $cat_data->count;

そして、取得した現在のカテゴリー情報からカテゴリーID記事数をそれぞれ変数に格納します。

$children = get_term_children($cat_id,'category');

get_term_children()を使って子孫カテゴリーのIDを取得します。

このget_term_children()は、子孫カテゴリーも持たないカテゴリーだった場合、WP_Errorのオブジェクトを返すので注意が必要です。

if(!is_wp_error($children)){
 $child_post_num = 0;
 foreach($children as $child){
  $child_data = get_category($child);
  $child_post_num += $child_data->category_count;
 }
  $post_num = $current_post_num + $child_post_num;   
}else{
  $post_num = $current_post_num;
}
return $post_num;

!is_wp_error()でWP_Errorを返してこなかった場合と返した場合という分岐をしています。

子孫カテゴリーを持っている場合、それぞれのカテゴリーIDを配列で返してきますので、foreach()を使ってそれぞれのカテゴリー記事数を取得します。

最後に、子孫の記事数合計と親の記事数を足して完了ということになります。

ちなみに、WP_Errorを返してきた場合は子孫カテゴリーを持っていないということになりますので、その時は最初の方で取得した現在のカテゴリー記事数を表示するという流れになっています。

これで無事に親子孫の記事数を取得できたのですが、あとはパンくずの問題ですね…

これに関しては、また別の機会で対策を紹介したいと思います。