【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タグにしています。