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

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

ただいまの
回答率

87.78%

チェックボックスを使用した、ユーザー情報カスタムフィールドの絞り込み

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,056

score 16

■やりたいこと
ユーザ情報に登録されている、カスタムフィールドをキーにした複数条件の絞り込み検索
■表示ページ
固定ページ
■使用したプラグイン
Advanced Custom Fields
■検索用プラグイン
サーバーの仕様上、導入することができませんでした。

ユーザー登録時に、ACFで設定した下記カスタムフィールドに情報を入れ込んでいます。
必須項目としており、空データはありません。
また、登録ユーザー一覧は、固定ページに表示出来ております。

ACFにてカスタムフィールドを作成。
ラベル:名前
①出身国:country ←ラジオボタン
選択肢:日本,アメリカ,中国,フランス,他
②移動手段:transportation ←チェックボックス
選択肢:自家用車,自転車,バイク,徒歩,公共交通機関,他

上記2つを絞り込みのキーとして検索をさせたくて、下記フォームを作成。

<form role="search" method="get" id="searchform" action="<?php echo home_url(); ?>" >
<label for="s"></label>
<h2>出身国</h2>
        <input type="hidden" name="s" id="s" class="hiden" priceholder="検索" />    
        <input type="checkbox" name="country[]" value="日本" id="c05"><label for="c05">日本</label>
        <input type="checkbox" name="country[]" value="アメリカ" id="c04"><label for="c04">アメリカ</label>
        <input type="checkbox" name="country[]" value="中国" id="c03"><label for="c03">中国</label>
        <input type="checkbox" name="country[]" value="フランス" id="c02"><label for="c02">フランス</label>
        <input type="checkbox" name="country[]" value="他" id="c01"><label for="c01">他</label>

<br><br>
<h2>移動手段</h2>
        <input type="checkbox" name="trans[]" value="自家用車" id="l06"><label for="l06">自家用車</label>
        <input type="checkbox" name="trans[]" value="自転車" id="l05"><label for="l05">自転車</label>
        <input type="checkbox" name="trans[]" value="バイク" id="l04"><label for="l04">バイク</label>
        <input type="checkbox" name="trans[]" value="徒歩" id="l03"><label for="l03">徒歩</label>
        <input type="checkbox" name="trans[]" value="公共交通機関" id="l02"><label for="l02">公共交通機関</label>
        <input type="checkbox" name="trans[]" value="他" id="l01"><label for="l01">他</label>
<div class="read_btn"><button type="submit" value="" id="submit" class=""/>この条件で検索する</button></div>
</form>


受取側:search.php

<?php
  $s = $_GET['s'];
  $country  = implode(',', $_GET['country']);
  $language = implode(',', $_GET['language']);

  if($country){
    $meta_query[] = array(
      'meta_query' => array(
      'relation' => 'AND',
        array(
          'key' => 'country',
          'value'   => $country,
          'compare' => 'LIKE'
        ),
        array(
          'key' => 'language',
          'value'   => $language,
          'compare' => 'LIKE'
        ),
      ),
    );
  }
  $args = array(
    'meta_query' => $meta_query,
    'role' => 'ユーザー権限限定のため',
    's' => $s,
    'posts_per_page' => -1
  );
?>

<?php
    $wp_user_query = new WP_User_Query( $args );
    #$users = $wp_user_query->get_results();
    ?>
    <?php if ( ! empty( $wp_user_query->results ) ) :?>
    <?php foreach ( $wp_user_query->results as $user ) :
          $uid = $user->ID;
          $userData = get_userdata($uid);
?>
    <?php include /*表示のためのメタ取得インクルードファイル.php ?>
    <?php endforeach; ?>
    <?php else: ?>
      <p>ユーザーが見つかりません。</p>
    <?php endif;?>


それぞれ単一選択でしたら表示されますが、
国や移動手段を複数選択すると「ユーザーが見つかりません。」となってしまいます。
色々やってみたのですが、どうしてもうまくいかず、ご教授いただけますと助かります。
よろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

クラスリファレンス/WP Meta Query - WordPress Codex 日本語版

value (文字列|配列) - カスタムフィールドの値。compareが 'IN', 'NOT IN', 'BETWEEN',または 'NOT BETWEEN'の時のみ、配列にできる。

ですから、compare を LIKE ではなく IN にしてみてください。

追記

コメントより

<?php
$s       = $_GET['s'];
$country = implode( ',', $_GET['country'] );
$trans   = implode( ',', $_GET['trans'] );

if ( $country ) {
    $meta_query[] = array(
        'meta_query' => array(
            'relation' => 'AND',
            array(
                'key'     => 'country',
                'value'   => $country,
                'compare' => 'IN'
            ),
            array(
                'key'     => 'trans',
                'value'   => $trans,
                'compare' => 'IN'
            ),
        ),
    );
}
$args = array(
    'meta_query'     => $meta_query,
    'role'           => 'ユーザー権限限定のため',
    's'              => $s,
    'posts_per_page' => -1,
);

とのことですが、

  1. ACF でのカスタムフィールドのフィールド名が transportation であれば、'key' => 'trans' ではなく 'key' => 'transportation'
    クラスリファレンス/WP Meta Query - WordPress Codex 日本語版

  2. WP_User_Query の検索パラメータは s ではなく search
    クラスリファレンス/WP User Query - WordPress Codex 日本語版

になります。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/07/11 23:22

    > $_GET['language'] はこちらへ転記した時の単純ミスです。ごめんなさい。
    該当箇所を修正していただけますでしょうか?

    キャンセル

  • 2019/07/12 09:53 編集

    <?php
    $s = $_GET['s'];
    $country = implode(',', $_GET['country']);
    $trans= implode(',', $_GET['trans']);

    if($country){
    $meta_query[] = array(
    'meta_query' => array(
    'relation' => 'AND', /*ここをORと切り替えてのチェックをしました*/
    array(
    'key' => 'country',
    'value' => $country,
    'compare' => 'IN' /*LIKEからINに変更*/
    ),
    array(
    'key' => 'trans',
    'value' => $trans,
    'compare' => 'IN' /*LIKEからINに変更*/
    ),
    ),
    );
    }
    $args = array(
    'meta_query' => $meta_query,
    'role' => 'ユーザー権限限定のため',
    's' => $s,
    'posts_per_page' => -1
    );
    ?>

    <?php
    $wp_user_query = new WP_User_Query( $args );
    #$users = $wp_user_query->get_results();
    ?>
    <?php if ( ! empty( $wp_user_query->results ) ) :?>
    <?php foreach ( $wp_user_query->results as $user ) :
    $uid = $user->ID;
    $userData = get_userdata($uid);
    ?>
    <?php include /*表示のためのメタ取得インクルードファイル.php ?>
    <?php endforeach; ?>
    <?php else: ?>
    <p>ユーザーが見つかりません。</p>
    <?php endif;?>

    キャンセル

  • 2019/07/12 09:54

    コメントありがとうございます。
    こんな感じです。

    キャンセル

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

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

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