J'ai besoin de créer une page de recherche qui affichera tout ce qui concerne la recherche fournie. comments
le contenant, events
, posts
, CPT
s et users
avec ce nom.
Comment puis-je rechercher sur le site des utilisateurs dont le prénom ou le nom contient la phrase recherchée?
Utilisez simplement WP_User_Query
avec un argument de recherche.
Ainsi, si vous souhaitez rechercher, par exemple, un utilisateur dont le mot clé est user_email
ou des colonnes similaires de la table {$wpdb->prefix}users
, vous pouvez alors:
$users = new WP_User_Query( array(
'search' => '*'.esc_attr( $your_search_string ).'*',
'search_columns' => array(
'user_login',
'user_nicename',
'user_email',
'user_url',
),
) );
$users_found = $users->get_results();
Gardez à l'esprit que *
est un caractère générique. Ainsi, restreindre par exemple le user_email
à un seul domaine vous donnerait la chaîne de recherche suivante: *@example.com
.
La chaîne search
a quelques fonctionnalités "magiques": Le search_columns
par défaut est ...
user_email
si @
est présent dans la search
arg.user_login
et ID
si le search
arg est numériqueuser_url
si la chaîne search
contient http://
ou https://
user_login
et user_nicename
si une chaîne est présente.Toutes ces valeurs par défaut ne sont définies que si l'argument no search_columns
a été spécifié.
Si vous voulez rechercher par exemple first_name
ou last_name
, vous devrez alors faire un meta_query
car ils ne font pas partie de la table principale:
$search_string = esc_attr( trim( get_query_var('s') ) );
$users = new WP_User_Query( array(
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'first_name',
'value' => $search_string,
'compare' => 'LIKE'
),
array(
'key' => 'last_name',
'value' => $search_string,
'compare' => 'LIKE'
)
)
) );
$users_found = $users->get_results();
Assurez-vous de récupérer la chaîne de recherche appropriée. Normalement, ce serait get_query_var('s');
, mais cela pourrait - selon votre formulaire name/id
- être quelque chose de différent que vous voudrez peut-être extraire en utilisant $_GET['user_search']
par exemple. Assurez-vous de bien le supprimer et de supprimer les espaces blancs indésirables du début et de la fin de la chaîne.
Gardez à l'esprit qu'il s'agit d'une array( array() )
car il y a la touche relation
. Si vous souhaitez simplement rechercher une clé unique, il serait peut-être plus simple de vous limiter aux éléments suivants:
$search_string = esc_attr( trim( get_query_var('s') ) );
$users = new WP_User_Query( array(
'meta_key' => 'first_name',
'meta_value' => $search_string,
'meta_compare' => 'LIKE',
) );
$users_found = $users->get_results();
Le résultat pourrait ressembler à ce qui suit:
$search_string = esc_attr( trim( get_query_var('s') ) );
$users = new WP_User_Query( array(
'search' => "*{$search_string}*",
'search_columns' => array(
'user_login',
'user_nicename',
'user_email',
'user_url',
),
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'first_name',
'value' => $search_string,
'compare' => 'LIKE'
),
array(
'key' => 'last_name',
'value' => $search_string,
'compare' => 'LIKE'
)
)
) );
$users_found = $users->get_results();
Cela m'a aidé au lieu de la réponse de Kaiser: https://laubsterboy.com/blog/2015/07/search-wordpress-users-by-name/
Mais dans cette solution, la fonction $wpdb->escape($usermeta_keys)
a généré une erreur, alors j’ai simplement utilisé $usermeta_keys
.