Внутреннее подключение пользовательских таблиц для выбора пользователей с ролями

Я пытаюсь просмотреть список пользователей (которые являются исполнителями музыки) со следующей функцией.

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_capabilities, который имеет имя роли пользователя в поле meta_value .

Показанный код работает отлично. Когда я пытаюсь использовать запрошенный комментарий, результат пуст. Что я могу делать неправильно? Или есть эффективный или лучший способ достичь этого?

Solutions Collecting From Web of "Внутреннее подключение пользовательских таблиц для выбора пользователей с ролями"

Проблемы

Вы рискуете инъекцией 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 .