как получить список всех пользователей и их метаданные

29 июн. 2016 г., 15:45:38
Просмотры: 115K
Голосов: 19

Как получить список всех пользователей с ролью 'Customers', включая все метаданные для каждого пользователя, то есть данные из таблиц wp_users + wp_usermeta.

Запрос ниже не дает желаемых результатов.

$query = "SELECT * FROM wp_users INNER JOIN wp_usermeta ON wp_users.ID = wp_usermeta.user_id ORDER BY ID DESC');  ";
            
$data = $wpdb->get_results($query,ARRAY_A);

Но этот список некорректен. Он показывает каждого пользователя X раз в зависимости от количества строк в wp_usermeta.

Как можно отфильтровать результаты так, чтобы каждый пользователь отображался один раз со всеми его данными и метаданными?

3
Комментарии

Проверьте это

bravokeyl bravokeyl
29 июн. 2016 г. 16:46:31

но тогда мне нужны два разных вызова: один для пользователя, другой для метаданных. Как их объединить?

Hermants Hermants
29 июн. 2016 г. 16:51:07

И какой именно вызов?

Hermants Hermants
29 июн. 2016 г. 16:58:49
Все ответы на вопрос 4
2
29

Я считаю, что вам следует использовать функции wp-api, которые сделают всё за вас.

  • Функция get_users() получит данные всех пользователей, просто укажите необходимые поля.
  • Функция get_user_meta() получит метаданные пользователя.

$users = get_users( array( 'fields' => array( 'ID' ) ) );
foreach($users as $user){
        print_r(get_user_meta ( $user->ID));
    }
30 июн. 2016 г. 06:45:52
Комментарии

Но разве это не будет создавать по одному запросу к базе данных для каждого пользователя? Есть ли способ сделать это с меньшим количеством запросов?

Mikael Lindqvist Mikael Lindqvist
17 авг. 2019 г. 11:42:05

Когда WordPress получает объект, такой как пользователь/запись/термин, он также предварительно загружает его метаданные и помещает их в wp_cache, чтобы уменьшить количество запросов и ускорить работу. Эти вызовы get_user_meta не будут выполнять запросы к базе данных, так как данные уже были загружены при вызове get_users.

Tom J Nowell Tom J Nowell
26 июн. 2020 г. 15:57:26
0

Более формальный способ достижения тех же результатов выглядит следующим образом. Замените любую роль по необходимости, этот код предполагает использование WooCommerce для более детальной информации.

function GetSubscriberUserData()
{
  $DBRecord = array();
  $args = array(
      'role'    => 'Subscriber', // Роль пользователя
      'orderby' => 'last_name',  // Сортировка по фамилии
      'order'   => 'ASC'         // По возрастанию
  );
  $users = get_users( $args );
  $i=0;
  foreach ( $users as $user )
  {
    $DBRecord[$i]['role']           = "Subscriber";
    $DBRecord[$i]['WPId']           = $user->ID; // ID пользователя в WordPress
    $DBRecord[$i]['FirstName']      = $user->first_name; // Имя
    $DBRecord[$i]['LastName']       = $user->last_name;   // Фамилия
    $DBRecord[$i]['RegisteredDate'] = $user->user_registered; // Дата регистрации
    $DBRecord[$i]['Email']          = $user->user_email;      // Email

    $UserData                       = get_user_meta( $user->ID ); // Метаданные пользователя
    $DBRecord[$i]['Company']        = $UserData['billing_company'][0];  // Компания
    $DBRecord[$i]['Address']        = $UserData['billing_address_1'][0]; // Адрес
    $DBRecord[$i]['City']           = $UserData['billing_city'][0];      // Город
    $DBRecord[$i]['State']          = $UserData['billing_state'][0];     // Область/Штат
    $DBRecord[$i]['PostCode']       = $UserData['billing_postcode'][0];  // Почтовый индекс
    $DBRecord[$i]['Country']        = $UserData['billing_country'][0];   // Страна
    $DBRecord[$i]['Phone']          = $UserData['billing_phone'][0];     // Телефон
    $i++;
  }
  return $DBRecord;
}
2 нояб. 2019 г. 02:53:33
3

Я создал простой бесплатный плагин под названием Flat Meta Data, который преобразует метаданные записей и пользователей в CSV-файл для удобного использования в отчетах и анализе. В процессе он создает таблицы в вашей базе данных ([:prefix]postmeta_flat и [:prefix]usermeta_flat), содержащие ту же информацию и позволяющие выполнять более сложные запросы. Эти таблицы имеют по одной строке для каждой записи или пользователя и по одному столбцу для каждой точки данных (meta_key), содержащей значения метаданных (meta_value).

После установки и активации плагина (в wp-content/plugins/flat-table) он становится доступен через ссылку в главном меню админ-панели под названием Flat Meta Data. Затем вы можете нажать на кнопку "Download post meta data" или "Download user meta data", чтобы сгенерировать таблицу и скачать CSV-файл, содержащий все данные в виде таблицы.

Несколько примечаний:

  1. Этот плагин предоставляется бесплатно. Используйте на свой страх и риск.
  2. Требуются привилегии CREATE TABLE. Обычно это не проблема, но может стать ею, если доступ пользователя WordPress к базе данных ограничен.
  3. Генерация и загрузка полного набора метаданных может негативно сказаться на производительности системы. Пожалуйста, делайте это только в нерабочее время или, еще лучше, на тестовом стенде с вашими реальными данными.

Пожалуйста, дайте мне знать, если у вас есть вопросы. Спасибо.

24 июн. 2020 г. 17:39:13
Комментарии

Привет и добро пожаловать! Не могли бы вы обновить ваш ответ, объяснив, как это работает? Ответы должны быть самодостаточными, они не могут полностью полагаться на внешние ссылки.

Tom J Nowell Tom J Nowell
25 июн. 2020 г. 13:19:49

Спасибо за рекомендации, Том. Надеюсь, мои правки достаточны. Пожалуйста, дайте знать, если потребуются дополнительные разъяснения.

Tim Burch Tim Burch
26 июн. 2020 г. 15:49:57

Но это же просто объяснение, как использовать плагин :( Вам нужно ответить на вопрос, а плагин сам по себе не является ответом. Вы можете ссылаться на внешние ресурсы как дополнительную литературу или примеры, но в тексте ответа должен содержаться сам ответ. Ссылка на плагин — это просто рекомендация, а не ответ. Читая это, я по-прежнему не понимаю, как ваш плагин решает проблему — отсутствуют технические детали, что очень жаль, ведь это отличный пример для демонстрации технических навыков и практического ответа на вопрос

Tom J Nowell Tom J Nowell
26 июн. 2020 г. 15:55:56
0
$members = get_users(
    array('role'    => 'company',
        'orderby' => 'ID',
        'order'   => 'ASC'
    )
);
array_map( function($member ){
  $member->usermeta =  array_map(function($data){
    return reset($data);
  }, get_user_meta( $member->ID ) );
  return $member;
}, $members); 

Это вернет данные в следующем виде

Array
(
    [0] => WP_User Object
        (
            [data] => stdClass Object
                (
                    [ID] => 20
                    [user_login] => aastha
                    [user_pass] => $P$BVmRgRiZyZWhMvGszAkquPKX0JjedF1
                    [user_nicename] => aastha
                    [user_email] => aastha@gmail.com
                    [user_url] => 
                    [user_registered] => 2021-11-29 10:43:21
                    [user_activation_key] => 
                    [user_status] => 0
                    [display_name] => aastha
                    [usermeta] => Array
                        (
                            [nickname] => aastha
                            [first_name] => 
                            [last_name] => 
                            [description] => 
                            [rich_editing] => true
                            [syntax_highlighting] => true
                            [comment_shortcuts] => false
                            [admin_color] => fresh
                            [use_ssl] => 0
                            [show_admin_bar_front] => true
                            [locale] => 
                            [wm_capabilities] => a:1:{s:7:"company";b:1;}
                            [wm_user_level] => 0
                            [name] => btc
                            [type] => 7
                            [status] => active
                            [company_age] => 10
                            [company_member] => 30
                            [address] => indoor
                            [city] => indoor
                            [pin] => 5454
                            [telephone] => 5434
                            [opening_time] => 09:00
                            [closing_time] => 20:00
                            [fax] => gfgf
                            [skull_from] => wednesday
                            [skull_to] => sunday
                            [mobile] => 3987665213
                            [overview] => ghgh
                            [username] => aastha
                            [email] => aastha@gmail.com
                            [wesite] => http://www.aastha.com
                            [skull_logo] => 
                        )

                )

            [ID] => 20
            [caps] => Array
                (
                    [company] => 1
                )

            [cap_key] => wm_capabilities
            [roles] => Array
                (
                    [0] => company
                )

            [allcaps] => Array
                (
                    [read] => 1
                    [level_0] => 1
                    [company] => 1
                )

            [filter] => 
            [site_id:WP_User:private] => 1
        )
);
4 дек. 2021 г. 16:19:42