私はWordPressのクエリ機能を使い、タスクには外部プラグインを使いたくない。これが私がこれまでに持っているものです:
add_filter('user_search_columns', 'user_search_columns_bd' , 10, 3);
function user_search_columns_bd($search_columns, $search, $this){
if(!in_array('display_name', $search_columns)){
$search_columns[] = 'display_name';
}
return $search_columns;
}
$args = array(
'search' => $s,
'search_columns' => array( 'user_login', 'user_email'),
'meta_query' => array(
'relation' => 'OR',
0 => array(
'key' => 'first_name',
'value' => $s,
'compare' => 'LIKE'
),
1 => array(
'key' => 'last_name',
'value' => $s,
'compare' => 'LIKE'
)
)
);
$user_query = new WP_User_Query( $args );
完全なdisplay_name、完全なuser_login、または完全なuser_emailを入力すると、この検索は正しく機能します。
検索クエリにusermetaテーブルの姓または名が含まれている場合は結果を返すことができます。また、すべてのクエリで大文字と小文字が区別されないようにしたい(これは別の問題でした)。
引数としてmeta_query
を適切に使用しているかどうかはわかりませんが、 WP_User_Query()
のWordPress Codexエントリの例に従うようにしました。
助けや指導をありがとう。
これは単純な答えではないので、最初にOR
ではなくAND
を介してmeta_query
をメインクエリーとやりとりさせるために、もう1つフィルタを追加する必要があります。私のコードサンプルをチェックしてください。
add_filter('user_search_columns', 'q166419_user_search_columns' , 10, 3);
function q166419_user_search_columns($search_columns, $search, $this){
if(!in_array('display_name', $search_columns)){
$search_columns[] = 'display_name';
}
return $search_columns;
}
// Here is where the magic happens
add_filter( 'get_meta_sql', 'q166419_user_meta_filter', 10, 6 );
function q166419_user_meta_filter( $sql, $queries, $type, $primary_table, $primary_id_column, $context ){
// If it's not user forget it!
if ( $type !== 'user' ){
return $sql;
}
// Only if our variable is true then we will do the change
if ( ! isset( $context->query_vars['meta_query']['replace_and'] ) || $context->query_vars['meta_query']['replace_and'] !== true ){
return $sql;
}
$sql['where'] = preg_replace('/AND/', 'OR', $sql['where'], 1);
return $sql;
}
$args = array(
'search' => $s,
'search_columns' => array( 'user_login', 'user_email'),
'meta_query' => array(
'relation' => 'OR',
'replace_and' => true, // Flag for the dark magic
array(
'key' => 'first_name',
'value' => $s,
'compare' => 'LIKE'
),
array(
'key' => 'last_name',
'value' => $s,
'compare' => 'LIKE'
)
)
);
ボーナス:大文字と小文字を区別する検索を解決するには、これをSQLテーブルに適用する必要があります。
ALTER TABLE wp_usermeta CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE wp_users CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ci
の終わりにあるCollate
は、Case Insensitveを表します。