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

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

ただいまの
回答率

89.99%

管理画面のユーザー一覧検索で名前、ニックネームを検索できる様にカスタマイズ

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,982

JP_Shiba_Inu

score 6

はじめまして。初書き込みになります。

現在WordPressを使用し管理画面のプロフィールページ(profile.php)で名前やニックネームを登録しています。

こちらの情報をユーザー一覧(users.php)の右上のsearch-boxに名前やニックネームを入力して「ユーザーを検索」を押しても「お探しのユーザーは見つかりませんでした。」と表示され検索結果が表示されません。

調査したこと・試したこと
色々自分なりに調べてみたのですが
<a href="https://blog.gti.jp/post-5956/" target="_blank">こちらの記事</a>が似てると思い新規インストールしたWordPressの利用テーマ(Twenty Fourteenバージョン: 1.9)のfunctions.phpに追記してみたのですが
思った様にできませんでした。

記事に記載されていたコードはこちらになりす。

function extended_user_search( $user_query ) {
  // Make sure this is only applied to user search
  if ( $user_query->query_vars['search'] ){
    $search = trim( $user_query->query_vars['search'], '*' );
    if ( $_REQUEST['s'] == $search ){
      global $wpdb;

      $user_query->query_from .= " JOIN wp_usermeta UM1 ON UM1.user_id = {$wpdb->users}.ID AND UM1.meta_key = 'first_name'";
      $user_query->query_from .= " JOIN wp_usermeta UM2 ON UM2.user_id = {$wpdb->users}.ID AND UM2.meta_key = 'last_name'";
      $user_query->query_from .= " JOIN wp_usermeta UM3 ON UM3.user_id = {$wpdb->users}.ID AND UM3.meta_key = 'user_title'";
      $user_query->query_from .= " JOIN wp_usermeta UM4 ON UM4.user_id = {$wpdb->users}.ID AND UM4.meta_key = 'nickname'";

      $user_query->query_where = 'WHERE 1=1' . $user_query->get_search_sql( $search, array( 'user_login', 'user_email', 'user_nicename', 'UM1.meta_value', 'UM2.meta_value', 'UM3.meta_value', 'UM4.meta_value' ), 'both' );
    }
  }
}
add_action( 'pre_user_query', 'extended_user_search' );

WordPressのユーザー一覧検索はデフォルトでユーザー名やメールアドレスでは検索できる様です。

ユーザー一覧の検索で名前(姓、名)やニックネームでも検索できる方法がありましたら是非教えて下さい。

システム情報は以下になります。
WP Version: 4.7
PHP Version: 5.6.29
Database Version: 5.1.73

何卒、回答宜しくお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2016/12/22 20:34

    こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 1

checkベストアンサー

+3

名前(first_name, last_name)、ニックネーム(nickname)を検索対象にするコードです。

function extended_user_search( $user_query ) {
  // Make sure this is only applied to user search
  if ( $user_query->query_vars['search'] ){
    $search = trim( $user_query->query_vars['search'], '*' );
    if ( $_REQUEST['s'] == $search ){
      global $wpdb;

      $user_query->query_from .= " JOIN {$wpdb->usermeta} as UM1 ON UM1.user_id = {$wpdb->users}.ID AND UM1.meta_key = 'first_name'";
      $user_query->query_from .= " JOIN {$wpdb->usermeta} as UM2 ON UM2.user_id = {$wpdb->users}.ID AND UM2.meta_key = 'last_name'";
      $user_query->query_from .= " JOIN {$wpdb->usermeta} as UM3 ON UM3.user_id = {$wpdb->users}.ID AND UM3.meta_key = 'nickname'";

      $user_query->query_where = 'WHERE 1=1' . $user_query->get_search_sql( $search, array( 'user_login', 'user_email', 'user_nicename', 'UM1.meta_value', 'UM2.meta_value', 'UM3.meta_value' ), 'both' );

// デバッグ用コード ここから(消してOK)
?><pre><?php
var_dump($user_query);
?></pre><?php
// デバッグ用コード ここまで(消してOK)

    }
  }
}
add_action( 'pre_user_query', 'extended_user_search' );

追記

こんな感じかな。真面目にテストをしていないので、不具合があったらごめんなさい。

function extended_user_search( $user_query ) {
    // Make sure this is only applied to user search
    if ( $user_query->query_vars['search'] ){
        $search = trim( $user_query->query_vars['search'], '*' );

?><pre><?php
var_dump($search);
?></pre><?php

        if ( $_REQUEST['s'] == $search ){
            global $wpdb;

            $user_query->query_from .= " JOIN {$wpdb->usermeta} as UM1 ON UM1.user_id = {$wpdb->users}.ID AND UM1.meta_key = 'first_name'";
            $user_query->query_from .= " JOIN {$wpdb->usermeta} as UM2 ON UM2.user_id = {$wpdb->users}.ID AND UM2.meta_key = 'last_name'";
            $user_query->query_from .= " JOIN {$wpdb->usermeta} as UM3 ON UM3.user_id = {$wpdb->users}.ID AND UM3.meta_key = 'nickname'";

            // "田中 一郎"
            $user_query->query_where = 'WHERE 1=1';
            $keywords = explode(' ', str_replace(' ', ' ', $search)); // "田中 一郎" -> "田中 一郎" -> "田中","一郎"

            foreach($keywords as $keyword) { // $keyword = "田中","一郎"
                $user_query->query_where .= $user_query->get_search_sql( $keyword, array( 'user_login', 'user_email', 'user_nicename', 'UM1.meta_value', 'UM2.meta_value', 'UM3.meta_value','CONCAT(UM2.meta_value,UM1.meta_value)' ), true );
                $key1 = $key1 . $keyword; // $key1 = "田中一郎"
            }

            $user_query->query_where .= $user_query->get_search_sql( $key1, array( 'user_login', 'user_email', 'user_nicename', 'UM1.meta_value', 'UM2.meta_value', 'UM3.meta_value','CONCAT(UM2.meta_value,UM1.meta_value)' ), true );

// デバッグ用コード ここから(消してOK)
?><pre><?php
var_dump($user_query);
?></pre><?php
// デバッグ用コード ここまで(消してOK)

        }
    }
}
add_action( 'pre_user_query', 'extended_user_search' );


※検索できるケース:"田中","一郎","田中 一郎","田中 一郎","田中一郎"
※検索できないケース:"一郎 田中"

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/12/22 17:28

    迅速な対応ありがとうございます。

    このコードを使用してmeta_keyが'first_name'と'last_name'と'nickname'という様に単語ごとには
    検索できる様になりました。

    あとは名前のcolumnを以下のコードを使用してカスタマイズしております。
    ```
    /*------------------------------------------------*/
    /* ユーザー一覧の名前を姓名に変更します。(列の内部名の設定)
    /*------------------------------------------------*/
    function lastfirst_users_column( $columns ) {
    $new_columns = array();
    foreach ( $columns as $k => $v ) {
    if ( 'name' == $k ) $new_columns['lastfirst_name'] = $v;
    else $new_columns[$k] = $v;
    }
    return $new_columns;
    }
    add_filter( 'manage_users_columns', 'lastfirst_users_column' );
    /**
    * ユーザー一覧の名前を姓名に変更します。(値の設定)
    */
    function lastfirst_users_custom_column( $output, $column_name, $user_id ) {
    if ( 'lastfirst_name' == $column_name ) {
    $user = get_userdata($user_id);
    return $user->last_name . ' ' . $user->first_name;
    }
    }
    add_filter( 'manage_users_custom_column', 'lastfirst_users_custom_column', 10, 3 );
    /**
    * ユーザー一覧の姓名のソート設定を行います。
    */
    function lastfirst_users_sortable_column( $columns ) {
    $columns['lastfirst_name'] = 'lastfirst_name';
    return $columns;
    }
    add_filter( 'manage_users_sortable_columns', 'lastfirst_users_sortable_column' );
    /**
    * ユーザー一覧の姓名のソート処理を追加します。
    */
    function lastfirst_pre_user_query($query){
    global $wpdb;
    // 姓名
    if ( isset($query->query_vars['orderby']) && 'lastfirst_name' == $query->query_vars['orderby'] ) {
    $query->query_from .= " LEFT JOIN $wpdb->usermeta AS ln ON ($wpdb->users.ID = ln.user_id) AND ln.meta_key = 'last_name' ";
    $query->query_from .= " LEFT JOIN $wpdb->usermeta AS fn ON ($wpdb->users.ID = fn.user_id) AND fn.meta_key = 'first_name' ";
    $query->query_orderby = " ORDER BY CONCAT(ln.meta_value, fn.meta_value) " . ($query->query_vars["order"] == 'ASC' ? 'asc' : 'desc');
    }
    return $query;
    }
    add_filter( 'pre_user_query', 'lastfirst_pre_user_query' );
    ```

    名前のcolumnには'last_name'と'first_name'を合わせて表示されますが
    こちらを同時にsearch-boxに入力して検索結果が表示できる様になりませんでしょうか?

    例えば名前のcolumnに「鈴木 太郎」と表示されているとして
    search-boxに「鈴木 太郎」と入力して検索結果が表示できる様にしたいのですが可能でしょうか?

    その場合「鈴木 太郎」もしくは「鈴木太郎」の様にスペースがあってもなくても検索できると理想的なのです。

    よろしければ引き続き宜しくお願い致します。

    キャンセル

  • 2016/12/24 13:27

    返信が遅くなり申し訳ありません。
    回答ありがとうございます。

    こちらのコードなのですが
    CONCAT(UM1.meta_value,UM2.meta_value)ですと名・姓でしか検索できない為
    CONCAT(UM2.meta_value,UM1.meta_value)を追加したのですが正しいでしょうか?

    それから6〜8行目のコードは消さない方が様のでしょうか?

    お忙しい中、恐縮ですが引き続きご教授下さい。

    宜しくお願い致します。

    キャンセル

  • 2016/12/24 13:48

    > こちらのコードなのですが
    > CONCAT(UM1.meta_value,UM2.meta_value)ですと名・姓でしか検索できない為
    > CONCAT(UM2.meta_value,UM1.meta_value)を追加したのですが正しいでしょうか?
    `CONCAT(UM2.meta_value,UM1.meta_value)`とするのが正しいです。

    > それから6〜8行目のコードは消さない方が様のでしょうか?
    見ての通り、デバッグ用コードなので消していいです。

    キャンセル

  • 2016/12/24 14:05

    返信ありがとうございます。
    全て狙い通りに表示できました。
    この度は誠にありがとうございました。

    キャンセル

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

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