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

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

ただいまの
回答率

90.46%

  • PHP

    24641questions

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

  • WordPress

    9167questions

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

【WordPress】絞り込み検索後、カスタムフィールドの値で記事を並び替えたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 4,592

Fozmy

score 4

前提・実現したいこと

WordPressにて、ソートの可能な商品検索機能の実装を目指しています。
商品はカスタム投稿で記事として登録し、商品の情報はカスタムフィールドを使用して登録しています。

絞り込み検索をプラグインを使わずに実装[WordPress]

上の記事を参考に、絞り込み検索を実装するところまでは達成できました。
その検索結果の商品一覧を、カスタムフィールドの値をもとに「価格の安い順」などの条件で並び替える機能を実装したいのですが、その方法がわからない状況です。

WordPressの検索ページを人気順などで並び替えるボタンをつける

こちらの記事を参考に、pre_get_postsフックで記事をソートする方向で進めています。
検索結果はpre_get_postsで制御するように置き換えたので、
あとは絞り込み検索のクエリストリングを維持しつつ$sortsetに値を引き渡すことができれば、
記事の並び替えを実現できるのではないかと考えています。

search.php

<?php
if( is_search() ){
    $url_str = site_url('/');
    $srch = "\t" . '<input type="hidden" name="s" value="' . get_search_query() . '" />' . "\n";
}
$sortset = (string)filter_input(INPUT_GET, 'sort');
$crt = ' class="sort_current"';
?>
<form method="get" action="<?php echo $url_str ?>">
<?php if( is_search() ){ echo $srch; } ?>
    <input type="hidden" name="sort" value="newer" />
    <input type="submit"<?php if( $sortset === 'newer' ){ echo $crt; } ?> value="新しい順" />
</form>

参考サイトでは、上記の記述で検索クエリを継承しつつ、$sortset === 'newer'を受け渡していますが、今回はカスタムフィールド等を用いた複数条件による検索なので、複数のクエリをどのように受け渡せばよいのか悩んでいます。

なお、searchform.phpの記述は次のようになっています。

<form method="get" action="<?php echo home_url(); ?>">
    <input name="s" id="s" type="hidden">
    <div>
        <p>商品ブランド</p>
        <select name="item_brand">
        <option value="">選択してください</option>
        <?php
        $set_cats = array (
            'orderby' => 'count',
            'order' => 'DESC',
            'taxonomy' => 'brand',
            );
        $cats = get_categories($set_cats);
        foreach($cats as $cat) :
            echo '<label>'
            . '<option value="' . $cat->term_id . '">'
            . esc_html($cat->cat_name) . '</option>';
        endforeach;
        ?>
        </select>
    </div>
    <div>
        <p>商品のタイプ</p>
        <label><input type="radio" name="item_type" value="タイプ1" />タイプ1</label>
        <label><input type="radio" name="item_type" value="タイプ2" />タイプ2</label>
        <label><input type="radio" name="item_type" value="タイプ3" />タイプ3</label>
    </div>
    <div>
        <p>価格帯</p>
        <select name="price_low">
            <option value="0" selected>下限なし</option>
            <option value="10000">10,000円</option>
            <option value="20000">20,000円</option>
            <option value="20000">30,000円</option>
        </select><select name="price_high">
            <option value="10000">10,000円</option>
            <option value="20000">20,000円</option>
            <option value="20000">30,000円</option>
            <option value="99999" selected>上限なし</option>
        </select>
    </div>
    <div>
        <label><input type="checkbox" name="condition_a[]" value="1">条件A</label>
    </div>
    <div>
        <label><input type="checkbox" name="condition_b[]" value="1">条件B</label>
    </div>
    <div>
        <label><input type="checkbox" name="condition_c[]" value="1">条件C</label>
    </div>
    <div>
    <input id="submit" type="submit" value="商品検索" />
    </div>
</form>
バージョン・補足

・PHP : 5.4.45
・WordPress : 4.5.3
・カスタムフィールドの値は、Advanced Custom Fieldsを使用して登録しています。
その他、情報の不足等があればご指摘下さい。

よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

checkbox の name を同名にして、pre_get_posts で配列として受け取ってそれを処理すればよいのでは?というか書かれている参考URLに書いてありますね。

【複数選択可能なフォーム部品から送られたデータを、PHPで取得 - PHP 逆引きリファレンス】
http://alphasis.info/2012/11/php-gyakubiki-form-post-multiple/

【絞り込み検索をプラグインを使わずに実装[WordPress]】
http://kotori-blog.com/wordpress/refinement_search/#refinement8

「ソート」部分がわからなければこのあたりでしょうか。

【ヾ(o゚ω゚o)ノ゙複数のカスタムフィールドで記事を並び替える - Qiita】
http://qiita.com/harapeko_wktk/items/4fe7d39ad22d3951e5cc

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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

  • PHP

    24641questions

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

  • WordPress

    9167questions

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