phpwordpress

can't search by email wordpress


I create a search form with auto-completion. Now my search works by first and last name. But not by mail. What's wrong?

$args = array (
    'order'      => 'ASC',
    'orderby'    => 'display_name',
    'search'     => '*' . esc_attr( $search_term ) . '*',
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key'     => 'first_name',
            'value'   => $search_term,
            'compare' => 'LIKE'
        ),
        array(
            'key'     => 'last_name',
            'value'   => $search_term,
            'compare' => 'LIKE'
        ),
        array(
            'key'     => 'user_email',
            'value'   => $search_term,
            'compare' => 'LIKE'
        )
    )
);

// Create the WP_User_Query object
$wp_user_query = new WP_User_Query( $args );

Solution

  • User e-mail is not meta, so you can't use meta_query. You can use separeted array key search_columns. If you want results, where $search_term contains only one of the options for first_name, last_name or user_email, I found a functional way when I merge two queries (query for search by user_email and your original adapted query). This works for me:

    $args1 = array (
        'order'      => 'ASC',
        'orderby'    => 'display_name',
        'search'     => '*' . esc_attr( $search_term ) . '*',
        'search_columns' => array( 'user_email' )
    );
    $args2 = array (
        'order'      => 'ASC',
        'orderby'    => 'display_name',
        'meta_query' => array(
            'relation' => 'OR',
            array(
                'key'     => 'first_name',
                'value'   => $search_term,
                'compare' => 'LIKE'
            ),
            array(
                'key'     => 'last_name',
                'value'   => $search_term,
                'compare' => 'LIKE'
            )
        )
    );
    
    $query1 = new WP_User_Query( $args1 );
    $query2 = new WP_User_Query( $args2 );
    $wp_user_query = new WP_User_Query();
    $wp_user_query->results = array_merge( $query1->results,$query2->results );