SQL запрос для выборки пользователей по метаданным

11 окт. 2011 г., 17:02:24
Просмотры: 15.7K
Голосов: 5

Привет, я пытаюсь выбрать пользователей только с определенной ролью, используя следующий SQL запрос...

SELECT DISTINCT ID, u.user_login, u.user_nicename, u.user_email
FROM wp_users u, wp_usermeta m
WHERE m.meta_key = 'wp_capabilities'
AND m.meta_value LIKE '%supplier%'
ORDER BY u.user_registered

Однако, он возвращает всю таблицу. Что я делаю не так?

P.S. Это должен быть именно SQL запрос, так как я делаю это в phpMyAdmin для экспорта данных в CSV.

Заранее спасибо!

sql
2
Комментарии

Возможно, вам повезет больше на сайте Администраторы баз данных Stack Exchange.

Chris_O Chris_O
11 окт. 2011 г. 18:41:33

@Chris_O Я не согласен. Хотя это относится к общим операциям с базами данных, но также затрагивает части API WordPress, как показано в ответе kaiser ниже. Я считаю, что этот вопрос должен остаться.

EAMann EAMann
12 окт. 2011 г. 01:05:35
Все ответы на вопрос 2
3

Проверьте синтаксис вашего SQL-запроса. Похоже, вы хотите выполнить JOIN ... Но ваш запрос составлен неправильно.

Он должен выглядеть примерно так:

SELECT u.ID, u.user_login, u.user_nicename, u.user_email
FROM $wpdb->users u
INNER JOIN $wpdb->usermeta m ON m.user_id = u.ID
WHERE m.meta_key = 'wp_capabilities'
AND m.meta_value LIKE '%supplier%'
ORDER BY u.user_registered

Вам нужно указать запросу, как связывать метаданные пользователя с самим пользователем.

Также обратите внимание, что я использую $wpdb-> вместо wp_. Это важно, если вы планируете использовать этот запрос в плагине на сайте с префиксом базы данных, отличным от "wp". Однако если вы выполняете запросы напрямую в SQL, следует вернуть стандартный префикс.

11 окт. 2011 г. 18:43:24
Комментарии

Когда я заменил == на = и исправил опечатку в слове 'capabilities', все заработало как надо. Спасибо, EAMann! Поскольку я использую это в phpmyadmin, мне не нужно указывать префикс таблицы через $wpdb->. Но для тех, кто встраивает этот код в php, это определенно правильный подход!

Gyro Gyro
11 окт. 2011 г. 23:52:58

Извините, я написал это наспех, пока отлаживал кучу операций сравнения в .Net ... == там работает лучше, поэтому я по ошибке использовал его. Теперь все исправлено выше.

EAMann EAMann
12 окт. 2011 г. 01:04:23

Это очень помогло мне найти пользователей, которые являются клиентами WooCommerce, так как эта информация хранится в поле wp_capabilities. Спасибо!

Denoteone Denoteone
19 авг. 2014 г. 10:37:25
0
-1

В ядре WordPress есть встроенный (query-)класс:

new WP_User_Query;

// Пример
$all_subscribers = new WP_User_Query( array( 'role' => 'subscriber' ) );

Это позволяет перебирать пользовательские объекты:

// Пример
foreach ( $all_subscribers as $subscriber )
{
    echo $subscriber->display_name;

    // Проверим объект:
    var_dump( $subscriber );
}

Для дополнительных примеров или запросов пользователей по другим полям, обратитесь к кодексу.

11 окт. 2011 г. 19:22:29