内部联接用户表以选择具有角色的用户

时间:2015-07-20 作者:Sid

我正在尝试使用以下功能查看用户列表(音乐艺术家)。

function show_authors($ltr) {
    global $wpdb;
    $querystr = "SELECT $wpdb->users.* FROM $wpdb->users WHERE $wpdb->users.display_name LIKE \'$ltr%\' ORDER BY $wpdb->users.display_name";

/**
    $querystr = "
    SELECT      *
    FROM        $wpdb->users
    INNER JOIN  $wpdb->usermeta.meta_value
                ON $wpdb->users.user_id = $wpdb->usermeta.user_id
                AND $wpdb->usermeta.meta_key = \'wp_capabilities\'
                AND $wpdb->usermeta.meta_value = %artist%
    WHERE       $wpdb->users.display_name LIKE \'$ltr%\' 
            AND $wpdb->usermeta.meta_key = \'wp_capabilities\' 
                    AND $wpdb->usermeta.meta_value LIKE \'%artist%\'
    ORDER BY    $wpdb->users.display_name ASC
    ";
**/

    $users = $wpdb->get_col($querystr);
    echo "<ul style=\\"list-style-type: none;\\">";
        foreach($users as $user) {
          $user = get_userdata($user);
          $post_count = get_usernumposts($user->ID);
           echo \'<li><i class="fa fa-user"></i> <a href="\' . get_author_posts_url($user->ID, $user->user_nicename) . \'"> \' . $user->first_name . \' \' . $user->last_name . \'</a> (\'. $post_count .\' songs)</li>\';
    }
    echo "</ul>";
}
我试过了inner join usermeta表,以便我可以使用meta_key 名为wp\\u capabilities,其中包含meta_value 领域

显示的代码工作正常。当我尝试使用注释掉的查询时,结果为空。我可能做错了什么?还是有什么有效或更好的方法来实现这一点?

1 个回复
SO网友:birgire

使用当前设置,您面临SQL注入的风险:

$wpdb->users.display_name LIKE \'$ltr%\'
以下内容也可能是SQL查询中有问题的部分:

AND $wpdb->usermeta.meta_value = %artist%
即使用= 而不是LIKE.

您还缺少引号:%\\"artist\\"%, 排除,例如。bartistfartist ;-)

但您不需要手动构造此SQL查询。

更好的选择

您可以使用WP_User_Query 类别:

$users = new WP_User_Query( [ \'role\' => \'artist\' ] );
或者是get_users() 改为包装器:

$users = get_users( [ \'role\' => \'artist\' ] );
它将为您生成SQL查询,其中INNER JOIN.

结束