この記事は、「カテゴリーアーカイブを使った講師一覧」をサブカテゴリーでさらに絞り込む方法について記したものです。

 

スクリーンショット

講師カテゴリのサブカテゴリ

講師カテゴリのサブカテゴリ

親子カテゴリ間でテンプレートを共用

親子カテゴリ間でテンプレートを共用

 

手順

「講師」カテゴリ(スラッグ名:teacher)の下にさらに細分化したサブカテゴリを追加し、各講師の紹介記事を「講師」カテゴリおよびそれらサブカテゴリから選択して投稿します。

「講師」カテゴリーアーカイブテンプレートである「category-teacher.php」を、そのサブカテゴリにも適用するので、下記のコードを「functions.php」に追加します。

なお、「category-teacher.php」のサンプルは、「カテゴリーアーカイブを使った講師一覧」で作成したものを使います。

/**
 *  子カテゴリのテンプレートファイルがない場合は親カテゴリのテンプレートファイルを使う
 */
add_filter( 'category_template', 'my_category_template' );
function my_category_template( $template ) {
  $category = get_queried_object();
  if ( $category->parent != 0 &&
    ( $template == "" || strpos( $template, "category.php" ) !== false ) ) {
    $templates = array();
    while ( $category->parent ) {
      $category = get_category( $category->parent );
      if ( !isset( $category->slug ) ) break;
      $templates[] = "category-{$category->slug}.php";
      $templates[] = "category-{$category->term_id}.php";
    }
    $templates[] = "category.php";
    $template = locate_template( $templates );
  }
  return $template;
}

 

親カテゴリと子カテゴリの間で共通のカテゴリーアーカイブテンプレートを使用するので、体裁上、どちらも1ページ当たりの記事数を同じにする必要があります。そのため、下記のコードを「functions.php」に追加します。

/*
 *  「講師(teacher)」とそのサブカテゴリだけ1ページ当たりの記事数を3件にする
 */
add_action('pre_get_posts', 'category_teacher_per_page');
function category_teacher_per_page($wp_query){
  if(!is_admin()) {
    if($wp_query->is_main_query()){
      if($wp_query->is_category()){
        $c = get_category($wp_query->query['cat']);
        while($c->parent){
          $c = get_category($c->parent);
          if($c->slug == 'teacher'){
            break;
          }
        }
        if($c->slug == 'teacher'){
          $wp_query->set('posts_per_page', 3 );
        }
      }
    }
  }
}

 

参考にした記事