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

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

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

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

解決済

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

Yariii
Yariii

総合スコア57

WordPress

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

1回答

0評価

0クリップ

2557閲覧

投稿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

<main class="Search"> <?php //フォームから値を取得 $s = $_GET['s']; $user = $_GET['user']; $size = $_GET['size']; $genre = $_GET['genre'];   //配列を作成 $searchkeys = [ 'user' => [ 'key'=>'user', 'val' => $user ], 'size' => [ 'key'=>'size', 'val' => $size ], 'genre' => [ 'key'=>'genre', 'val' => $genre ] ];  //後にあるWP_Queryのmeta_queryにて、この多次元配列を追加 foreach($searchkeys as $searchkey){ if($searchkey){ $metaquerysp[] = array( 'key'=>$searchkey['key'], 'value'=>$searchkey['val'] ); } } //meta_query用 $metaquerysp['relation'] = 'AND'; ?> <div>検索結果</div> <?php  //WP_Query作成 $args = array( 'post_type' => 'product', //この$metaqueryspが上手く機能してないっぽい 'meta_query' => $metaquerysp, 's' => $s );  //試しにprint_rで配列を見てみると以下が表示された //Array ( [0] => Array ( [key] => user [value] => Array ( [0] => レディース ) ) [1] => Array ( [key] => size [value] => ) [2] => Array ( [key] => genre [value] => ) [relation] => OR ) print_r($metaquerysp); $search_post = new WP_Query($args); if($search_post->have_posts()): while($search_post->have_posts()): $search_post->the_post(); ?> <li class="Top_featured_list_item"> <!--ここに記事の情報を表示--> </li> <?php endwhile; else : ?> <div>該当なし</div> <?php endif; wp_reset_query(); ?> </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でも機能するみたいです。

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

WordPress

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