前提
- Wordpressでファッションサイトを構築しています。
- 投稿を使いコーディネートを公開します。
- カスタムフィールドにはトップス(シャツ、ポロシャツなど)、ボトムス(ロングパンツ、ショートパンツなど)のカテゴリー名、性別、季節、カラーなどの情報が登録されます。
- カスタムフィールドの値で絞り込み検索機能を実現したいと考えています。
- カスタムフィールドにはSmart Custom Fieldsプラグインを使用しています。
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;
}
// ・・・(絞り込みパターン分繰り返し)
}
絞り込みパターン分記述がしなければならないのでしょうか・・・?
よろしくお願いします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
check解決した方法
0
上記の「wp_queryで記事全件抽出 → 絞り込み条件に合致する記事を表示用配列に追加 → 表示用配列を回して記事を表示」の方法で対応しました。
ありがとうございました。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.32%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
CHERRY
2019/07/21 07:49
文章だけでは状況の判断が難しいと思いますので、具体的なコードを記載していただくことは可能でしょうか?