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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

1回答

4831閲覧

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

JP_Shiba_Inu

総合スコア8

WordPress

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2016/12/22 02:51

編集2016/12/25 03:07

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

現在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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

PHP

1function extended_user_search( $user_query ) { 2 // Make sure this is only applied to user search 3 if ( $user_query->query_vars['search'] ){ 4 $search = trim( $user_query->query_vars['search'], '*' ); 5 if ( $_REQUEST['s'] == $search ){ 6 global $wpdb; 7 8 $user_query->query_from .= " JOIN {$wpdb->usermeta} as UM1 ON UM1.user_id = {$wpdb->users}.ID AND UM1.meta_key = 'first_name'"; 9 $user_query->query_from .= " JOIN {$wpdb->usermeta} as UM2 ON UM2.user_id = {$wpdb->users}.ID AND UM2.meta_key = 'last_name'"; 10 $user_query->query_from .= " JOIN {$wpdb->usermeta} as UM3 ON UM3.user_id = {$wpdb->users}.ID AND UM3.meta_key = 'nickname'"; 11 12 $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' ); 13 14// デバッグ用コード ここから(消してOK) 15?><pre><?php 16var_dump($user_query); 17?></pre><?php 18// デバッグ用コード ここまで(消してOK) 19 20 } 21 } 22} 23add_action( 'pre_user_query', 'extended_user_search' );

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

PHP

1function extended_user_search( $user_query ) { 2 // Make sure this is only applied to user search 3 if ( $user_query->query_vars['search'] ){ 4 $search = trim( $user_query->query_vars['search'], '*' ); 5 6?><pre><?php 7var_dump($search); 8?></pre><?php 9 10 if ( $_REQUEST['s'] == $search ){ 11 global $wpdb; 12 13 $user_query->query_from .= " JOIN {$wpdb->usermeta} as UM1 ON UM1.user_id = {$wpdb->users}.ID AND UM1.meta_key = 'first_name'"; 14 $user_query->query_from .= " JOIN {$wpdb->usermeta} as UM2 ON UM2.user_id = {$wpdb->users}.ID AND UM2.meta_key = 'last_name'"; 15 $user_query->query_from .= " JOIN {$wpdb->usermeta} as UM3 ON UM3.user_id = {$wpdb->users}.ID AND UM3.meta_key = 'nickname'"; 16 17 // "田中 一郎" 18 $user_query->query_where = 'WHERE 1=1'; 19 $keywords = explode(' ', str_replace(' ', ' ', $search)); // "田中 一郎" -> "田中 一郎" -> "田中","一郎" 20 21 foreach($keywords as $keyword) { // $keyword = "田中","一郎" 22 $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 ); 23 $key1 = $key1 . $keyword; // $key1 = "田中一郎" 24 } 25 26 $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 ); 27 28// デバッグ用コード ここから(消してOK) 29?><pre><?php 30var_dump($user_query); 31?></pre><?php 32// デバッグ用コード ここまで(消してOK) 33 34 } 35 } 36} 37add_action( 'pre_user_query', 'extended_user_search' );

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

投稿2016/12/22 05:00

編集2016/12/24 04:46
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JP_Shiba_Inu

2016/12/22 08: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に「鈴木 太郎」と入力して検索結果が表示できる様にしたいのですが可能でしょうか? その場合「鈴木 太郎」もしくは「鈴木太郎」の様にスペースがあってもなくても検索できると理想的なのです。 よろしければ引き続き宜しくお願い致します。
JP_Shiba_Inu

2016/12/24 04:27

返信が遅くなり申し訳ありません。 回答ありがとうございます。 こちらのコードなのですが CONCAT(UM1.meta_value,UM2.meta_value)ですと名・姓でしか検索できない為 CONCAT(UM2.meta_value,UM1.meta_value)を追加したのですが正しいでしょうか? それから6〜8行目のコードは消さない方が様のでしょうか? お忙しい中、恐縮ですが引き続きご教授下さい。 宜しくお願い致します。
退会済みユーザー

退会済みユーザー

2016/12/24 04:48

> こちらのコードなのですが > CONCAT(UM1.meta_value,UM2.meta_value)ですと名・姓でしか検索できない為 > CONCAT(UM2.meta_value,UM1.meta_value)を追加したのですが正しいでしょうか? `CONCAT(UM2.meta_value,UM1.meta_value)`とするのが正しいです。 > それから6〜8行目のコードは消さない方が様のでしょうか? 見ての通り、デバッグ用コードなので消していいです。
JP_Shiba_Inu

2016/12/24 05:05

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問