【WordPress】子カテゴリーで絞り込んで孫カテゴリーを表示させる方法

【WordPress】子カテゴリーで絞り込んで孫カテゴリーを表示させる方法

WordPressの投稿やカスタム投稿でカテゴリーの一覧を表示させることはあるかと思いますが、単に親カテゴリーや子カテゴリーの一覧を表示させるだけではなく、今回は孫カテゴリーを絞り込みで表示させる方法を紹介します。

活用シーンとしては、都道府県から市区町村など、階層が必要なカテゴリーやカスタムタクソノミーを使用した場合です。

WordPressのカテゴリーの絞り込みについて

チェックボックスでカテゴリーを絞り込み

本記事では、全国展開する飲食店のサイトを例とし、カスタム投稿「店舗情報:shop」を作成し、エリアをカテゴリー(カスタムタクソノミー)で設定しています。

親カテゴリーが「地域」、子カテゴリーが「都道府県」、そして孫カテゴリーが「市区町村」です。

親カテゴリーごとに子カテゴリーを出力し、チェックボックスで選択した都道府県をさらに絞り込み、孫カテゴリーとしての市区町村を表示させます。

カテゴリーを絞り込む実装例

実装イメージとしては、まず下記スクショのように親カテゴリーの地域ごとに、子カテゴリーの都道府県を出力します。

子カテゴリーの都道府県は、選択できるようにチェックボックスで出力します。

チェックボックスで都道府県を選択し、「さらにエリアを絞り込む」をクリックすると、選択した都道府県ごとに孫カテゴリーの市区町村が出力される仕組みです。

WordPressのカテゴリーを絞り込む実装方法

親カテゴリーごとの子カテゴリー表示方法

それでは、カテゴリーを絞り込む実装方法を紹介します。

※ここではカスタム投稿やカスタムタクソノミーの作り方や設定方法は割愛します。

<form method="get" action="<?php echo esc_url( home_url( '/area-detail/' ) ); ?>">
  <?php
  // 親カテゴリーを出力
  $taxonomyName = "area";
  $args = array(
    'parent' => 0
  );
  $terms = get_terms($taxonomyName,$args);
  foreach ($terms as $term) { ?>
  <dl>
    <dt>
      <span id="<?php echo $term->slug; ?>"><?php echo $term->name; ?></span>
    </dt>
    <dd>
      <?php
      // 親カテゴリーの情報を元に子カテゴリーを出力
      $parentId = $term->term_id;
      $childargs = array(
        'parent' => $parentId,
        'hide_empty' => true
      );
      $childterms = get_terms($taxonomyName,$childargs);
      foreach ($childterms as $childterm) {
        $targetSlug = $childterm->slug;
      ?>
      <label>
        <input type="checkbox" name="area[]" value="<?php echo $targetSlug; ?>">
        <span><?php echo $childterm->name; ?></span>
      </label>
      <?php wp_reset_postdata(); }?>
    </dd>
  </dl>
  <?php }?>
  <button type="submit">さらにエリアを絞り込む</button>
</form>

formタグを使用し、チェックボックスで選択した子カテゴリーの都道府県の値(area)をGET送信し、孫カテゴリーを出力させるページに遷移します。

※本記事では、「area-detail」というスラッグの固定ページを作成し、孫カテゴリーの出力先にしています。

選択された子カテゴリーの孫カテゴリーを表示させる方法

次に、絞り込まれた子カテゴリーの孫カテゴリーである「市区町村」の出力先の実装方法です。

※出力先は「area-detail」というスラッグの固定ページを用意しています。

<?php
$taxonomy_name = 'area';
// 子カテゴリーを取得
$areCities = $_GET['area'];
foreach ( $areCities as $areCitiy ) { ?>
<dl>
  <?php
  $term = get_term_by( 'slug', $areCitiy, $taxonomy_name);
  $term_id = $term->term_id;
  ?>
  <dt>
    <span><?php echo $term->name;?></span>
  </dt>
  <dd>
    <?php
    // 孫カテゴリーを出力
    $termchildren = get_term_children( $term_id, $taxonomy_name );
    foreach ( $termchildren as $child ) :?>
    <?php $term = get_term_by( 'id', $child, $taxonomy_name );?>
      <a href="<?php echo esc_url( home_url( '/shop/' ) ); ?>area/<?php echo $term->slug; ?>"><?php echo $term->name; ?></a>
    <?php endforeach; ?>
  </dd>
</dl>
<?php } ?>

GET送信されたarea(子カテゴリー)を元に、孫カテゴリーである市区町村を出力しています。

※本記事では、出力された市区町村にリンクを設定し、それぞれの一覧ページに遷移するようにaタグにしています。

カテゴリー