• 解決済 igawan

    (@igawan)


    下記のページを参考に絞り込み検索に挑戦していますが、パラメーターに含まれる[]が、URLを表示させると%5B%5Dとエンコードされてしまいます。
    http://kotori-blog.com/wordpress/refinement_search/

    formタグにaccept-charset=”UTF-8″を入れてみたりしましたがダメでした。
    見栄えも悪いのでこの際なくしてしまいたいと思いますが、やり方がわからないのでヒントなどいただければ幸いです。

    ▼現状はこんな感じで渡しています。

    <form method="get" id="searchform" action="<?php bloginfo('url'); ?>"  accept-charset='utf-8'>
    <?php
    $s = $_GET['s'];
    $r1 = $_GET['r1'];
    $r2 = $_GET['r2'];
    $r3 = $_GET['r3'];
    $m0 = $_GET['m0'];
    $m1 = $_GET['m1'];
    $m2 = $_GET['m2'];
    $m3 = $_GET['m3'];
    $m4 = $_GET['m4'];
    $m5 = $_GET['m5'];
    $m6 = $_GET['m6'];
    $m7 = $_GET['m7'];
    if(isset($r1)){$se_r1 = "checked";}
    if(isset($r2)){$se_r2 = "checked";}
    if(isset($r3)){$se_r3 = "checked";}
    if(isset($m0)){$se_m0 = "checked";}
    if(isset($m1)){$se_m1 = "checked";}
    if(isset($m2)){$se_m2 = "checked";}
    if(isset($m3)){$se_m3 = "checked";}
    if(isset($m4)){$se_m4 = "checked";}
    if(isset($m5)){$se_m5 = "checked";}
    if(isset($m6)){$se_m6 = "checked";}
    if(isset($m7)){$se_m7 = "checked";}
    
    if ( is_home() || is_front_page() ) {
    	$search_url = "http://" . $_SERVER["HTTP_HOST"] . "/?s=";
    }else{
    	$search_url = "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
    }
    if(preg_match("/&r1/",$search_url)){
    	$surl = "";
    }else{
    	$surl = "&r1[]=礼金なし";
    }
    ?>
        <label for="s" class="assistive-text">検索</label>
        <input type="text" name="s" id="s" placeholder="検索" value="<?php echo $s; ?>"/>
        <div>契約条件 ※複数選択可</div>
        <label><a href="<?php echo $search_url . $surl;?>"><input type="checkbox" name="r1[]" value="礼金なし" <?php echo $se_r1;?>>礼金なし</a></label><br>
        <label><input type="checkbox" name="r2[]" value="仲介料なし" <?php echo $se_r2;?>>仲介料なし</label><br>
        <label><input type="checkbox" name="r3[]" value="フリーレント" <?php echo $se_r3;?>>フリーレント</label><br>
        <div>間取り ※複数選択可</div>
        <label><input type="checkbox" name="m0[]" value="1R/1K" <?php echo $se_m0;?>>1R/1K</label><br>
        <label><input type="checkbox" name="m1[]" value="1DK" <?php echo $se_m1;?>>1DK</label><br>
        <label><input type="checkbox" name="m2[]" value="1LDK" <?php echo $se_m2;?>>1LDK</label><br>
        <label><input type="checkbox" name="m3[]" value="2K/2DK/2SDK" <?php echo $se_m3;?>>2K/2DK/2SDK</label><br>
        <label><input type="checkbox" name="m4[]" value="2LDK/2SLDK" <?php echo $se_m4;?>>2LDK/2SLDK</label><br>
        <label><input type="checkbox" name="m5[]" value="3K/3DK" <?php echo $se_m5;?>>3K/3DK</label><br>
        <label><input type="checkbox" name="m6[]" value="3LDK" <?php echo $se_m6;?>>3LDK</label><br>
        <label><input type="checkbox" name="m7[]" value="4DK/4LDK以上" <?php echo $se_m7;?>>4DK/4LDK以上</label><br>
        <input type="submit" value="検索" />
    </form>

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

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • URLから[]を取りたいのであれば、

    name="m0[]" → name="m0"
    

    とすれば取れるかと思います。

    トピック投稿者 igawan

    (@igawan)

    試してみたのですが、[]がないとWarning: Invalid argument supplied for foreach() in とエラーが返ってきます。
    配列だから[]がないといけないんですかね?

    そもそも参照されている記事が非推奨関数使いまくっていたりしてオススメできないのですが(詳しくは見ていません)、それを更に改変して使用されているように見えますが、他の部分に行った変更も貼り付けてもらえますか?(長くなるのでpastebinやgistに貼り付けてURLを提示してください。)

    上のフォームを観た感じ、大幅に改善できる気がします。(フォームもこのままはちょっと…)

    ついでに読んで欲しい:PHP – $_GET, $_POSTなどを受け取る際の処理 – Qiita

    トピック投稿者 igawan

    (@igawan)

    非推奨関数も入ってるんですね;;

    早速ですが下記にソース入れてみました。(汚いコードですみません><)
    サイドバーに絞込検索機能を入れて、検索結果ページに吐き出しています。

    ▼sidebar.php
    http://pastebin.com/Pv7ayifH

    ▼search.php
    http://pastebin.com/EiQt36ba

    ▼カスタムフィールドのフィールド名は下記のようになっています。
    全てテキスト入力欄です。

    フリーレント freerent

    礼金無料 reikin

    仲介手数料無料 tyukai

    間取り0(1R/1Kが入ります) madori0

    間取り1(1DKが入ります) madori1

    間取り2(1LDKが入ります) madori2

    間取り3(2K/2DK/2SDKが入ります) madori3

    間取り4(2LDK/2SLDKが入ります) madori4

    間取り5(3K/3DKが入ります) madori5

    間取り6(3LDKが入ります) madori6

    間取り7(4DK/4LDK以上が入ります) madori7

    間取りの部分は、配列で受け取って絞込条件に吐き出せればもう少し整理されると思うのですが、参考サイトにもなく、検索でも見つからなかったので仕方なくこんな感じでやってます。

    ご教示頂ければ幸いです。

    name属性から[]を取った後にforeachでエラーが出るのであればforeach文を外せばいいのだと思います。

    配列が使えないとなると、ご掲示されたように一つ一つパラメータを処理しないといけない(連番になっているところはまとめられそうですが…)と思いますので、[]を付けて配列にしたほうがいいような気がします。

    見栄えで言えばスラッシュやマルチバイト文字もURLエンコードされていると思いますので、[]を許容してもいいと思うのですが、いかがでしょうか。

    そうですね、例えば

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

    だったら

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

    のようにすることで[]は省けますね。

    あるいは本題とはそれて配列を許容するのであればコードを大幅に単純化できます。(そもそも配列の扱いは面倒なので避けたほうがいいのかもですが)

    また、間取りが0~7に分かれているのは「どうすればいいかわからなかった」でいいですか?これを単一のカスタムフィールド名にすべきです。(それとも複数の値が一つのエントリーに設定される場合がありますか?それなら配列にすべきですね、確かに。)

    そもそも、search.php内でクエリを回してるのもどうかと…(二重クエリになってます)
    <s>参考記事のようにquery_postsを使ってたのは何というか安心した。</s>
    使ってるじゃん←非推奨です

    あくまでもざっとしか見ていませんが。

    あ〜カスタムタクソノミー使ったほうがいいって話もあったんだった…

    WordPress › フォーラム » meta_queryのvalue値に渡す引数について

    トピック投稿者 igawan

    (@igawan)

    ありがとうございました!
    foreachを外したところ、[]は無くすことができました。

    query_postsは、pre_get_postsに置き換えられるかやってみます。

    >また、間取りが0~7に分かれているのは「どうすればいいかわからなかった」でいいですか?
    ご指摘のように分からなかったということです。
    配列で受け取れるよう、挑戦してみます。
    とりあえず、[]は無くすことができましたので解決済みとさせていただきます。

    ありがとうございました。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • トピック「getでパラメータを渡す際の[]を無くしたい」には新たに返信することはできません。