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

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

新規登録して質問してみよう
ただいま回答率
85.49%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

987閲覧

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

tomato01

総合スコア80

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/07/22 13:19

編集2019/07/22 13:38

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

■実現をしたいこと

不動産系サイトで使わるような絞り込み検索(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) ""

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

php

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

としてるのに

php

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

としてるから

php

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

となりますよね

あと

php

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

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

投稿2019/07/24 04:38

KazuhiroHatano

総合スコア7804

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomato01

2019/07/24 15:18

ご回答を頂き誠にありがとうございます。 すみません、私のPHPの知識不足でご指摘を頂いた箇所の正しい形がまだわからない状態です。 もし可能でしたら、このコードの場合、どのように書けば正しく表示されそうでしょうか。 また、var_dumpの中身のご解説を頂けましたら幸いでございます。 よろしくお願い致します。
KazuhiroHatano

2019/07/24 15:40

1 変数名違いますよね、変数名にはハイフン使えませんしね 2 AND検索したいということなのに$metaqueryspが2つ以上ならば つまり一つでも入力があればOR検索になるようになってますよね 1と2が合わさってmeta_queryは so-toが-2〜9999997の間の値ならば条件一致となり 実質全件取得状態になってますよね
tomato01

2019/07/25 00:18

ご回答を頂き誠にありがとうございます。 とても理解ができました。 2に関してもう少しお伺いしたいことがあります。 そうしますと、複数使われている$metaqueryspの名前を$metaquerysp、$metaquerysp1、$metaquerysp2と名前を分ければ大丈夫そでしょうか。 また、その場合下記の記載はどのように変更をする必要があるでしょうか。 query_posts( array( 'tax_query' => $taxquerysp, 'meta_query' => $metaquerysp, 's' => $s, 'posts_per_page' => 20, 'paged' => $paged, )
KazuhiroHatano

2019/07/25 01:20

基本AND検索であるなら meta_queryのrelationをORにする意味がないように思います if( 1<count($metaquerysp) ) { $metaquerysp['relation'] = 'OR'; } は不要ではないでしょうか
tomato01

2019/07/25 14:46

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問