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

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

新規登録して質問してみよう
ただいま回答率
85.35%
WordPress

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

Q&A

解決済

1回答

4967閲覧

WP_Queryのmeta_queryで記事を取得できない

Yariii

総合スコア61

WordPress

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

0グッド

0クリップ

投稿2020/06/16 16:14

編集2020/06/17 04:19

よろしくお願いいたします。
現在、WPでこのような仕組みを作っています。

まずACFの情報をもとに作った絞り込み検索フォームを入力、送信

検索結果ページに渡したフィールドの値でWP_Queryの条件を作成

AND形式(〇〇かつ〇〇)で引っかかったポストを表示

そして問題の箇所が検索結果ページで、
絞り込みフォームの情報は渡せているのですが、WP_Queryで上手く条件通りの表示ができません。
具体的には、AND形式(〇〇かつ〇〇)という条件な上で、どんな絞り込み検索のパターンを試しても表示されずでして、、、
たぶん配列の作り方が間違えているとは思うんですが、知識が追いつかずで、、

以下コードです。
▼絞り込み検索フォーム
それぞれ記事のACFの情報と紐付ける前提ですが、こちらのフォームは直書きで書いています(ACFの情報をループ外で取得する方法が分からなかったので)

<form class="Searchform_form" method="get" id="searchform" action="<?php bloginfo('url'); ?>"> <label for="s" class="assistive-text">検索</label> <input type="hidden" type="text" name="s" id="s" placeholder="検索" /> <div class="Searchform_form_wrap"> <div class="Searchform_form_item user"> <div class="Searchform_form_item_title">ユーザータイプ</div> <div class="Searchform_form_item_labels"> <label><input type="checkbox" name="user[]" value="メンズ">メンズ</label> <label><input type="checkbox" name="user[]" value="レディース">レディース</label> <label><input type="checkbox" name="user[]" value="ジュニア">ジュニア</label> </div> </div> <div class="Searchform_form_item size"> <div class="Searchform_form_item_title">顔幅サイズ</div> <div class="Searchform_form_item_labels"> <label><input type="checkbox" name="size[]" value="SS">SS</label> <label><input type="checkbox" name="size[]" value="S">S</label> <label><input type="checkbox" name="size[]" value="M">M</label> <label><input type="checkbox" name="size[]" value="L">L</label> <label><input type="checkbox" name="size[]" value="LL">LL</label> </div> </div> <div class="Searchform_form_item genre"> <div class="Searchform_form_item_title">製品種別</div> <div class="Searchform_form_item_labels"> <label><input type="checkbox" name="genre[]" value="めがね">めがね</label> <label><input type="checkbox" name="genre[]" value="サングラス">サングラス</label> </div> </div> </div> <div class="Searchform_submit"> <span class="link"><input type="submit" value="全て見る"></span> </div> </form>

▼検索結果ページ

php

1 2<main class="Search"> 3 4 <?php 5 //フォームから値を取得 6 $s = $_GET['s']; 7 $user = $_GET['user']; 8 $size = $_GET['size']; 9 $genre = $_GET['genre']; 10 11  //配列を作成 12 $searchkeys = [ 13 'user' => [ 14 'key'=>'user', 15 'val' => $user 16 ], 17 'size' => [ 18 'key'=>'size', 19 'val' => $size 20 ], 21 'genre' => [ 22 'key'=>'genre', 23 'val' => $genre 24 ] 25 ]; 26 27 //後にあるWP_Queryのmeta_queryにて、この多次元配列を追加 28 foreach($searchkeys as $searchkey){ 29 if($searchkey){ 30 $metaquerysp[] = array( 31 'key'=>$searchkey['key'], 32 'value'=>$searchkey['val'] 33 ); 34 } 35 } 36 37 //meta_query用 38 $metaquerysp['relation'] = 'AND'; 39 ?> 40 41 <div>検索結果</div> 42 43 <?php 44 //WP_Query作成 45 $args = array( 46 'post_type' => 'product', 47 //この$metaqueryspが上手く機能してないっぽい 48 'meta_query' => $metaquerysp, 49 's' => $s 50 ); 51 //試しにprint_rで配列を見てみると以下が表示された 52 //Array ( [0] => Array ( [key] => user [value] => Array ( [0] => レディース ) ) [1] => Array ( [key] => size [value] => ) [2] => Array ( [key] => genre [value] => ) [relation] => OR ) 53 print_r($metaquerysp); 54 55 $search_post = new WP_Query($args); 56 if($search_post->have_posts()): while($search_post->have_posts()): $search_post->the_post(); 57 ?> 58 59 <li class="Top_featured_list_item"> 60 <!--ここに記事の情報を表示--> 61 </li> 62 63 <?php endwhile; else : ?> 64 65 <div>該当なし</div> 66 67 <?php endif; 68 wp_reset_query(); ?> 69 70</main>

以上がコードになります。

試行錯誤しているのですが、原因に気付けずで、、
どうかお力添え頂けると幸いです。

よろしくお願いします。


追記です。
$argsのmeta_queryを以下のように手動で設定したら、上手く吐き出されました。

'meta_query' => array(
'relation' => 'OR',
array(
'relation' => 'OR',
array(
'key' => 'user',
'value' => "メンズ"
),
array(
'key' => 'size',
'value' => "SS"
),
)
),

しかしOR検索にしたので、〇〇か〇〇どっちかの値があれば表示される感じで、ここのAND検索にするとやっぱり表示されません。


さらに追記で、
AND検索で、どうやら「ユーザータイプ」にチェック入れて送信すると、どういうパターンでも何も表示されなくなりますね、、、、、「顔はばサイズ」「製品種別」にチェック入れて送信すると、ANDでも機能するみたいです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんな感じでどうでしょうか。
if文で値が配列になっているかチェックし、compareを追加しています。

PHP

1foreach ($searchkeys as $searchkey) { 2 if (is_array($searchkey['val'])) { 3 $metaquerysp[] = array( 4 'key' => $searchkey['key'], 5 'value' => $searchkey['val'], 6 'compare' => 'IN' 7 ); 8 } 9} 10

投稿2020/06/16 23:35

tabuu

総合スコア2480

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yariii

2020/06/17 03:20

ご回答ありがとうございます。 これでも表示されませんねー Array ( [0] => Array ( [key] => user [value] => Array ( [0] => メンズ ) [compare] => IN ) [relation] => AND ) ちなみにという配列になりました。 それとあれから色々調べて別のヒントを得たので、追記を見ていただけると幸いです。
tabuu

2020/06/17 04:38

変数名とデータの組み合わせ合っていますか?もしくはuserという変数名を他でも使っていないですか?
Yariii

2020/06/17 04:45

> 変数名とデータの組み合わせ合っていますか? 一度ACFのフィールド名を変えたことがあって、今ほど一度商品を全部消して登録しなおしたら、機能するようになりました。ありがとうございました...! データの組み合わせ、要チェックですね、、m_ _m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問