人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

WordPressにおけるPHPの超初歩的な質問をさせてください。
カスタムフィ?ルドで住所デ?タ(address)を作っており、各投稿にはそれぞれ住所が入っております。
ここまでが前提。
そして、固定ペ?ジに作った入力フォ?ムに、ユ?ザ?が住所を入れ「検索」ボタンを押すと、ユ?ザ?が入れた住所(place)に一致する住所を持つ投稿が一覧で表示されるようにしております。
下記コ?ド12行目で、$placeに値がある場合のみル?プが始まるようにしているのですが、それではどんな値を入力されてもル?プが始まってしまうので、入力された住所に、一致する投稿がある場合のみ、ル?プが始まるようにしたいのです。
この12行目をどう書き換えるべきでしょうか。
教えてください、よろしくお願いいたします。

<?php
$place = $_POST['place'];
$args = Array(
'post_type' => 'post',
'posts_per_page' => -1,
'meta_query' => array(array(
'key' => 'address',
'value' => $place,
'compare' => 'LIKE'
))
);
if ($place)
$the_query = new WP_Query($args);
while($the_query -> have_posts()): $the_query -> the_post();
?>

●質問者: mocchi
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

質問者から

できれば、入力された住所に該当する投稿がない場合、「該当する投稿はありませんでした」と表示したいです。


1 ● TransFreeBSD
●35ポイント

have_posts()で条件分岐(if?)してください。
https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/WP_Query#.E3.81.B5.E3.81.A4.E3.81.86.E3.81.AE.E3.83.AB.E3.83.BC.E3.83.97
「// no posts found」のところに該当なしの表示を入れれば良いはずです。


mocchiさんのコメント
以下のようなエラ?表示になりまして、ちょっと苦戦しております。 ホニャララ.com ページは機能していません ホニャララ.com では現在このリクエストを処理できません。 その他いろいろと調べているのですが、初期表示の画面ではル?プを始めず、$placeに値が入って初めて(入力フォ?ムに地名が入力されて、初めて)ル?プが始まるようにしようとすればハ?ドルがぐっと上がる感じになってる気がしてまして。。

2 ● a-kuma3
●950ポイント ベストアンサー

こんな感じだと、どうでしょうか。

<?php
 $place = $_POST['place'];
 $args = Array(
 'post_type' => 'post',
 'posts_per_page' => -1,
 'meta_query' => array(array(
 'key' => 'address',
 'value' => $place,
 'compare' => 'LIKE'
 ))
 );
 if ($place) {
 $the_query = new WP_Query($args);
 if ($the_query -> have_posts()) {
 while($the_query -> have_posts()) {
 $the_query -> the_post();
 }
 } else {
 echo "該当する投稿はありませんでした";
 }
 } else {
 echo "住所を指定してください";
 }
?>

mocchiさんのコメント
わざわざコ?ドまで書いていただき恐縮です。 こちらのコ?ドに置き換えたところ、以下のようなエラ?表示になりまして、 ホニャララ.com ページは機能していません ホニャララ.com では現在このリクエストを処理できません。 それをデバッグしようとしているところです。 コ?ド、参考になりました。ありがとうございます。

a-kuma3さんのコメント
Geocoder のやつはポイントをもらい過ぎのような気がしたので、こっちも頑張ってみました <tt>:-)</tt> エラーが出たり、思った通りの結果が出なかったり、というのは、if ? else ? endif の構造が、きちんとなっていない(いなかった)からです(きっと)。 この質問の範囲での、if 文の制御構造の骨子は以下の通り。 >|php| <!-- 常に表示する領域 form など --> <?php $place = $_POST['place']; if ($place): // (1) 地域が入力されていれば -- if // 条件を設定して $args = Array( 'post_type' => 'post', 'posts_per_page' => -1, 'meta_query' => array(array( 'key' => 'address', 'value' => $place, 'compare' => 'LIKE' )) ); // 検索する $the_query = new WP_Query($args); if ($the_query->have_posts()): // (2) 検索結果があれば -- if ?> <!-- Google Map を使う領域 --> <div id="map" ...> <script ... ... <?php else: ?> // (2) 検索結果があれば -- else 該当する店舗はありませんでした。 <?php endif; ?> // (2) 検索結果があれば -- endif <?php else: ?> // (1) 地域が入力されていれば -- else 地域を入力してください。 <?php endif; ?> // (1) 地域が入力されていれば -- endif ||< 地域が入力されているかどうか、の if ? else ? endif が外側にあり、その内側に、カスタムフィールドの address を対象に検索して、検索結果があるかどうか、の if ? else ? endif が入るような形になります。 Marker のオブジェクトなどを作ったりするあたりのループの書き方が汚いので、制御構造が分かりにくくなっているのだと思います。 []http://eiji3.wp.xdomain.jp/[] のソースも修正してますので、確認してみてください。

mocchiさんのコメント
こちらでもお世話になりまして誠にありがとうございます。 本当にお世話さまです。 ソ?スコ?ドの汚さでもご迷惑をおかけしており、なのに解決していただいてますます感謝です。 困っておりましたので助かりました。本当にありがとうございました。 これからも質問させていただく際には、またお声がけさせてください。 ありがとうございました!

a-kuma3さんのコメント
>> ソ?スコ?ドの汚さでもご迷惑をおかけしており、なのに解決していただいてますます感謝です。 << ああ、ちょっと書き方をまずったです。 ぼくはプログラムを書く人ですけれど、自分用のでも、思い通りに動かないなんてことは日常茶飯事です。 原因は色々とあるのですが、ソースの見通しが悪くて、ぱっと見た目に何をやってるか分からないような状態になっているものは、ちょっと手を加えただけなのに妙な動作をするようになったり、そもそも何かの条件で正しく動かなかったり、ということが多いです。 なので、見通しの良いソース(ぱっと見た目で文字があまり多過ぎないとか、空白と文字のバランスが良い、というようにも言い換えられるかも)を意識しておいた方が良いですね、というようなつもりで書きました。 この手の質問だと、実物を見せずに(見せられない事情があるときもあるのでしょうけれど)動かない、おかしい、みたいなのが多いように思います。PHP だとちょっと難しいですけれど、javascript や css の範囲だったら、実物を見れば一発で分かりそうなものなのに、というようなフラストレーションがあったり(回答者視点で)。 でも、質問が活きている最中にテスト環境を作っちゃうようなパワフルな方は初めてです <tt>:-)</tt> 何となく PHP のソースは読めるし、たいていの場合はマニュアルを読めば解決できるだろうというのを言い訳にして、Wordpress の環境を持ってた方が良いかなと思いながら作ってなかったりするグズなぼくには、とても良い刺激になりました。

mocchiさんのコメント
ありがとうございました。 さっそく本番環境に移植し、想定通りの動きとなっております。 次に質問させていただく予定の事なのですが、これが可能かどうかだけ教えていただけませんでしょうか。 現状、住所で店舗情報を絞り込めるようになったのですが、更にカテゴリ?でも絞り込むことは可能なのかを知りたいのです。 テスト環境で例えるなら、ここに登録されている店舗にはそれぞれ、 ファッション関係 ペット関係 家関係 飲食 というカテゴリ-のいずれかになっています。 入力フォ?ムの上にそれぞれのカテゴリ?のチェックボックスがあり、そこにチェックをつけて、さらに住所を入れ、「検索」ボタンを押すと、チェックのついたカテゴリ?に属する店舗の、入力された住所にある店舗のみをマップに表示させたいのですが、そういった動きはプログラム的に可能でしょうか。 カテゴリ?のチェックボックスにチェックが入らない場合は、現状のままの動作で、例えば「家関係」と「飲食」にチェックが入っていればそれらのカテゴリ?に属する店舗を住所で絞り込みたいのです。 もし可能であれば将来的に必要になるはずなので、改めて質問させていただきたいと考えております。 そしてその折にはまたお声がけさせていただきたいのですが、どんなものでしょうか。

a-kuma3さんのコメント
>> カテゴリ?のチェックボックスにチェックが入らない場合は、現状のままの動作で、例えば「家関係」と「飲食」にチェックが入っていればそれらのカテゴリ?に属する店舗を住所で絞り込みたいのです。 << できますよ、多分。 複数のカテゴリーがチェックされていた場合に、条件が AND なのか OR なのかを決めておく必要があります。 雰囲気的には OR なのでしょうけれど。

mocchiさんのコメント
教えていただきありがとうございます。 カテゴリ?のチェックボックスにチェックが複数入っている時はORで、それらと住所はANDになる、というイメ?ジです。 ただいま質問文を練っているところでして、その条件(OR、AND)のことを書き忘れるところでした。 かさねがさねありがとうございます。

a-kuma3さんのコメント
質問の文面を練っているところに申し訳ないんですが、ちょっとやってみました。 []http://eiji3.wp.xdomain.jp/[] を確認してみてください。 検索に設定した条件を、フォームに反映させるか、別途、表示しておいてフォームを空にしておくか、というのは、好みの範疇だと思いますが。

a-kuma3さんのコメント
しまった、入れ違いになっちゃったか ><

mocchiさんのコメント
うおお、できてます。この挙動でバッチリOKです。 ありがとうございます! 先ほど入れ違いで質問を立てたところに何かしら回答をいただければ即ベストアンサ?&増ポイントにて終了させていただきたいと思います。 あと、私の環境では、最初にトップ画面を表示した際にだけエラ?メッセ?ジが表示されます。 しかし挙動はバッチリなのです。

mocchiさんのコメント
私の環境で、http://eiji3.wp.xdomain.jp/のトップペ?ジを最初に見た時にだけ、という意味です、言葉足らずすいません。

a-kuma3さんのコメント
>> あと、私の環境では、最初にトップ画面を表示した際にだけエラ?メッセ?ジが表示されます。 << あ、分かります。 フォームに検索した条件を設定しているつもりなのが、判断が甘いんですね <tt>X-|</tt> 検索条件を再入力するのが面倒でフォームに反映させたんですが、別表示の方が良かったかな。 少し、いじってみます。

a-kuma3さんのコメント
最初の表示のときの判定を追加しました。 「増ポイント」は、無しでお願いします。 500pt も十分に多いですし、前の二つの質問でも十分すぎるくらいもらってます。 自分で面白がってやってるだけですし、ポイント以外のもらい物もたくさんもらってますので。

mocchiさんのコメント
本当にこの度は一連の流れの中でお世話になり過ぎてもはや感謝の言葉がみつからない状態でして、せめてポイントだけでもと思うのですが無しでお願いとおっしゃられると困ってしまいます。 本当にありがとうございました。 もう、それしか言葉がございません。 本当に助かりました、ありがとうございました!

a-kuma3さんのコメント
>> せめてポイントだけでもと思うのですが無しでお願いとおっしゃられると困ってしまいます。 << すんません。でも、ポイントは十分に頂いてますし <tt>:-)</tt> ポイント以外のものを十分にもらってる、というのも本音でして。 今日の質問も、リファレンスに書いてあるじゃん、みたいな感じなのですが、一方、終了までの一週間の間にさくっとデバッグ環境を作ったり(これは、今のぼくには無理)する人がいるんだなあと、WordPress 界隈をのぞけた感じがして、とても楽しいのです。 xdomain も教えてもらいました。 何かの機会に WordPress 環境を作る必要に迫られたら、利用してみようと思います。

mocchiさんのコメント
はい、増ポイントもせず色んな意味で甘えさせていただきました。 ありがとうございました!

mocchiさんのコメント
a-kuma3さん、いつもお世話になっております。 あれから本番環境でもa-kuma3さんのコ?ドを稼働させ、すごく便利に使わせて頂いております。 本当にありがとうございます。 実際に使ってみて、さらに要望が出てきまして、それをこのコメント欄にてお聞きしたいのです。 現状では入力された住所を含んだ投稿がマップ上に現れる、という仕様ですが、この機能を保ったまま更に「入力フォ?ムに入力された住所」を「マップの中心」にする、ということをしたいのです。 例えば「世田谷区」と入力すると世田谷区にある店舗が表示され、さらにマップの中心が世田谷区になるようにしたいのです。 こういったことが可能であればすごく嬉しいです。 ポイント送付させていただく形で上記についてa-kuma3さんのご意見をお伺いしたく、よろしくお願いいたします。 テスト環境はまだ稼働させてあります。 サイトURL http://eiji3.wp.xdomain.jp ログインペ?ジ http://eiji3.wp.xdomain.jp/wp-admin ユ?ザ?名 guest パスワ?ド maptest ちなみに以前、ご指摘いただいたグ?グルマップのapi問題はグ?グルマップをオープンストリートマップに変えることでクリアにしたいと考えており、作業してみてわからないところがあれば新規に質問を立てさせていただくと思います(まだ手を付けてませんが)。

a-kuma3さんのコメント
>> 例えば「世田谷区」と入力すると世田谷区にある店舗が表示され、さらにマップの中心が世田谷区になるようにしたいのです。 << できますよ。 page.php の真ん中くらいにある var myOptions の辺り。 center: new google.map.LatLng ... というところで、地図の中央の緯度・経度を決めています。 ここを適切な値にしてあげれば良いんです。 検索結果が複数あるときに、どうすれば良いかを決めなきゃいけないですけれど。 一件目を中央にするか、全件の重心にするかでしょうか。 後、コードにがっつり手を入れても良いですかね。 ループの辺りが汚くて、ストレスたまります(表現が悪いのはご勘弁)。 [http://q.hatena.ne.jp/1406611375:title=昔の質問]で牛乳先生が書いていた >> 1.PHPで持っている店舗情報データ(位置、カテゴリなど)をjavascript側に全部渡す << をやっておいた方が、後々のためにもなると思うので。

mocchiさんのコメント
えっそんなことまで!? ありがとうございます!よろしくお願いします。 >一件目を中央にするか、全件の重心にするかでしょうか。 これについてはどちらでも構わず、a-kuma3さんのお好みというか易しいほうがいいです。 ありがとうございます。

a-kuma3さんのコメント
検索結果の一件目を使う方が簡単ですけど、住所以外のキーワードで探されて、一件目がちょっと場所が離れてる、なんてときが不自然だったりしますし、逆に重心を取ると、地図の中央にはマーカーがない、ということになるし。 どちらが良い、というわけじゃなくて、好みの範疇だとは思います。 やり始めたら、そんなに時間はかからないと思いますけど、数日くらいは余裕を見ておいてください。

mocchiさんのコメント
ありがとうございます。 伺うかぎり、全件の重心にするという方が好みです。 わざわざありがとうございます。 お手すきの折に、それこそ暇つぶし感覚でお願いできれば嬉しいです。 そちらについてもありがとうございます。 ちなみにですが、本番環境では各店舗(各投稿)のマ?カ?は住所からではなく、緯度経度から位置を取っており、これからもその形で運用していこうと考えております。

a-kuma3さんのコメント
コードをいじってみました。 地図の中心は、検索結果の重心にしてます。 ついでなので、以下の実装もしてみました。 - カテゴリ毎にマーカーの色を変える - 検索にヒットした範囲で、地図の拡大率をいい感じにする

mocchiさんのコメント
見せていただきました! これはすごいです。しかも業種ごとにマ?カ?を変えていただいてるのがニクい!! 本当にありがとうございます。 想像以上のものになっていて恐れ入ります、ありがとうございます。 マップの拡大率も触っていただいてるんですね。 ちょっと今からコ?ドを見させていただき、勉強させていただきます。 ポイント送付に時間差があればご寛恕ください。 今回も本当にありがとうございました!!本当に喜んでおります!

a-kuma3さんのコメント
こういう見た目を伴うプログラムは、いじってて楽しいです <tt>:-)</tt> 吹き出しがマーカーをクリックする度に、ぼこぼこ表示されちゃうのはどうかな、という気がしたのですが、これも好みの範疇だと思うので、そのままにしてあります。 やってることは基本的にあまり変えてませんが、結構 コードをいじってしまったので、本番環境にうまく移せないようだったら言ってください。 説明はしますので。

mocchiさんのコメント
無理にわがままを聞いていただいているところを、いじってて楽しいと言っていただければ気が楽になります、ありがとうございます。書いていただいたコ?ド、本当に勉強になっています。本当にありがとうございました。

a-kuma3さんのコメント
ポイント 届きました。 ありがたく頂戴します <tt>m(_ _)m</tt>

mocchiさんのコメント
a-kuma3さん、いつもお世話になっております。 以前、a-kuma3さんにご指摘いただいた、グ?グルマップのapi問題を解消しようと、グ?グルマップからオ?プンストリ?トマップにコ?ドを置き換えたく思っています。 参考サイトを見つつ、やってみているのですがちょっと難しく、またa-kuma3さんのお力をお借りしたいのです。 現在参考にしているサイトは以下です。 http://sterfield.co.jp/officer/openstreetmap%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F/ http://wiki.openstreetmap.org/wiki/JA:OpenStreetMap%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B ただ今回はコトが大きく、新規にはてなで質問を立てようと思っているのですが、質問の仕方もどういう質問にすれば私の意図がうまく伝わるのか困ってしまっておりまして(笑)。 そもそもwordpressのデ?タベ?スに格納されている値を位置情報を元にル?プを使って、店舗をマップ上に置いていく、という、現状の事を説明するだけでも難しく、まずは一度、質問前にa-kuma3さんにご意見を伺ってみようとおもいまして、このコメントを書いております。 (そもそもこの要望自体が不可能である、というご指摘をいただくかもしれないと思っております) というかa-kuma3さんであれば、いきなり現状を20歩以上、前に進めていただく助言やご指摘をいただけるかもとの期待もあるのです。 もしお手すきの折にでもa-kuma3さんにお力添えをいただければ本当に有難いです。

mocchiさんのコメント
あと、こちらのペ?ジの一番下にある、オ?プンストリ?トマップの動作サンプルも参考にしているのですが、難しく、自サイトへ応用できないのです。 https://github.com/pg2ch/panama

a-kuma3さんのコメント
せっかく面白そうな話なので、コメント欄に埋もれちゃうのはつまらないなあ、と思います。 やりたいことは、「Google Maps API を使ってるコードを、OpenStreetMap API に書き換えて欲しい」なので、きちんと質問を読む人だったら、意図は伝わると思います。 質問の補足には、現在のコードをぺたっと。 → [http://hatenadiary.g.hatena.ne.jp/keyword/%E5%85%A5%E5%8A%9B%E3%81%97%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%82%84%E3%81%AF%E3%81%A6%E3%81%AA%E8%A8%98%E6%B3%95%E3%82%92%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%EF%BC%88%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BCpre%E8%A8%98%E6%B3%95%EF%BC%89:title] 問題は、回答者がいるかどうかですね。 こういったガッツリ javascript な質問に答えるのは、ふたりくらいしか思いつかないんですが、どちらの方も人力検索から遠のいているからなあ。 >> (そもそもこの要望自体が不可能である、というご指摘をいただくかもしれないと思っております) << いや、できると思いますよ。 [http://dev.openlayers.org/apidocs/:title=公式のドキュメント]をちらっと見てみたのですが、しょぼいなあ。 ぼくがやると、サンプルのつぎはぎになりそうな予感がします <tt>:-)</tt> ちなみに、やりたいことは、こんなところでしたっけ。 + 店舗の場所にマーカーを設置する + マーカーをクリックすると吹き出しが表示され、もう一度クリックすると吹き出しが消える + カテゴリーごとにマーカーの画像を変える + 検索結果の店舗が全て表示されるように表示範囲を調整する 1 と 3 は、すぐにできそう。 2 も、きっとそれほど難しくない(と思いたい)。 4 は、API があると良いな、って感じです。

mocchiさんのコメント
さっそくコメントをいただきありがとうございます! できると思う、と言っていただくだけで、この質問をするのがたいへん楽しみです。 a-kuma3さんに挙げていただいた???までを満足できればすごく嬉しいですが、?は全て表示されなくとも、表示されるマ?カ?の、だいたい真ん中くらいがマップの中心になる、というだけでも満足です。 サンプルのつぎはぎになるかも、というa-kuma3さんの回答が一番嬉しいかもしれません。 わからないことがあっても、それがサンプルから派生したものであれば追いかけやすいのかもしれないと思っております(笑)。 今までの経緯を全てa-kuma3さんに手掛けていただいておりますので、僕が求めるものに一番近い(もしくはそのものズバリな)答えをいただけると思っておりまして、明日たてる質問にa-kuma3さんに回答いただければ本当に嬉しいです。

mocchiさんのコメント
お言葉に甘え、a-kuma3さんに手掛けていただいたコ?ドをぺたっと貼らせていただき、質問させていただきました。 http://q.hatena.ne.jp/1467609469 a-kuma3さんにのみご回答いただければもうそれで私は満足でして、お手すきの折に見てやっていただけませんでしょうか。 なにとぞよろしくお願いします。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ