come ottenere la lista di tutti gli utenti e i loro metadati
Come posso ottenere una lista di tutti gli utenti con ruolo = 'Customers' includendo tutti i metadati per utente, ovvero wp_users + wp_usermeta.
La query qui sotto non genera i risultati desiderati.
$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);
Ma quella lista non è corretta. Mostra ogni utente x volte a seconda del numero di righe in wp_usermeta.
Come posso filtrarla? In modo che ogni utente mostri per record tutti i suoi dati utente + metadati?

Penso che dovresti utilizzare le funzioni wp-api che faranno tutto per te.
- La funzione get_users() recupererà tutti i dati degli utenti, basta definire i campi che ti servono.
- La funzione get_user_meta() recupererà i metadati dell'utente.
$users = get_users( array( 'fields' => array( 'ID' ) ) );
foreach($users as $user){
print_r(get_user_meta ( $user->ID));
}

Ma questo non farà una query per utente al database? C'è un modo per farlo con meno query?

Quando WP recupera un oggetto come un utente/post/termine, pre-carica anche i suoi meta e li inserisce in wp_cache
per ridurre il numero di query e velocizzare le operazioni. Quelle chiamate get_user_meta
non eseguiranno query al database, i dati erano già stati recuperati quando è stata chiamata get_users
.

Un modo leggermente più formale per ottenere gli stessi risultati è il seguente. Sostituisci qualsiasi ruolo come necessario e questo codice presuppone che tu stia utilizzando WooCommerce per informazioni più dettagliate.
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;
}

Ho creato un semplice plugin gratuito, chiamato Flat Meta Data, che appiattisce i metadati di post e utenti in un CSV che può essere utilizzato più facilmente per report e analisi. Nel processo crea tabelle nel tuo database ([:prefix]postmeta_flat
e [:prefix]usermeta_flat
) che contengono le stesse informazioni e possono essere utilizzate in query più complesse. Queste tabelle hanno una riga per ogni post o utente e una colonna per ogni dato (meta_key) contenente i valori meta (meta_value).
Dopo aver installato e attivato il plugin (in wp-content/plugins/flat-table), è accessibile tramite un link nel menu principale del pannello di amministrazione, chiamato Flat Meta Data. Puoi quindi cliccare su uno dei pulsanti "Scarica metadati dei post" o "Scarica metadati degli utenti" per generare la tabella e scaricare il CSV contenente tutti i dati in formato foglio di calcolo.
Alcune note:
- Questo plugin è fornito gratuitamente. Utilizzalo a tuo rischio.
- Sono necessari i privilegi CREATE TABLE. Questo non dovrebbe essere un problema, ma potrebbe esserlo se hai limitato l'accesso all'utente del database di WordPress.
- La generazione e il download di un set completo di metadati può influire negativamente sulle prestazioni del sistema. Si prega di farlo solo durante le ore non lavorative o, ancora meglio, su un ambiente di test popolato con i tuoi dati live.
Fammi sapere se hai domande. Grazie.

Ciao e benvenuto! Puoi aggiornare la tua risposta per spiegare come lo fa? Le risposte devono essere autonome, non possono fare affidamento interamente su link esterni.

Grazie per le indicazioni, Tom. Spero che le mie modifiche siano sufficienti. Fammi sapere se hai bisogno di chiarimenti.

Ah ma questo è solo come usare il plugin però :( Devi rispondere alla domanda, e un plugin non lo fa, puoi inserire link esterni come approfondimenti o esempi ma la risposta deve contenere la soluzione nel testo. Linkare un plugin è solo una raccomandazione, non una risposta. Leggendo questo ancora non ho idea di come il tuo plugin risolva il problema, non ci sono dettagli tecnici, il che è un peccato perché è un ottimo esempio per dimostrare competenze tecniche e rispondere praticamente alla domanda

$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);
Questo restituirà i dati nel seguente formato
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
)
);
