サポート » 使い方全般 » 配列のカスタムフィールドに対して絞込み表示

  • チェックボックスのカスタムフィールドを作成し、その値に対して「meta_query」で絞込み検索を行いたいのですが、「meta_query」の「value」に配列を指定すると絞込み表示ができなく困っております。
    「value」を単体指定するとうまく絞込み表示ができます。
    「value」の値は、検索フォームから複数選択可能な項目より値が渡されます。

    調べたところ配列のカスタムフィールドはシリアライズされており、絞込みが難しいとのことですが、何か方法がありましたらご教授いただけますでしょうか。

    ■検索の流れ
    検索フォームページ
    ※項目はチェックボックスで作成
    ↓ GET送信
    検索結果

    下記コードでは、うまく絞込み表示ができました。

    // 絞込みデータ取得
    $s_args = array(
      'post_type' => 'test',
      'meta_query' => array(
        'key' => 'fruit',
        'value' => 'りんご',
        'compare' => 'LIKE',
      ),
      'relation' => 'AND',
      'posts_per_page' => -1,
    );
    $the_query = new WP_Query($s_args);

    下記コードでは、投稿データが取得できませんでした。

    // 絞込みデータ取得
    $s_args = array(
      'post_type' => 'test',
      'meta_query' => array(
        'key' => 'fruit',
        'value' => array('りんご'),
        'compare' => 'IN',
      ),
      'relation' => 'AND',
      'posts_per_page' => -1,
    );
    $the_query = new WP_Query($s_args);

    下記コードでは、投稿データがすべて表示され「Warning」エラーが表示されました。

    // 絞込みデータ取得
    $s_args = array(
      'post_type' => 'test',
      'meta_query' => array(
        'key' => 'fruit',
        'value' => array('りんご'),
        'compare' => 'REGEXP',
    ),
      'relation' => 'AND',
      'posts_per_page' => -1,
    );
    $the_query = new WP_Query($s_args);

    ■「Warning」エラー
    Warning: trim() expects parameter 1 to be string, array given in [ファイルパス]/wp-includes/class-wp-meta-query.php

    ====================================================
    「LIKE]では絞込みができるので「検索フォーム」から選択された項目の数を数えて1つ以上選択されていた場合、下記のように配列を追加する方法で対応ができましたが、他に良い方法があればお教えいただきたいです。

     
    $item= $_GET['item']; // 検索フォームから項目を取得
    $item_num = count($item);
    
      if ($item_num === 1) {
        $meta_ary[] = array(
          'key' => 'test',
          'value' => $item[0], //選択された項目が1つなら一番初めのの項目を「value」に指定
          'compare' => 'LINK',
        );
      } else {
        // 複数選択されていた場合、「foreach」ループで1つずつ配列を作成し、最後にまとめて「meta_query」用の値配列に追加する
        $meta_ary[] = array('relation' => 'AND');
        $meta_match_key = array();
        foreach ($item as $item_value) {
          array_push($meta_match_key, array(
            'key' => 'test',
            'value' => $item_value,
            'compare' => 'LINK',
          ));
        }
        $meta_ary[0] += $meta_match_key;
      }
    • このトピックはnon888が1ヶ月、 1週前に変更しました。
    • このトピックはnon888が1ヶ月、 1週前に変更しました。
1件の返信を表示中 - 1 - 1件目 (全1件中)
  • @non888 さん

    はじめまして。

    調べたところ配列のカスタムフィールドはシリアライズされており、絞込みが難しいとのことですが、何か方法がありましたらご教授いただけますでしょうか。

    →上記はおっしゃる通りで、以下2点の問題点があると考えています。

    • 正確な絞り込みが出来ない
      LIKEは部分一致検索のため、正しく絞り込みできない可能性があります。
      例えば、チェックボックスの選択肢が「テキスト」「ロングテキスト」とあったとして、「テキスト」だけで絞り込みたいとしても、LIKE検索では両方ヒットしてしまう事になります。
      REGEXPであれば、前方/後方一致を駆使すれば上手くできるかもしれませんが、正規表現を書くのが大変だと思います。
    • 処理が重くなる場合がある
      複数選択肢での絞り込みがOR検索であった場合、以下のようなコードになります。

      'meta_query' => array(
      	array(	'key'=>'key1',
      		'value'=>'キーワードA',
      		'compare'=>'LIKE'
      		),
      	array(	'key'=>'key1',
      		'value'=>'キーワードB',
      		'compare'=>'LIKE'
      		),
      	array(	'key'=>'key1',
      		'value'=>'キーワードC',
      		'compare'=>'LIKE'
      		)
      	'relation'=>'OR'
      	)
      )

      選択肢の数にもよりますが、上記のようなクエリを発行するとかなり重くなる場合があります。

    上記二点を解決するため、発想を変えて以下のように「カスタムタクソノミー」で管理される事をおすすめします。

    • register_taxonomyで、絞り込みを行いたい投稿にタクソノミーを紐づける
    • カスタムフィールドで作っていた選択肢をタームとして登録する
    • 検索フォームの選択肢はテンプレートファイルに直書きせず、get_termsなどで出力する
    • 検索結果ページでは、GETパラメータで渡ってきたタームスラッグを元に、以下のようにクエリを投げる
      $args  = array(
      	'post_type'      => 'XXXX',
      	'posts_per_page' => -1,
      		'tax_query' => array(
      			array(
      					'taxonomy' => 'cat_xxx', //カスタムタクソノミーのスラッグ
      					'field'    => 'slug',
      					'terms'    => array( 'slug1', 'slug2' ), 絞り込むタームスラッグ
      				)
      			)
      		));
      );
      $query = new WP_Query( $args );

    上記のようにすれば、正確に絞り込みができ、コードもシンプルになり、また負荷も抑える事が出来るのではないかと思います。

1件の返信を表示中 - 1 - 1件目 (全1件中)
  • このトピックに返信するにはログインが必要です。