web-dev-qa-db-fra.com

interroger les utilisateurs par rôle

J'ai un plugin personnalisé qui interroge les utilisateurs et usermeta, mais je dois maintenant filtrer les résultats des administrateurs. Une version très simplifiée de ma requête SQL est:

SELECT * FROM usermeta LEFT JOIN users ON users.ID = user_id 
WHERE meta_key = 'last_name' AND 
user_role != 'admin' 
ORDER BY meta_value 
ASC LIMIT 0, 25

user_role n'est pas un champ, et j'ai vu comment il est stocké en tant que chaîne de configuration, mais je ne vois pas comment faire une requête équivalente à ceci. Est-ce que je manque quelque chose?

Merci.

1
benstraw

Vous pouvez utiliser cette fonction:

// get users with specified roles
function getUsersWithRole( $roles ) {
    global $wpdb;
    if ( ! is_array( $roles ) )
        $roles = array_walk( explode( ",", $roles ), 'trim' );
    $sql = '
        SELECT  ID, display_name
        FROM        ' . $wpdb->users . ' INNER JOIN ' . $wpdb->usermeta . '
        ON          ' . $wpdb->users . '.ID             =       ' . $wpdb->usermeta . '.user_id
        WHERE       ' . $wpdb->usermeta . '.meta_key        =       \'' . $wpdb->prefix . 'capabilities\'
        AND     (
    ';
    $i = 1;
    foreach ( $roles as $role ) {
        $sql .= ' ' . $wpdb->usermeta . '.meta_value    LIKE    \'%"' . $role . '"%\' ';
        if ( $i < count( $roles ) ) $sql .= ' OR ';
        $i++;
    }
    $sql .= ' ) ';
    $sql .= ' ORDER BY display_name ';
    $userIDs = $wpdb->get_col( $sql );
    return $userIDs;
}
5
Anh Tran

La 3ème ligne de la fonction ne fonctionnait pas pour moi car array_walk renvoie un booléen au lieu du tableau souhaité. J'ai changé la ligne 3 en:

$roles = array_map('trim',explode( ",", $roles ));

Et ça marche pour moi maintenant.

0
user1583875