как получить список всех пользователей и их метаданные
Как получить список всех пользователей с ролью '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.
Как можно отфильтровать результаты так, чтобы каждый пользователь отображался один раз со всеми его данными и метаданными?

Я считаю, что вам следует использовать функции 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));
}

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

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

Более формальный способ достижения тех же результатов выглядит следующим образом. Замените любую роль по необходимости, этот код предполагает использование 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;
}

Я создал простой бесплатный плагин под названием 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-файл, содержащий все данные в виде таблицы.
Несколько примечаний:
- Этот плагин предоставляется бесплатно. Используйте на свой страх и риск.
- Требуются привилегии CREATE TABLE. Обычно это не проблема, но может стать ею, если доступ пользователя WordPress к базе данных ограничен.
- Генерация и загрузка полного набора метаданных может негативно сказаться на производительности системы. Пожалуйста, делайте это только в нерабочее время или, еще лучше, на тестовом стенде с вашими реальными данными.
Пожалуйста, дайте мне знать, если у вас есть вопросы. Спасибо.

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

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

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

$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
)
);
