cómo obtener una lista de todos los usuarios y sus metadatos

29 jun 2016, 15:45:38
Vistas: 115K
Votos: 19

¿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?

3
Comentarios

Revisa esto

bravokeyl bravokeyl
29 jun 2016 16:46:31

pero luego necesito dos llamadas diferentes, 1 para el usuario y 1 para los metadatos. ¿Cómo las combino?

Hermants Hermants
29 jun 2016 16:51:07

¿Y esa llamada es??

Hermants Hermants
29 jun 2016 16:58:49
Todas las respuestas a la pregunta 4
2
29

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));
    }
30 jun 2016 06:45:52
Comentarios

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

Mikael Lindqvist Mikael Lindqvist
17 ago 2019 11:42:05

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.

Tom J Nowell Tom J Nowell
26 jun 2020 15:57:26
0

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;
}
2 nov 2019 02:53:33
3

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:

  1. Este plugin se proporciona de forma gratuita. Úsalo bajo tu propio riesgo.
  2. 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.
  3. 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.

24 jun 2020 17:39:13
Comentarios

¡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.

Tom J Nowell Tom J Nowell
25 jun 2020 13:19:49

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

Tim Burch Tim Burch
26 jun 2020 15:49:57

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

Tom J Nowell Tom J Nowell
26 jun 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); 

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
        )
);
4 dic 2021 16:19:42