web-dev-qa-db-fra.com

Quel est le moyen le plus efficace de rechercher des utilisateurs par leur nom d'affichage?

Au départ, je pensais utiliser get_users() mais il s’est avéré qu’il ne supportait pas le champ display_name. Ensuite, j'ai lu des informations sur l'utilisation de WP_User_Query, mais cette opération épuise systématiquement la taille de mémoire autorisée de 134217728 octets. Lorsque je supprime la limite de mémoire, cette partie de la page n'essaie même pas de se charger. Maintenant, je songe à exécuter une fonction qui ajoute le nom d'affichage (display_name) de chacun à la méta de l'utilisateur afin que je puisse utiliser get_users() à nouveau. est-ce une bonne idée?

Mon objectif est de faire en sorte que la recherche soit également classée par pertinence. Je prévois de le faire en utilisant explode(' ', $search_query), puis appelez get_users() pour chaque élément du tableau, puis combinez et triez les résultats par occurrence, comme indiqué ci-dessous: https://stackoverflow.com/questions/2176626/php-get-element-with-5-highest-occurrence-in-an-array et je ne sais pas si c'est va être efficace en mémoire.

Merci d'avoir lu.

4
Nadroev

Je pense que vous devriez utiliser la classe par défaut pour ce travail - WP_User_Query . La requête a beaucoup de possibilités, obtenez également le nom complet. WP_User_Query est une classe qui permet d'interroger les tables de base de données WordPress _users et _usermeta.

En outre, il est utile lorsque vous utilisez un cache pour les valeurs. Ici aussi, je préfère les valeurs par défaut de WordPress WP_Cache (cache non persistant) ou les API transitoires (cache géré temporairement par la base de données).

L'exemple ci-dessous va illustrer cela avec WP_Cache. Vous pouvez également le faire avec des transitoires. Le code ne fonctionnera pas, il suffit d'écrire par scratch pour illustrer.

function wpse_get_user_data( $args ) {


    if ( ! $user_query = wp_cache_get( $args->ID, 'your_key' ) ) {
        $user_query = array();
        $user_query = new WP_User_Query( $args );

        wp_cache_add( $args-ID, $user_query, 'your_key' );
    }

    return $user_query;
}
2
bueltge

Si vous appuyez sur une "recherche" par le biais de WP_User_query, vous effectuerez une recherche dans les champs user_login et les champs user_nicename. Cela produit une requête de facto inefficace OR. Vous pouvez réduire cela en utilisant un filtre pour forcer la recherche au champ user_nicename.

add_filter('user_search_columns','nicename_only_wpse_188846');

function nicename_only_wpse_188846($search_columns) {
  return array('user_nicename');
}

$args = array(
  'search' => 'abce',
);

// The Query
$user_query = new WP_User_Query( $args );
var_dump($user_query);

Combinez cela avec la mise en cache et vous pourriez avoir une chance.

Cela dit, 134217728 octets est assez mince si vous avez beaucoup d’utilisateurs et de trafic. Vous aurez peut-être besoin d'une mise à niveau du serveur.

1
s_ha_dum