web-dev-qa-db-fra.com

Requête wp_usermeta auprès de wp_users

Je veux utiliser les fonctions de requête WordPress et aucun plugin externe pour la tâche. Voici ce que j'ai jusqu'à présent:

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 );

Cette recherche fonctionne correctement lorsque vous entrez le nom complet display_name, le nom d'utilisateur complet ou le nom d'utilisateur complet.

Je souhaite pouvoir renvoyer les résultats si la requête de recherche contient un prénom ou un nom de famille issu de la table usermeta, et je souhaite que toutes les requêtes ne soient pas sensibles à la casse (ce qui était un autre problème que je rencontrais).

Je ne suis pas sûr d'utiliser correctement meta_query comme argument, mais j'ai essayé de suivre l'exemple de l'entrée WordPress Codex pour WP_User_Query() .

Merci pour toute aide ou conseils.

2
Wold

Ce n'est pas une réponse simple, vous devez donc au préalable inclure un filtre supplémentaire pour vous permettre de saisir l'interaction entre le meta_query et la requête principale via une variable OR au lieu d'une AND, consultez mon exemple de code:

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'
        )
    )
);

Bonus : pour résoudre votre recherche sensible à la casse, vous devez l'appliquer à vos tables 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;

La ci à la fin de la Collate signifie Case Insensitve.

3
Bordoni