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

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

ただいまの
回答率

88.04%

wordpressでforeachを使った時のsyntax errorエラー

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 439

score 47

現在、WP_Queryのmeta_queryに配列をforeachでループさせて入れていきたいです。
アドバンスカスタムフィールドで作ったチェックボックスで、絞り込み検索をして、そのさきのsearch.phpでWP_Queryを使って該当商品を出力します。

問題が、絞り込み検索で複数チェックした時です。
例えば、

□product-user(キー)
・mens(値)
・ladies(値)
□size(キー)
・S(値)
・M(値)
・L(値)

「mens」&「S」のようなそれぞれのキーで複数チェックの時は機能してうまく表示されるのですが、
「mens」&「ladies」のような同じキーで両値にチェックを入れた時が、うまくmeta_queryに反映できず、
meta_valueに2つ値を入る必要があるですが、その方法がわからず、、、、

理想としては

$args = array(
      'meta_query' => array(
        'relation' => 'AND',
        array(
          'relation' => 'AND',
          array(
              'key' => 'product-user',
              'value' => "mens",
              'compare' => 'LIKE',
          ),
          array(
              'key' => 'product-user',
              'value' => "ladies",
              'compare' => 'LIKE',
          ),
        ),
      ),
    );

このような感じにmeta_queryを設定したいです。

product-userというキーで、複数の値を設定したいんですね。
ただユーザーさんが、絞り込むので、ここの値は動的になります。
なのでforeachでループさせて、meta_queryのvalueを入れていこうと思いました。

そして以下のようにコーディングしたのですが、
foreachで「Parse error: syntax error, unexpected 'foreach' (T_FOREACH), expecting ')' 」
というエラーが出てしまいます。

  <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 class="mens" type="checkbox" name="product-user[]" value="mens">メンズ</label>
              <label><input class="ladies" type="checkbox" name="product-user[]" value="ladies">レディース</label>
            </div>
          </div>
      <div class="Searchform_submit">
        <span class="link"><input type="submit" value="検索する"></span>
      </div>

  </form>
//searchkeysの配列に、GETでチェックボックスの値を渡しています。

  $user = $_GET['product-user'];
  $searchkeys = [
    'user' => [
      'key'=>'product-user',
      'val' => $user
    ]
  ];


  foreach($searchkeys as $searchkey){

    if(is_array($searchkey['val'])){
      $searchkey_var = $searchkey['val'];
      $searchkey_var_child = implode(',' , $searchkey_var);
      $searchkey_counr = count($searchkey_var);
      //チェックが1つの場合
      if($searchkey_counr == 1){
          $metaquerysp[] = array(
              'key'=>$searchkey['key'],
              'value'=> $searchkey_var_child,
              'compare'=>'LIKE',
              );
    //チェックが2つ以上の場合
      } else {
        $metaquerysp[] = array(
          'relation' => 'AND',
          //このforeachでエラーが出る
          foreach($searchkey_var as $child){
              array(
                'key'=>$searchkey['key'],
                'value'=> $child,
                'compare'=>'LIKE',
              );
          }
        );
      }
    }
  }
  $metaquerysp['relation'] = 'AND';

$args = array(
    'post_type' => 'product',
    'posts_per_page' => 6,
    'paged' => $paged,
    'tax_query' => array(
        array(
          'taxonomy' => 'product_cat',
          'field'    => 'slug',
          'terms'    => $product_cat,
        ),
      ),
    'meta_query' => $metaquerysp
  );

以上です。
いろいろ調べてもうまくforeachでループしてmeta_valueに渡せる方法がわからず困っています、、
どなたか、ご教授よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

foreachはその使い方ができません。

        $aaa = [ 'relation' => 'AND' ];
        foreach($searchkey_var as $child){
            $aaa[] = array(
              'key'=>$searchkey['key'],
              'value'=> $child,
              'compare'=>'LIKE',
            );
        }
        $metaquerysp[] = $aaa;
// 未テスト。こういう感じ、という例です。

【PHPの文と式 - Qiita】
https://qiita.com/tadsan/items/bd761ec3d33cc2c65cdf

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/27 18:34

    ご提示いただいたやり方で無事、実現できました。
    ありがとうございます!

    キャンセル

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

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

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