как получить список всех пользователей и их метаданные
Как получить список всех пользователей с ролью '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));
}
Но разве это не будет создавать по одному запросу к базе данных для каждого пользователя? Есть ли способ сделать это с меньшим количеством запросов?
Mikael Lindqvist
Когда WordPress получает объект, такой как пользователь/запись/термин, он также предварительно загружает его метаданные и помещает их в wp_cache, чтобы уменьшить количество запросов и ускорить работу. Эти вызовы get_user_meta не будут выполнять запросы к базе данных, так как данные уже были загружены при вызове get_users.
Tom J Nowell
Более формальный способ достижения тех же результатов выглядит следующим образом. Замените любую роль по необходимости, этот код предполагает использование 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 к базе данных ограничен.
- Генерация и загрузка полного набора метаданных может негативно сказаться на производительности системы. Пожалуйста, делайте это только в нерабочее время или, еще лучше, на тестовом стенде с вашими реальными данными.
Пожалуйста, дайте мне знать, если у вас есть вопросы. Спасибо.
Привет и добро пожаловать! Не могли бы вы обновить ваш ответ, объяснив, как это работает? Ответы должны быть самодостаточными, они не могут полностью полагаться на внешние ссылки.
Tom J Nowell
Спасибо за рекомендации, Том. Надеюсь, мои правки достаточны. Пожалуйста, дайте знать, если потребуются дополнительные разъяснения.
Tim Burch
Но это же просто объяснение, как использовать плагин :( Вам нужно ответить на вопрос, а плагин сам по себе не является ответом. Вы можете ссылаться на внешние ресурсы как дополнительную литературу или примеры, но в тексте ответа должен содержаться сам ответ. Ссылка на плагин — это просто рекомендация, а не ответ. Читая это, я по-прежнему не понимаю, как ваш плагин решает проблему — отсутствуют технические детали, что очень жаль, ведь это отличный пример для демонстрации технических навыков и практического ответа на вопрос
Tom J Nowell
$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
)
);