質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.34%

wordpressプラグインを使わずにカスタムフィールドで絞り込み検索

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,169

score 61

よろしくお願いいたします。 

■実現をしたいこと

不動産系サイトで使わるような絞り込み検索(AND検索)の設置を試みています。(wordpress)

絞り込み検索の検索軸

0,キーワード検索
1,エリア(大阪、京都、 etc..)  カテゴリーの値を基にしたセレクトボックス
2,築年数(3年、5年 etc..)   カスタムフィールドのセレクトボックスの値をもとにしたセレクトボックス
3,価格帯(上限~下限金額のレンジ) カスタムフィールドのテキストボックスの値をもとにしたセレクトボックス
4,総戸数(上限~下限数値のレンジ) カスタムフィールドのテキストボックスの値をもとにしたセレクトボックス
5,駅から徒歩(5分、10分 etc...) カスタムフィールドのセレクトボックスの値をもとにしたセレクトボックス
6,間取り(1DK、2DK etc..)       カスタムフィールドのセレクトボックスの値をもとにしたセレクトボックス
7,こだわり条件(ペット可、新築 etc..)  カスタムフィールドのチェックボックスの値をもとにしたチェックボックス

■発生している問題

上記の2、4、5、6、7の検索軸が正しく動作せず、うまく絞り込みができません。(全ての数の検索結果となる。)
どなたかご教授を頂けますでしょうか。

■使用しているコード

search.php

<?php
$s = $_GET['s'];
$catnum = $_GET['catnum'];
$type1 = $_GET['house_year'];
$type = $_GET['eki-toho'];
$type2 = $_GET['madori'];
$kodawari = $_GET['kodawari'];
$low = $_GET['low'];
$high = $_GET['high'];
$low2 = $_GET['low-2'];
$high2 = $_GET['high-2'];


if($catnum){
    $taxquerysp[] = array(
            'taxonomy'=>'category',
            'terms'=> $catnum,
            'include_children'=>false,
            'field'=>'term_id',
            'operator'=>'AND'
            );
}

$taxquerysp['relation'] = 'AND';


if($kodawari){
    foreach($kodawari as $val){
        $metaquerysp[] = array(
                'key'=>'kodawari',
                'value'=> $val,
                );
    }
}


if($type){
    $metaquerysp[] = array(
            'key'=>'eki-toho',
            'value'=> $type,
            'compare'=>'=',
            );
}

if($type2){
    $metaquerysp[] = array(
            'key'=>'madori',
            'value'=> $type2,
            'compare'=>'=',
            );
}

if($type1){
    $metaquerysp[] = array(
            'key'=>'house_year',
            'value'=> $type1,
            'compare'=>'=',
            );
}

$metaquerysp[] = array(
            'key'=>'price',
            'value'=>array( $low, $high ),
            'compare'=>'BETWEEN',
            'type'=>'NUMERIC',
            );

$metaquerysp[] = array(
            'key'=>'so-to',
            'value'=>array( $low-2, $high-2 ),
            'compare'=>'BETWEEN',
            'type'=>'NUMERIC',
            );
$metaquerysp['relation'] = 'AND';

?>

<?php
if( 1<count($metaquerysp) ) {
   $metaquerysp['relation'] = 'OR';
}
?>

  <?php

  query_posts( array(
      'tax_query' => $taxquerysp,
      'meta_query' => $metaquerysp,
      's' => $s,
      'posts_per_page' => 20,
      'paged' => $paged,
    )
);

?>

            <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<div><?php the_title(); ?></div>
<div><?php the_content(); ?></div>
            <?php endwhile; else : ?>

該当なし

            <?php endif; ?>

検索の側

<form method="get" id="searchform" action="search">
      <label for="s" class="serch-ttl">マンション名で検索</label>
        <input type="text" class="field" name="s" id="s" placeholder="検索" />

        <p class="serch-ttl">エリア</p>
        <select name="catnum" class="search-select">
          <option value="" selected>指定しない</option>
                                        <?php
    $categories = get_categories('parent=0');
    foreach($categories as $category) :
    ?>
        <option value="<?php echo $category->term_id; ?>"><?php echo $category->cat_name; ?></option>
    <?php endforeach; ?>
    </select>

    <p class="serch-ttl">築年数</p>

      <select name="house_year" class="search-select">
        <option value="" selected>指定しない</option>
        <option value="新築">新築</option>
        <option value="3年以内">3年以内</option>
        <option value="5年以内">5年以内</option>
        <option value="10年以内">10年以内</option>
        <option value="20年以内">20年以内</option>
        <option value="30年以内">30年以内</option>
      </select>

    <p class="serch-ttl">価格帯</p>

      <select name="low" class="search-select range">
        <option value="0" selected>下限なし</option>
        <option value="500">500万以上</option>
        <option value="1000">1,000万以上</option>
        <option value="2000">2,000万以上</option>
        <option value="3000">3,000万以上</option>
        <option value="4000">4,000万以上</option>
        <option value="5000">5,000万以上</option>
        <option value="6000">6,000万以上</option>
        <option value="7000">7,000万以上</option>
        <option value="8000">8,000万以上</option>
        <option value="9000">9,000万以上</option>
      </select>
      <p class="kara"></p>
    <select name="high" class="search-select range">
      <option value="500">500万以下</option>
      <option value="1000">1,000万以下</option>
      <option value="2000">2,000万以下</option>
      <option value="3000">3,000万以下</option>
      <option value="4000">4,000万以下</option>
      <option value="5000">5,000万以下</option>
      <option value="6000">6,000万以下</option>
      <option value="7000">7,000万以下</option>
      <option value="8000">8,000万以下</option>
      <option value="9000">9,000万以下</option>
      <option value="9999999" selected>上限なし</option>
    </select>

    <p class="serch-ttl">総戸数</p>

    <select name="low-2" class="search-select range">
      <option value="0" selected>下限なし</option>
      <option value="50">50戸以上</option>
      <option value="100">100戸以上</option>
      <option value="200">200戸以上</option>
      <option value="300">300戸以上</option>
    </select>
    <p class="kara"></p>
    <select name="high-2" class="search-select range">
      <option value="50">50戸以下</option>
      <option value="100">100戸以下</option>
      <option value="200">200戸以下</option>
      <option value="300">300戸以下</option>
      <option value="9999999" selected>上限なし</option>
    </select>


    <p class="serch-ttl">駅から徒歩</p>

      <select name="eki-toho" class="search-select">
        <option value="" selected>指定しない</option>
        <option value="5分以内">5分以内</option>
        <option value="10分以内">10分以内</option>
        <option value="15分以内">15分以内</option>
        <option value="30分以内">30分以内</option>
        <option value="30分以上">30分以上</option>
      </select>

    <p class="serch-ttl">間取り</p>

        <select name="madori" class="search-select">
          <option value="" selected>指定しない</option>
          <option value="1K/DK/LDK">1K/DK/LDK</option>
          <option value="2K/DK/LDK">2K/DK/LDK</option>
          <option value="3K/DK/LDK">3K/DK/LDK</option>
          <option value="4K/DK/LDK">4K/DK/LDK</option>
          <option value="5K/DK/LDK">5K/DK/LDK</option>
        </select>

<p class="serch-ttl">こだわり条件</p>
    <label class="checkLabel"><input type="checkbox" name="kodawari[]" value="タワーマンション">タワーマンション</label>
    <label class="checkLabel"><input type="checkbox" name="kodawari[]" value="低層マンション">低層マンション</label>
    <label class="checkLabel"><input type="checkbox" name="kodawari[]" value="ハイグレードマンション">ハイグレードマンション</label>
    <label class="checkLabel"><input type="checkbox" name="kodawari[]" value="駅近">駅近</label>
    <label class="checkLabel"><input type="checkbox" name="kodawari[]" value="新築・築浅">新築・築浅</label>
    <label class="checkLabel"><input type="checkbox" name="kodawari[]" value="ぺット飼育化">ぺット飼育化</label>
    <label class="checkLabel"><input type="checkbox" name="kodawari[]" value="大規模">大規模</label>

    <input type="submit" class="submit" name="submit" id="searchsubmit" value="検索" />
    </form>


■試したこと

var_dump($metaquerysp); var_dump($s);

出力結果

array(3) { [0]=> array(4) { ["key"]=> string(5) "price" ["value"]=> array(2) { [0]=> string(1) "0" [1]=> string(7) "9999999" } ["compare"]=> string(7) "BETWEEN" ["type"]=> string(7) "NUMERIC" } [1]=> array(4) { ["key"]=> string(5) "so-to" ["value"]=> array(2) { [0]=> int(-2) [1]=> int(9999997) } ["compare"]=> string(7) "BETWEEN" ["type"]=> string(7) "NUMERIC" } ["relation"]=> string(2) "OR" } string(0) ""

var_dump($taxquerysp); var_dump($s);

出力結果

array(1) { ["relation"]=> string(3) "AND" } string(0) ""
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

$low2 = $_GET['low-2'];
$high2 = $_GET['high-2'];


としてるのに

'value'=>array( $low-2, $high-2 ),


としてるから

 array(2) { [0]=> int(-2) [1]=> int(9999997) 


となりますよね

あと

if( 1<count($metaquerysp) ) {
   $metaquerysp['relation'] = 'OR';
}


と書いてればまあほぼOR検索になりますよね

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/25 09:18

    ご回答を頂き誠にありがとうございます。
    とても理解ができました。

    2に関してもう少しお伺いしたいことがあります。

    そうしますと、複数使われている$metaqueryspの名前を$metaquerysp、$metaquerysp1、$metaquerysp2と名前を分ければ大丈夫そでしょうか。

    また、その場合下記の記載はどのように変更をする必要があるでしょうか。

    query_posts( array(
    'tax_query' => $taxquerysp,
    'meta_query' => $metaquerysp,
    's' => $s,
    'posts_per_page' => 20,
    'paged' => $paged,
    )

    キャンセル

  • 2019/07/25 10:20

    基本AND検索であるなら
    meta_queryのrelationをORにする意味がないように思います

    if( 1<count($metaquerysp) ) {
    $metaquerysp['relation'] = 'OR';
    }

    は不要ではないでしょうか

    キャンセル

  • 2019/07/25 23:46

    ご回答を頂き誠にありがとうございます。

    お伝えを頂いた点をはずしてみたのでですが、ちょっとうまく検索ができませんでした。
    尚、$metaquerysに関連する構文を外し、$taxqueryspだけの検索の場合はうまくひかかる状態です。

    詳しいご回答を頂きありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る