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.
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.