cum să obții lista tuturor utilizatorilor și metadatele acestora
Cum pot obține o listă a tuturor utilizatorilor cu rolul = 'Customers' inclusiv toate metadatele per utilizator, adică wp_users + wp_usermeta.
Interogarea de mai jos nu generează rezultatele dorite.
$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);
Dar acea listă nu este corectă. Afișează fiecare utilizator de x ori în funcție de numărul de rânduri din wp_usermeta.
Cum pot filtra acest lucru? Astfel încât fiecare utilizator să afișeze într-o singură înregistrare toate datele sale de utilizator + metadata?

Cred că ar trebui să folosești funcțiile wp-api care vor face totul pentru tine.
- get_users() funcția va obține toate datele utilizatorilor, doar definește câmpurile de care ai nevoie.
- get_user_meta() funcția va obține datele meta ale utilizatorului.
$users = get_users( array( 'fields' => array( 'ID' ) ) );
foreach($users as $user){
print_r(get_user_meta ( $user->ID));
}

Dar acest lucru nu va face o interogare pentru fiecare utilizator în baza de date? Există vreo modalitate de a face acest lucru cu mai puține interogări?

Când WP preia un obiect, cum ar fi un utilizator/post/termen, el preîncarcă și metadatele asociate și le stochează în wp_cache
pentru a reduce numărul de interogări și a accelera procesul. Acele apeluri get_user_meta
nu vor genera interogări către baza de date, deoarece datele au fost deja preluate când a fost apelată funcția get_users
.

Un mod puțin mai formal de a obține aceleași rezultate este următorul. Înlocuiți orice rol după cum este necesar, iar acest cod presupune că utilizați WooCommerce pentru informații mai detaliate.
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;
}

Am creat un simplu plugin gratuit, numit Flat Meta Data, care transformă meta datele articolelor și utilizatorilor într-un fișier CSV care poate fi mai ușor utilizat pentru raportare și analiză. În acest proces, creează tabele în baza ta de date ([:prefix]postmeta_flat
și [:prefix]usermeta_flat
) care conțin aceleași informații și pot fi utilizate în interogări mai complexe. Aceste tabele au un rând pentru fiecare articol sau utilizator și o coloană pentru fiecare punct de date (meta_key) care conține valorile meta (meta_value).
După instalarea și activarea pluginului (în wp-content/plugins/flat-table), acesta este accesibil printr-un link din meniul principal al panoului de administrare, numit Flat Meta Data. Apoi poți face clic pe butonul "Descarcă meta datele articolelor" sau "Descarcă meta datele utilizatorilor" pentru a genera tabelul și a descărca fișierul CSV care conține toate datele în format de tabel.
Câteva observații:
- Acest plugin este oferit gratuit. Folosește-l pe propriul risc.
- Sunt necesare privilegii CREATE TABLE. Acest lucru nu ar trebui să fie o problemă, dar poate fi dacă ai restricționat accesul utilizatorului WordPress la baza de date.
- Generarea și descărcarea unui set complet de meta date poate afecta performanța sistemului. Te rugăm să faci acest lucru doar în afara orelor de vârf sau, mai bine, pe un mediu de testare populat cu datele tale live.
Te rog să mă anunți dacă ai întrebări. Mulțumesc.

Bună ziua și bun venit! Poți să actualizezi răspunsul tău pentru a explica cum face acest lucru? Răspunsurile trebuie să fie autonome, ele nu se pot baza în întregime pe link-uri externe.

Mulțumesc pentru îndrumare, Tom. Sper că modificările mele sunt suficiente. Te rog să-mi spui dacă ai nevoie de clarificări.

Ah, dar asta este doar cum se folosește plugin-ul :( Trebuie să răspunzi la întrebare, iar un plugin nu face asta, poți să incluzi link-uri externe ca lectură suplimentară sau ca exemple, dar răspunsul trebuie să conțină soluția în text. Link-ul către un plugin este doar o recomandare, nu un răspuns. Citind acest lucru, încă nu am nicio idee cum rezolvă plugin-ul tău problema, nu există detalii tehnice, ceea ce este păcat pentru că este un exemplu minunat de a demonstra abilități tehnice și de a răspunde practic la întrebare.

$members = get_users(
array('role' => 'company', // Obține utilizatorii cu rolul 'company'
'orderby' => 'ID', // Sortează după ID
'order' => 'ASC' // Ordine crescătoare
)
);
// Transformă fiecare utilizator adăugând metadatele sub forma simplificată
array_map( function($member ){
$member->usermeta = array_map(function($data){
return reset($data); // Extrage primul element din fiecare array de metadate
}, get_user_meta( $member->ID ) );
return $member;
}, $members);
Acest cod va returna date în următorul format
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
)
);
