我正在尝试使用以下功能查看用户列表(音乐艺术家)。
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
领域
显示的代码工作正常。当我尝试使用注释掉的查询时,结果为空。我可能做错了什么?还是有什么有效或更好的方法来实现这一点?
SO网友:birgire
使用当前设置,您面临SQL注入的风险:
$wpdb->users.display_name LIKE \'$ltr%\'
以下内容也可能是SQL查询中有问题的部分:
AND $wpdb->usermeta.meta_value = %artist%
即使用
=
而不是
LIKE
.
您还缺少引号:%\\"artist\\"%
, 排除,例如。bartist
或fartist
;-)
但您不需要手动构造此SQL查询。
更好的选择
您可以使用
WP_User_Query
类别:
$users = new WP_User_Query( [ \'role\' => \'artist\' ] );
或者是
get_users()
改为包装器:
$users = get_users( [ \'role\' => \'artist\' ] );
它将为您生成SQL查询,其中
INNER JOIN
.