🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
WordPress

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

Q&A

解決済

1回答

1623閲覧

フリーワード&カスタムフィールドでの検索

toshi-104

総合スコア12

WordPress

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

0グッド

0クリップ

投稿2020/01/01 22:45

検索フィールドの値、カスタムフィールドで検索をしたいと考えており、以下のコードを記載しております。
「$_POST」での値は全て取得できております。

「$args = array(」以下の、
「's' => $s,」の使い方(条件)がマズいと思うのですが、
なかなか思い通りにいきません。。。

ご存じの方がいらっしゃいましたらご教授いただければ幸いです。

//コード

<?php $s = $_POST['s']; $searchArea = $_POST['searchArea']; $searchType = $_POST['searchType']; $searchBed = $_POST['searchBed']; $searchRent = $_POST['searcRent']; $AsearchRent = explode(",",$searchRent); $sb_min_rent = $AsearchRent[0]; $sb_max_rent = $AsearchRent[1]; ?> <?php if(isset($searchArea)) { $metaquerysp[] = array( 'key'=> 'property-area', 'value'=> $searchArea, 'relation' => 'OR' ); } if(isset($searchType)) { $metaquerysp[] = array( 'key'=> 'property-type', 'value'=> $searchType, 'relation' => 'OR' ); } if(isset($searchBed)) { $metaquerysp[] = array( 'key'=> 'property-bed', 'value'=> $searchBed, 'relation' => 'OR' ); } if(!empty($sb_min_rent) && !empty($sb_max_rent)) { $metaquerysp[] = array( 'key'=>'property-rent', 'value'=> array( $sb_min_rent, $sb_max_rent ), 'compare'=>'BETWEEN', 'type'=>'NUMERIC', ); } $args = array( 'post_type' => 'property', //投稿タイプの指定 's' => $s, 'meta_query' => array( 'relation' => 'AND', $metaquerysp, ) ); $my_query = new WP_Query($args); ?>

//

検索系プラグインは、

「Search Everything」
「Simplicity Add Fields Search Engine」

を使用しております。

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

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

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

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

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

guest

回答1

0

ベストアンサー

search.phpテンプレートでWordPressの検索機能を利用したいのでしたら
サイトルート(https://example.comなど)に対してGET通信でsパラメータを送信する必要があります。

なので受け取る時はこうですね。
$s = $_GET['s'];


修正

sの検索とmeta_queryをarray_mergeしてuniqueしてみてはどうでしょう?

php

1$q1 = new WP_Query( array( 2 'post_type' => 'property', 3 's' => $s 4)); 5 6$q2 = new WP_Query( array( 7 'post_type' => 'property', 8 'meta_query' => array( 9 'relation' => 'AND', 10 $metaquerysp, 11) 12)); 13 14$result = new WP_Query( 15 [ 16 'post_type' => 'property', 17 'paged' => $paged, 18 'post_status' => 'publish' 19 ] 20); 21$result->posts = array_unique( array_merge( $q1->posts, $q2->posts ), SORT_REGULAR );

投稿2020/01/02 12:05

編集2020/01/04 02:46
madone99

総合スコア1857

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

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

toshi-104

2020/01/02 22:42

ありがとうございます! フォーム側を「method="get"」に変更し、 受け取り側を <?php $s = $_GET['s']; $searchArea = $_GET['searchArea']; $searchType = $_GET['searchType']; $searchBed = $_GET['searchBed']; $searchRent = $_GET['searcRent']; $AsearchRent = explode(",",$searchRent); $sb_min_rent = $AsearchRent[0]; $sb_max_rent = $AsearchRent[1]; ?> といった感じで変更。 しかし、結果は同じで・・・^^; 各値はechoで確認できるのですが、うまく検索結果を得られません。 <?php $paged = get_query_var('paged') ? get_query_var('paged') : 1; if(isset($searchArea)) { $metaquerysp[] = array( 'key'=> 'property-area', 'value'=> $searchArea, 'relation' => 'OR' ); } if(isset($searchType)) { $metaquerysp[] = array( 'key'=> 'property-type', 'value'=> $searchType, 'relation' => 'OR' ); } if(isset($searchBed)) { $metaquerysp[] = array( 'key'=> 'property-bed', 'value'=> $searchBed, 'relation' => 'OR' ); } if(!empty($sb_min_rent) && !empty($sb_max_rent)) { $metaquerysp[] = array( 'key'=>'property-rent', 'value'=> array( $sb_min_rent, $sb_max_rent ), 'compare'=>'BETWEEN', 'type'=>'NUMERIC', ); } $args = array( 'post_status' => 'publish', 'post_type' => 'property', 'paged' => $paged, 's' => $s, 'meta_query' => array( 'relation' => 'AND', $metaquerysp, ) ); $my_query = new WP_Query($args); ?> 上記の検索条件部分、「$args」の中の、 「's' => $s,」を外せば、 ・カスタムフィールドで検索OK。 ・検索ワードではNG 「's' => $s,」を入れれば、 ・カスタムフィールドで検索NG。 ・検索ワードではOK。 以下の部分の記述がまずいのかな?と思っています。 $args = array( 'post_status' => 'publish', 'post_type' => 'property', 'paged' => $paged, 's' => $s, 'meta_query' => array( 'relation' => 'AND', $metaquerysp, ) ); 年始のお忙しい時期、申し訳ございません・・・
madone99

2020/01/03 05:11 編集

詳細な状況ありがとうございます。 別々だと検索できるということでしたら、それぞれを結合してしまえばどうでしょう? 回答のコードを変更しましたので、ご参考にして下さい。
toshi-104

2020/01/03 05:39

再度のご教授、本当にありがとうございます! おんぶにだっこで本当に申し訳ございません。 もともとのループの部分は、 <?php if ($my_query->have_posts()) : while ($my_query->have_posts()) : $my_query->the_post();?> ・・・ <?php endwhile; ?> <?php else: ?> ・・・ <?php endif; ?> <?php wp_reset_query(); ?> でした。 こちらも関係してきますよね? 「$my_query」の部分。
madone99

2020/01/03 05:54 編集

はい、提示コードの$result が検索結果を結合したものになっていますので 名前は自由に変更して頂いて結構ですが、 if ($result->have_posts()) : while ($result->have_posts()) : $result->the_post(); のようになります。 あと、細かい部分ですが、最後はwp_reset_postdata()になります。 https://togetter.com/li/502958
toshi-104

2020/01/03 08:00

何度もありがとうございますm(_ _)m 繁栄してみましたが、ダメでした(T T) いただいたコードを邪魔する何かがどこかにあるのかもしれません。。。 念のため、全ソースを記載しますが、お時間があれば出構いません。 今更ですが、あまりご迷惑をおかけするわけにもいきません。 本当に申し訳ございません!! <?php get_header(); ?> <?php $s = $_GET['s']; $searchArea = $_GET['searchArea']; $searchType = $_GET['searchType']; $searchBed = $_GET['searchBed']; $searchRent = $_GET['searcRent']; $AsearchRent = explode(",",$searchRent); $sb_min_rent = $AsearchRent[0]; $sb_max_rent = $AsearchRent[1]; $searcBreadth = $_GET['searcBreadth']; $AsearcBreadth = explode(",",$searcBreadth); $sb_min_brd = $AsearcBreadth[0]; $sb_max_brd = $AsearcBreadth[1]; ?> <?php if(isset($searchArea)) { $metaquerysp[] = array( 'key'=> 'property-area', 'value'=> $searchArea, 'relation' => 'OR' ); } if(isset($searchType)) { $metaquerysp[] = array( 'key'=> 'property-type', 'value'=> $searchType, 'relation' => 'OR' ); } if(isset($searchBed)) { $metaquerysp[] = array( 'key'=> 'property-bed', 'value'=> $searchBed, 'relation' => 'OR' ); } if(!empty($sb_min_brd) && !empty($sb_max_brd)) { $metaquerysp[] = array( 'key'=>'property-breadth', 'value'=> array( $sb_min_brd, $sb_max_brd ), 'compare'=>'BETWEEN', 'type'=>'NUMERIC', ); } if(!empty($sb_min_rent) && !empty($sb_max_rent)) { $metaquerysp[] = array( 'key'=>'property-rent', 'value'=> array( $sb_min_rent, $sb_max_rent ), 'compare'=>'BETWEEN', 'type'=>'NUMERIC', ); } $q1 = new WP_Query( array( 'post_type' => 'property', 's' => $s ) ); $q2 = new WP_Query( array( 'post_type' => 'property', 'meta_query' => array( 'relation' => 'AND', $metaquerysp, ) ) ); $result = new WP_Query(); $result->posts = array_unique( array_merge( $q1->posts, $q2->posts ), SORT_REGULAR ); ?> <div class="content inview maxWidth"> <div class="flex fWrap sS" id="searchRes"> <?php if( $s ): ?> <span class="bLine1 paddBox1"><?php echo $s; ?></span> <?php endif; ?> <?php if(isset( $searchArea ) ): ?> <span class="bLine1 paddBox1"><?php echo implode(' </span><span class="bLine1 paddBox1"> ', $searchArea); ?></span> <?php endif; ?> <?php if(isset( $searchType ) ): ?> <span class="bLine1 paddBox1"><?php echo implode(' </span><span class="bLine1 paddBox1"> ', $searchType); ?></span> <?php endif; ?> <?php if(isset( $searchBed ) ): ?> <span class="bLine1 paddBox1"><?php echo implode(' </span><span class="bLine1 paddBox1"> ', $searchBed); ?></span> <?php endif; ?> <?php if( $sb_min_rent !== '0' ): ?> <?php $min_rent = ($sb_min_rent == "0") ? "下限なし" : $sb_min_rent ."USD"; $max_rent = ($sb_max_rent == "999999") ? "上限なし" : $sb_max_rent ."USD"; echo '<span class="bLine1 paddBox1">' . $min_rent . ' ~ ' . $max_rent . '</span>'; ?> <?php endif; ?> <?php if( $sb_min_brd !== '0' ): ?> <?php $min_brd = ($sb_min_brd == "0") ? "下限なし" : $sb_min_brd ."㎡"; $max_brd = ($sb_max_brd == "999999") ? "上限なし" : $sb_max_brd ."㎡"; echo '<span class="bLine1 paddBox1">' . $min_brd . ' ~ ' . $max_brd . '</span>'; ?> <?php endif; ?> </div> <div class="flex fWrap w2-3-4 paddOut0"> <?php wp_reset_postdata(); ?> <?php if ($result->have_posts()) : while ($result->have_posts()) : $result->the_post(); ?> <div class="paddBox0"> <div class="inview bLine1 propertyBox"> <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>" class="decoNone bLine1 block propertyLink pRel"> <div class="propertyslider fullW fullH pAbs"> <ul class="slides fullW fullH"> <li class="sImage fullW fullH decoNone"> <?php $image = wp_get_attachment_image_src(get_field('property-photo_main'), 'thumbnail'); ?> <img src="<?php echo $image[0]; ?>" alt="<?php the_title(); ?>" class="over0 propertyImg"> </li> <?php if(have_rows('property-photo_sub')): ?> <?php while(have_rows('property-photo_sub')): the_row(); ?> <li class="sImage fullW fullH decoNone"> <?php $image = wp_get_attachment_image_src(get_sub_field('photo-file'), 'thumbnail'); ?> <img src="<?php echo $image[0]; ?>" alt="<?php the_title(); ?>" class="over0 propertyImg"> </li> <?php endwhile; ?> <?php endif; ?> </ul> <?php echo do_shortcode('[favorite_button]'); ?> </div> <span class="fDes1 flex fvC fhLR fWrap fullW pAbs propertyTitle"><span><span class="s2L bold"><?php the_field('property-rent'); ?></span>USD</span><span><?php the_field('property-area'); ?></span></span> </a> <div class="flex fhLR fWrap propertyInfo"> <div class="fullW flex bold"><span class="mRight"><?php the_ID(); ?></span> <span class="txtOF block"><?php the_title(); ?></span></div> </div> </div> </div> <?php endwhile; ?> <?php else: ?> <p class="s2L flex fhC">物件が見つかりません</p> <?php endif; ?> <?php wp_reset_postdata(); ?> </div> </div> <?php get_footer(); ?>
madone99

2020/01/03 08:03

ループの前でリセットしているからでしょうか? <?php wp_reset_postdata(); ?> <?php if ($result->have_posts()) : while ($result->have_posts()) : $result->the_post(); ?>
toshi-104

2020/01/03 08:08

すみません、一度試したあとで、入れてみました!! 外してみましたが、行きませんでした(><) 現状では、なにもヒットしなくなっております。
madone99

2020/01/03 12:45 編集

コードはテーマ内のsearch.phpに記入されておりますか? また、フォームの送信先はドメインルートでしょうか?
toshi-104

2020/01/03 23:08

ご返信ありがとうございます! コードはsearch.php内です。 <form role="search" method="get" id="searchform" name="s" action="<?php bloginfo('url'); ?>" class="fullW flex fvS fhLR fWrap"> で送信しております。
madone99

2020/01/04 00:13

formの属性にname=“s”があるのが気になりますが、こちらでも近い環境にして確認してみますね。
toshi-104

2020/01/04 00:48

そこまでしていただけるなんて。。。(T T) 本当に申し訳ございません(><)
madone99

2020/01/04 02:46 編集

修正した回答コードのように、$resultに共通のパラメータを入れることで結果表示できました! (ただ、こちらで入れたsearchTypeなどのデータが悪かったのか、$q2はヒットしませんでした。) また、検索結果の方は原因切り分けのために以下のようなミニマムなものに しましたので多少修正が必要かも知れません。 <div class="content inview maxWidth"> <div class="flex fWrap w2-3-4 paddOut0"> <?php if ($result->have_posts()) : while ($result->have_posts()) : $result->the_post(); ?> <div class="paddBox0"> <?php the_title(); ?> </div> <?php endwhile; ?> <?php else: ?> <p class="s2L flex fhC">物件が見つかりません</p> <?php endif; ?> <?php wp_reset_postdata(); ?> </div> </div>
toshi-104

2020/01/06 05:22

いろいろありがとうございました!! やっぱり駄目でした(><) プラグイン、テンプレート上の何かが邪魔をしているのかもしれません。 ここまでお付き合いいただき本当に感謝です!! 無念ではありますが、 今回は、「$s」に値があるかどうかで条件分岐し、 あればフリーワードで、なければカスタムフィールドで・・・ ということにしました^^; いままで本当にありがとうございました!!! 今後ともよろしくお願いいたしますm(_ _)m
madone99

2020/01/06 06:10

それは残念ですね。。 テーマやプラグインで、となると選択が悩ましいところですね。 こちらこそよろしくお願いいたします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問