前提
- Wordpressでファッションサイトを構築しています。
- 投稿を使いコーディネートを公開します。
- カスタムフィールドにはトップス(シャツ、ポロシャツなど)、ボトムス(ロングパンツ、ショートパンツなど)のカテゴリー名、性別、季節、カラーなどの情報が登録されます。
- カスタムフィールドの値で絞り込み検索機能を実現したいと考えています。
- カスタムフィールドにはSmart Custom Fieldsプラグインを使用しています。
- Smart Custom Fieldsの繰り返し機能を使い、トップス、ボトムスなどの情報をカスタムフィールドを利用して登録します。(赤いシャツ、黒いパンツ、白い帽子など複数)
- フロント画面では、絞り込み項目を複数用意し、選択しsubmitするとURLにパラメータをが付与され、その値を使った絞り込み機能を行います。
実現したいこと
- 一つの条件で絞り込みをかけた時は正しく結果が返ってくるのですが、複数の条件で絞り込みたいときにうまく行きません。
- 複数条件の絞り込み機能をどのように実現するのでしょうか?
試したこと
- wp_queryの
meta_query
にカスタムフィールドを指定して条件に合致するものを抽出
→ 「赤いシャツ」のようなAND検索ではなく、「赤色」OR「シャツ」の結果が返ってきてしまう。
- そこで、wp_queryで記事全件抽出 → 絞り込み条件に合致する記事を表示用配列に追加 → 表示用配列を回して記事を表示としました。
- ただ、複数の条件で絞り込む際、どのように記述すればいいのかわかりません。
絞り込み条件分、if文を書くのも試しましたが、全パターンを網羅しようと思うと途方もなく、現実的ではないと思いました。
何かもっとシンプルな記載方法はないでしょうか?
よろしくお願いします。
具体的なコードは以下です。
wp_queryのmeta_queryにカスタムフィールドを指定して条件に合致するものを抽出
<?php // 絞り込み用パラメータを作成 $arr = []; if (isset($_GET['sex'])) { // 性別 $sArray = [ 'key' => 'sex', 'value' => $_GET['sex'], 'compare' => '=' ]; $arr[] = $sArray; } if (isset($_GET['season'])) { // 季節 $seasonArray = [ 'key' => 'season', 'value' => $_GET['season'], 'compare' => '=' ]; $arr[] = $seasonArray; } if (isset($_GET['item'])) { // アイテム $genreArray = [ 'key' => 'item', 'value' => $_GET['item'], 'compare' => '=' ]; $arr[] = $genreArray; } if (isset($_GET['color'])) { // カラー $colorArray = [ 'key' => 'color', 'value' => $_GET['color'], 'compare' => '=' ]; $arr[] = $colorArray; } // 投稿データを取得 $args = array( 'post_type' => 'post', 'posts_per_page' => 10, // 1ページ10件掲載する 'meta_query' => $argument ); $my_query = new WP_Query($args); while($my_query->have_posts()): $my_query->the_post(); // (以下ループ)
「赤いシャツ」のようなAND検索ではなく、「赤色」OR「シャツ」が返ってきました。
wp_queryで記事全件抽出 → 絞り込み条件に合致する記事を表示用配列に追加 → 表示用配列を回して記事を表示
// 投稿データを取得 $args = array( 'paged' => $paged, 'post_type' => 'post', 'posts_per_page' => -1, // 全件取得 ); $my_query = new WP_Query($args); $posts = $my_query->get_posts(); $array = []; // 表示用配列 foreach ($posts as $post) { $group = SCF::get('group'); // アイテムごとの繰り返しグループ $sex = SCF::get('sex'); $season = SCF::get('season'); $item = SCF::get('item'); $color = SCF::get('color'); foreach ( $group as $fields ) { if ($fields['sex'] == $_GET['sex'] && $fields['season'] == $_GET['season'] && $fields['item'] == $_GET['item'] && $fields['color'] == $_GET['color']) { $array[] = $fields; break; } if ($fields['sex'] == $_GET['sex'] && $fields['season'] == $_GET['season'] && $fields['item'] == $_GET['item']) { $array[] = $fields; break; } // ・・・(絞り込みパターン分繰り返し) }
絞り込みパターン分記述がしなければならないのでしょうか・・・?
よろしくお願いします。
文章だけでは状況の判断が難しいと思いますので、具体的なコードを記載していただくことは可能でしょうか?
回答1件
あなたの回答
tips
プレビュー