web-dev-qa-db-ja.com

WP_User_Query使用時にdisplay_name列を検索する方法

私はWP_User_Queryを使ってユーザーのリストを表示しています。 この記事 によると、私はsearch_columnsパラメータを使って(wp_usersテーブルで想定している)特定の列にクエリを集中させることができます。

私の質問:

$args = array(
    'search' => 'Rami',
    'search_columns' => array( 'user_login', 'user_email', 'display_name' ),
);
$user_query = new WP_User_Query( $args );

私の目的は、照会をdisplay_name列に表示させることですが、それはうまくいかないようです。おもしろいことに、display_nameは articleの例では言及されている列ではありません しかし、wp_usersテーブルの 間違いなく 列です。

WP_User_Queryを使用しているときにdisplay_name列を検索する方法を教えてください。

3
henrywright

これを試すことができます:

/**
 * Add support for the "display_name" search column in WP_User_Query
 * 
 * @see http://wordpress.stackexchange.com/a/166369/26350
 */
add_filter( 'user_search_columns', function( $search_columns ) {
    $search_columns[] = 'display_name';
    return $search_columns;
} );

利用可能な検索列を変更するために user_search_columns フィルターを使用します。

それでは、このフィルターでどのようなフィールドを使用できますか?これがwp_usersテーブルのすべてのフィールドのリストです:

x ID
x user_login
  user_pass
x user_nicename
x user_email
x user_url
  user_registered
  user_activation_key
  user_status
  display_name

デフォルトの検索列をxでマークしました。

12
birgire

codex によると、display_nameはサポートされていません。

あなたはpre_user_queryフィルタを使うことができます。

function henry_display_name_find( $query ) {
    global $wpdb;

    /* you don't say where the name comes from - this assumes a $_POST field */
    $display_name = $_POST['display_name'];

    $use_like_syntax = false;

    if ( $use_like_syntax = true ) {
        $query->query_where .= $wpdb->prepare( " AND $wpdb->users.display_name LIKE %s", '%' . like_escape( $display_name ) . '%' );
    } else {
        $query->query_where .= $wpdb->prepare( " AND $wpdb->users.display_name = %s", $display_name );
    }
}
add_action( 'pre_user_query', 'henry_display_name_find' );

あなたはおそらく関数内のフィルタを追加したり削除したいと思うでしょう。

3
shanebp