WordPressのカスタムタクソノミーで記事の絞り込み検索をする方法

WordPressのカスタムタクソノミーで記事の絞り込み検索をする方法 WordPress

今回はWordPressのカスタムタクソノミーで記事の絞り込み検索をする方法を紹介します。

チェックボックスにして複数の条件で絞り込み可能にします。

 

編集するファイルは以下の2つです。

  • searchform.php:カスタムタクソノミーのターム一覧を表示し、データをsearch.phpに送る
  • search.php:絞り込み条件を満たす記事一覧を表示する

 

チェックが入ったタームのデータは$_GET[]を使ってパラメーターとしてsearch.php送る→search.phpでは送られてきたパラメーターに適合する記事のみが表示される、という流れです。

 

スポンサーリンク

検索フォームを作る(searchform.php)

searachform.phpでやることは以下の通り。

  • カスタムタクソノミーのタームを一覧表示する
  • チェックが入ったタームのデータをパラメーターで送信する

送ったパラメーターはsearch.php$_GET[]で取得します。

 

検索フォームのコードはこんな感じです。

<form role="search" method="get" action="<?php echo esc_url(home_url('/')); ?>">
  <ul>
    <?php
      $terms = get_terms('カスタムタクソノミー名');
      foreach ( $terms as $term ) :
    ?>
    <li>
      <label>
      	<input type="checkbox" name="任意[]" value="<?php echo $term->slug; ?>"><?php echo $term->name; ?>
      </label>
    </li>
    <?php endforeach; ?>     
  </ul>
  <input type="hidden" name="s" value="<?php the_search_query(); ?>">        
  <input type="submit" value="検索する">
</form>

 

基本はWordPressのフォームですが、重要な点がいくつかあります。

  • <form>タグのmethod属性はgetであること
  • <form>タグのaction属性は<?php echo esc_url(home_url('/')); ?>と書くこと(検索フォームをトップページに置かない場合もです)
  • <input>name属性の末尾に[]をつけること([]をつけることで複数の値を渡せるようにします)
  • <input>value属性の値は各々のタームのスラッグにすること
  • テキストによる検索を行わない場合でも<input type="hidden" name="s" value="<?php the_search_query(); ?>">を隠しフィールドとして記述すること(これがないとフォームがうまく動作しません)

 

また、

<?php
  $terms = get_terms('カスタムタクソノミー名');
  foreach ( $terms as $term ) :
?>

この部分はカスタムタクソノミーのタームを一覧表示する処理です。

詳しい解説は以下にまとめたのでどうぞ。

>>【WordPress】カスタムタクソノミーのタームを一覧表示する方法

 

実際にパラメーターが渡される際は<input>タグにあるnamevalueが使用され、「https://hogehoge.com/?name=value」という形になります(valueにはタームのスラッグが入ります)

複数のパラメーターを渡した際は「https://hogehoge.com/?name=value&name=value&…」となります。

name属性はの値は好きに指定できるので、わかりやすい名前にしておきましょう。

 

検索結果ページ(search.php)を作る

searchform.phpで送られてきた条件をサブループに組み込み、表示する記事を絞り込みます。

ループ処理以外のコードはindex.phparchive.phpなど、記事一覧を表示するページと同じで構いません。

 

サブループで表示する記事の条件にsearchform.phpから送られてきたパラメーターを追加します。

<?php
// searchform.phpから送られてきたパラメーターを取得
$hoge = $_GET['name(任意)']; //searchform.phpの<input>のname属性の値と合わせる

// searchform.phpで絞り込み条件がある場合
if($hoge) {
	// 絞り込み条件を追加
  $taxquery_taxonomy = array(
    'taxonomy' => 'カスタムタクソノミー名',
    'terms' => $hoge, //取得したパラメーターが入る
    'field' => 'slug',
  );
}

// サブループで表示する記事の条件を指定
$args = array(
  'post_type' => '投稿タイプ名',
  'posts_per_page' => 10,
  's' => get_search_query(), //これ必須!
  // searchform.phpで送られてきた条件を追加
  'tax_query' => array( 
    'relation' => 'AND', //ANDかORのどちらかを指定(大文字)
    $taxquery_taxonomy,
  ),
);

// サブループ作成
$sub_query = new WP_Query( $args );
if ( $sub_query->have_posts() ) : 
  while ( $sub_query->have_posts() ) : 
  	$sub_query->the_post(); 
?>

<!-- ここにループ処理 -->

<?php endwhile;
endif;
wp_reset_postdata();
?>

 

少しコードが長いですが、細かく分けて見ればやっていることは難しくありません。

手順としては、

  1. searchform.phpから送られてきたパラメーターを$_GET[]で取得(値はsearchform.php<input>name属性の値と同じにする)
  2. 絞り込み条件がある場合、その条件を追加(あとで'tax_query'に渡しやすいよう上のように書いておくといい)
  3. サブループの条件の中に2の絞り込み条件を追加
  4. サブループで処理

という感じです。

 

'tax_query'は表示する記事の条件を細かく指定できるキーです。

ここにsearchform.phpから送られてきた条件を追加し、サブループに追加することで記事の絞り込みができます。

特定のカスタムタクソノミー'taxonomy' => 'カスタムタクソノミー名'にある、特定のスラッグ'field' => 'slug',を持つターム'terms' => $hogeを指定という感じです

$hogeには<input name="任意[]" value="<?php echo $term->slug; ?>">で取得したスラッグが入っています)

また、'tax_query'は条件をいくつも指定できるので複雑な条件の指定も可能です。

 

'tax_query'に関しては以下の記事が参考になりました。

WordPressの新機能 複数タクソノミークエリーまとめ
先日、「WordPress 3.1 RC3 をみんなでテスト! 」に参加し、その際、複数カスタムタクソノミークエリー(en. Multiple Taxonomy Handling)のテストを担当させてもらいました。 ついでに、仕様などについ

 

また、

// searchform.phpで送られてきた条件を追加
'tax_query' => array( 
  'relation' => 'AND', //ANDかORのどちらかを指定(大文字)
  $taxquery_taxonomy,
),

ここの'relation'はANDかORのどちらかを指定します。

  • AND:’tax_query'の条件を全て満たす記事を表示
  • OR:’tax_query'の条件のいずれかを満たす記事を表示

ORは'tax_query'が複数指定してある場合、そのうちどれか1つでも条件を満たしている記事を全て表示します。

 

それと、

's' => get_search_query(), //これ必須!

ここの記述を忘れないように注意しましょう!(これがないと検索がうまく機能しません)

 

あとはサブループを作成し、記事を表示する部分のHTMLを書けばokです。

検索結果ページではフォームで指定した条件がパラメーターとしてURLに表示されているはずです。このパラメーターで表示する記事を絞り込んでいるわけです。

 

まとめ

カスタムタクソノミーのタームを使って絞り込み検索をしたい場合はよくあると思います。

他にもカテゴリーやタグなども合わせて記事の絞り込みもできると思います。

'tax_query'の使い方をマスターすればどんな条件でも記事の絞り込みができるようになるので使えるようにしておくと便利です!