web-dev-qa-db-ja.com

Wp_usersと共にwp_usermetaを照会します。

私は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エントリの例に従うようにしました。

助けや指導をありがとう。

2
Wold

これは単純な答えではないので、最初に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を表します。

3
Bordoni