web-dev-qa-db-fra.com

Comment puis-je rechercher un utilisateur de wordpress par nom complet ou par partie?

J'ai besoin de créer une page de recherche qui affichera tout ce qui concerne la recherche fournie. comments le contenant, events, posts, CPTs 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?

11
hannit cohen

Recherche dans la table principale

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érique
  • user_url si la chaîne search contient http:// ou https://
  • ou ... 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é.

Recherche dans la table meta

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

Requête finale

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();
21
kaiser

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.

0
Harkály Gergő