このエントリーをはてなブックマークに追加

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’,
);

理屈は難しくないが、実装から動作確認までは労力が要る。

2017.07.09 投稿 2017.07.11 更新

新しい情報を追記している場合はありますが、古い情報の修正はしていません。投稿日・文中の日付を参照してください。

Recent Articles