[wp]カスタム投稿で絞り込み検索する方法

カスタム投稿でスタッフを登録し、店舗別に表示したい。
タクソノミーで店舗を振り分けたので、投稿記事でいうところのタグとかカテゴリーの絞り込み検索ができたら望み通りの動作となる。

準備とか前提的なもの

カスタム投稿はCustom Post Type UIで構築。
投稿タイプスラッグ「staff」
タクソノミースラッグ「staff」
両方名前一緒だけど動作的にちゃんと別物だから気にしない。
(追記:一緒にすると管理画面の記事一覧でソート機能が死にます)

表示(検索結果)ページの作成

「archive-【投稿タイプ名】.php」がルールなので「archive-staff.php」を作る。
「search-staff.php」を作ってfunctions.phpで設定してもこっちに飛んだからもうこれでいいやってなってる。

とりあえず以下に目ぼしいソースを並べる。

検索部位

<form method="get" action="<?php bloginfo( 'url' ); ?>"><input type="hidden" name="post_type" value="staff" />
<select name="term">
	<option value="">選択</option>
	<?php $terms = get_terms('staff'); foreach($terms as $term): if ($term->slug != "" && $term->parent == 0 ): ?>
	<option value="<?php echo esc_attr($term->slug); ?>"><!--?php echo esc_html($term->name); ?></option>
	<?php endif; endforeach; ?>
</select>
<button type="submit">STAFFを検索</button></form>

「input type=”hidden” name=”post_type” value=”staff”」は「archive-staff.php」を表示させるためのおまじない。
タクソノミーでは店舗情報しか入れてないので、selectでタクソノミースラッグ「staff」の中身をありったけ並べる。
valueは「esc_attr($term->slug);」、idでもいいんだけど。
読めるように表示部分は「esc_html($term->name);」。

検索結果:該当ターム表示

<?php 
  $searchSlug = $_GET['term'];
  $terms = get_terms('staff');
  foreach($terms as $term):
    if($term->slug == $searchSlug):
      echo '<h1>'.esc_attr($term->name).'</h1>';
    endif;
  endforeach;
?>

selectで選んだslugを「staff」にぶち込んで、該当のnameを表示。

検索結果:投稿一覧

<?php
$args=array(
	'tax_query' => array(
array(
'taxonomy' => 'staff', //タクソノミーを指定
'field' => 'slug', //ターム名をスラッグで指定する
'terms' => array( $searchSlug) //表示したいタームをスラッグで指定
),
),
'post_type' => 'staff', //カスタム投稿名
'posts_per_page'=> -1, //表示件数(-1で全ての記事を表示)
'order' => 'ASC' //表示順(昇順)
);
?>
<?php query_posts( $args ); ?>
<?php if(have_posts()) : ?>
<ul>
<?php while(have_posts()):the_post() ?>
 	<li><?php the_title(); ?></li>
<?php endwhile; ?>
</ul>

<?php else: ?>

該当する記事はありません。

<?php endif; ?>

いっこ上のソースの「$searchSlug = $_GET[‘term’];」が連動してるので注意。

備考

URLはこんな感じになる。
http://hogehoge.jp/?post_type=staff&term=****
「term=****」はphpで料理してるからname自体なんでもいいんだけど、「post_type」は「archive-staff.php」と紐付いてるので間違わないように。

コメント

  1. とおりすがり。 より:

    ちゃんと絞り込みできました。かなりわかりやすくて、めちゃくちゃ助かりました。ありがとうございます!
    (絞り込み検索の実装って、なんでこんなにややこしいのでしょうか・・・)

    • megefeps より:

      コメントありがとうございます。

      確かに色々やっててめんどくさいですが、「どの投稿のどのタグで絞り込む」「絞り込みのラインナップは登録済みのスラッグから出力する」って指定してるので、慣れてしまえば道理だなって理解できる仕組みです。
      カスタム投稿のポスト名とタクソノミー名を一緒にすると管理画面の記事一覧でソートが効かなくなるので、もし一緒にしちゃってたらそれぞれ違う名前にしてあげてください。

タイトルとURLをコピーしました