情報を追記している場合はありますが、古い情報を訂正はしていませんので、公開年月日を参照してください。プラグイン・タグ、いずれもワードプレス・PHPのバージョン等によって動作しない場合もあります。
2012年に書いた絞り込み検索の記事にちょくちょくアクセスがあるのだけど、記事が古いので、昨年作成した不動産サイトの例を覚え書きとして。
カスタム投稿タイプ売買と賃貸、それぞれタクソノミーが種別(一戸建て、マンションなど)と地域と沿線、カスタムフィールドで価格や特記事項。
フォームは種別のアーカイブに表示。種別によって内容が違うので、それぞれで分岐。以下は売買・一戸建ての地域と沿線(子タームが駅)、それぞれタームと投稿数をチェックボックスで。
結果側は売買と賃貸でページが違うので、投稿タイプの値は入れていない。
<form method="get" id="searchform" action="<?php echo esc_url( home_url( '/' ) ); ?>result.html"> <input type="hidden" name="type" value="kodate"> <ul><?php $categories = get_terms('area','hide_empty=1'); foreach ($categories as $category) { ?> <?php $args = array( 'post_type' => 'buy', 'tax_query' => array( 'relation' => 'AND', array( 'taxonomy' => 'type', 'field' => 'slug', 'terms' => 'kodate' ), array( 'taxonomy' => 'area', 'field' => 'slug', 'terms' => $category->slug ) ) ); $areacount = new WP_Query($args); if ($areacount->found_posts > 0) { ?> <li><label><input type="checkbox" name="area[]" value="<?php echo $category->slug; ?>" /> <?php echo $category->name; ?>(<?php echo $areacount->found_posts; ?>)</label></li> <?php } ?> <?php } ?></ul> <div> <?php $categories = get_terms('line','parent=0&hide_empty=1'); foreach ( $categories as $cat ) { ?> <?php $args = array( 'post_type' => 'buy', 'tax_query' => array( 'relation' => 'AND', array( 'taxonomy' => 'type', 'field' => 'slug', 'terms' => 'kodate' ), array( 'taxonomy' => 'line', 'field' => 'slug', 'terms' => $cat->slug ) ) ); $linecount = new WP_Query($args); if ($linecount->found_posts > 0) { ?> <ul> <li><input type="checkbox" name="line[]" value="<?php echo $cat->slug; ?>" /> <label><?php echo $cat->name; ?>(<?php echo $linecount->found_posts; ?>)</label></li> <?php $children = get_terms('line','hierarchical=0&hide_empty=1&child_of='.$cat->term_id); foreach ( $children as $child ) { ?> <?php $args = array( 'post_type' => 'buy', 'tax_query' => array( 'relation' => 'AND', array( 'taxonomy' => 'type', 'field' => 'slug', 'terms' => 'kodate' ), array( 'taxonomy' => 'line', 'field' => 'slug', 'terms' => $child->slug ) ) ); $linecount = new WP_Query($args); if ($linecount->found_posts > 0) { ?> <li><input type="checkbox" name="line[]" value="<?php echo $child->slug; ?>" /> <label><?php echo $child->name; ?>(<?php echo $linecount->found_posts; ?>)</label></li> <?php }}} ?></ul><?php } ?> </div> ~</form>
結果側は
$type = $_GET[‘type’];
$area = $_GET[‘area’];
$line = $_GET[‘line’];
$min_price = $_GET[‘min_price’];
$max_price = $_GET[‘max_price’];
のようにフォームから送られた値を受け取り、フォームのチェックが必須でない場合はif($area){ のように分岐を付けて、tax_query、meta_query に入れる。
tax_query の例
array(
‘taxonomy’=>’area’,
‘terms’=> $area,
‘field’=>’slug’,
‘operator’=>’IN’
);
meta_query の例
array(
‘key’=>’price’,
‘value’=>array( $min_price, $max_price ),
‘compare’=>’BETWEEN’,
);
理屈は難しくないが、実装から動作確認までは労力が要る。