web-dev-qa-db-fra.com

Interroger les utilisateurs par login, méta et rôle

J'utilise pre_user_query pour limiter les résultats affichés sur la page users.php.

Je le limite par rôle et aussi par un champ méta, donc ma requête à partir de est la suivante:

$query->query_from = "
     FROM wp_users 
     INNER JOIN wp_usermeta ON (wp_users.ID = wp_usermeta.user_id) 
     INNER JOIN wp_usermeta AS mt1 ON (wp_users.ID = mt1.user_id) ";

Et mon ressemble à ceci:

$query->query_where = " WHERE 1=1 
AND ( (wp_usermeta.meta_key = 'user-country' 
           AND CAST(wp_usermeta.meta_value AS CHAR) IN ($countries_list))
AND (mt1.meta_key = 'wp_capabilities' AND CAST(mt1.meta_value AS CHAR) 
    LIKE '%\"$role\"%') ) ";

Cela fonctionne très bien, mais j'aimerais aussi pouvoir effectuer une recherche par login ou par e-mail. J'ai essayé de modifier ma requête en:

$query->query_where = "WHERE 1=1 
AND (user_login LIKE 'tom' OR user_email LIKE 'tom') 
AND ( (wp_usermeta.meta_key = 'user-country' 
     AND CAST(wp_usermeta.meta_value AS CHAR) IN ($countries_list))
AND (mt1.meta_key = 'wp_capabilities' 
     AND CAST(mt1.meta_value AS CHAR) LIKE '%\"$role\"%') ) ";

Cependant cela ne fonctionne pas. J'imagine que cela a quelque chose à voir avec le fait que la table wp_users n'a pas de préfixe, mais je ne suis pas sûr à 100%.

EDIT: Juste pour clarifier, il n'y a pas d'erreurs dans le code, je ne reçois tout simplement pas les bons résultats.

2
Steven Jones

Ce n'est pas entièrement de ta faute

La classe chargée de générer la liste des utilisateurs n'honore pas le filtre pre_user_query. Cela signifie que tout tri ou filtrage de colonnes personnalisé reposant sur un objet WP_User_Query modifié (dans pre_user_query) ne fonctionnera pas. Vous pouvez voir ce que je veux dire dans le patch ci-dessous.

Admin-user-list-table ignore le filtre

@@ -100,6 +100,7 @@ class WP_Users_List_Table extends WP_List_Table {

        // Query the user IDs for this page
        $wp_user_search = new WP_User_Query( $args );
+       $wp_user_search = apply_filters( 'pre_user_query', $wp_user_search );

        $this->items = $wp_user_search->get_results();

Je pense que c'est un bug ou du moins un oubli, mais je ne peux pas savoir quelles étaient les intentions des auteurs. Cela vaut peut-être la peine de mentionner les WP personnes sur github (je n’ai pas ouvert de ticket à ce sujet).

WP_User_Query semble immuable

De plus, les méthodes WP_User_Query-> set () et WP_User_Query-> prepare_query () ne font pas ce que j'attends d'eux. Cela peut ou peut ne pas être pertinent pour votre cas. Si vous rencontrez des problèmes (paramètres ignorés), créez simplement un nouvel objet dans le filtre et renvoyez-le.

function pre_user_query( $wp_user_query ) {
    if ( isset( $wp_user_query->query_vars['orderby'] ) and 
            $wp_user_query->query_vars['orderby']  === 'custom-column-slug') {

        $order = strtoupper( $_GET['order'] );
        if ( !in_array( $order , array('ASC', 'DESC') ))
            $order = 'DESC';

        $wp_user_query = new WP_User_Query( array( 
            'fields' =>  'all_with_meta',
            'orderby' =>  'meta_value',
            'order' => $order ,
            'meta_query' => array(
                0 => array(
                    'key' => 'custom-column-slug',
                    'compare' => 'NOT EXISTS',
                ),
                'relation' => 'OR',
                1 => array(
                    'key' => 'custom-column-slug',
                    'compare' => 'IN',
                    'value' => ['zumba', 'swing', 'jazz'],
                ),
            ),
        ));
    }
    return $wp_user_query;
}