cómo obtener una lista de todos los usuarios y sus metadatos
¿Cómo puedo obtener una lista de todos los usuarios con rol = 'Customers' incluyendo todos los metadatos por usuario, es decir wp_users + wp_usermeta?
La consulta siguiente no genera los resultados deseados.
$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);
Pero esa lista no es correcta. Muestra cada usuario x veces dependiendo del número de filas en wp_usermeta.
¿Cómo puedo filtrarla? ¿Para que cada usuario muestre por registro todos sus datos de usuario + metadatos?

Creo que deberías usar las funciones de wp-api que harán todo por ti.
- La función get_users() obtendrá todos los datos de los usuarios, solo define los campos que necesites.
- La función get_user_meta() obtendrá los metadatos del usuario.
$users = get_users( array( 'fields' => array( 'ID' ) ) );
foreach($users as $user){
print_r(get_user_meta ( $user->ID));
}

¿Pero esto no hará una consulta por usuario a la base de datos? ¿Hay alguna forma de hacerlo con menos consultas?

Cuando WP recupera un objeto como un usuario/publicación/término, también obtiene previamente sus metadatos y los guarda en wp_cache
para reducir el número de consultas y acelerar el proceso. Esas llamadas a get_user_meta
no generarán consultas a la base de datos, los datos ya fueron obtenidos cuando se llamó a get_users
.

Una forma un poco más formal de lograr los mismos resultados es la siguiente. Sustituye cualquier rol según sea necesario y este código asume que estás usando WooCommerce para obtener información más detallada.
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;
$DBRecord[$i]['FirstName'] = $user->first_name;
$DBRecord[$i]['LastName'] = $user->last_name;
$DBRecord[$i]['RegisteredDate'] = $user->user_registered;
$DBRecord[$i]['Email'] = $user->user_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;
}

He creado un simple plugin gratuito, llamado Flat Meta Data, que convierte los metadatos de publicaciones y usuarios en un CSV que puede utilizarse más fácilmente para informes y análisis. En el proceso, crea tablas en tu base de datos ([:prefix]postmeta_flat
y [:prefix]usermeta_flat
) que contienen la misma información y pueden usarse en consultas más complejas. Estas tablas tienen una fila por publicación o usuario y una columna por punto de datos (meta_key) que contiene los valores meta (meta_value).
Después de instalar y activar el plugin (en wp-content/plugins/flat-table), es accesible a través de un enlace en el menú principal del panel de administración, llamado Flat Meta Data. Luego puedes hacer clic en el botón "Descargar metadatos de publicaciones" o "Descargar metadatos de usuarios" para generar la tabla y descargar el CSV que contiene todos los datos en formato de hoja de cálculo.
Algunas notas importantes:
- Este plugin se proporciona de forma gratuita. Úsalo bajo tu propio riesgo.
- Se requieren privilegios CREATE TABLE. Esto no debería ser un problema, pero podría serlo si has restringido el acceso al usuario de la base de datos de WordPress.
- Generar y descargar un conjunto completo de metadatos puede afectar negativamente el rendimiento del sistema. Por favor, hazlo solo durante horas de baja actividad o, mejor aún, en un entorno de pruebas con tus datos en vivo.
Por favor, avísame si tienes alguna pregunta. Gracias.

¡Hola y bienvenido! ¿Podrías actualizar tu respuesta para explicar cómo lo hace? Las respuestas deben ser autónomas, no pueden depender completamente de enlaces externos.

Gracias por la orientación, Tom. Espero que mis ediciones sean suficientes. Por favor, házmelo saber si necesitas alguna aclaración.

Ah, pero eso es solo cómo usar el plugin :( Necesitas responder la pregunta, y un plugin no hace eso. Puedes enlazar a recursos externos como lecturas adicionales o ejemplos, pero la respuesta debe contener la solución en su texto. Enlazar a un plugin es solo una recomendación, no una respuesta. Al leer esto, todavía no tengo idea de cómo tu plugin resuelve el problema, no hay detalles técnicos, lo cual es una pena porque es un gran ejemplo para demostrar habilidad técnica y responder la pregunta de manera práctica

$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);
Esto devolverá los datos de la siguiente manera
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
)
);
