Abbiamo un problema con un plugin WP che abbiamo scritto e gestito: Esporta dati utente
Un utente ha segnalato un problema per cui i record di metadati dell'utente non univoci non vengono restituiti correttamente - qui
Nel plug-in, esportiamo i dati usermeta selezionati dall'utente - usando get_users () che a sua volta utilizza WP_User_Query:
Passiamo alcuni semplici argomenti a get_users:
// build argument array ##
$args = array(
'fields' => 'all',
'role' => sanitize_text_field( $_POST['role'] )
);
Se ispezioniamo un oggetto WP_User restituito, i campi usermeta non vengono restituiti, ad esempio (dati oggetto ridotti per risparmiare spazio):
Array
(
[0] => WP_User Object
(
[data] => stdClass Object
(
[ID] => 1267
[user_login] => user@email.com
...
)
[ID] => 1267
...
)
[1]...
Abbiamo provato a cambiare gli argomenti get_users per il parametro "fields" da "all" a "all_with_meta", tuttavia questo non sembra modificare i dati restituiti originariamente.
Nel momento in cui esportiamo queste righe di metadati dell'utente, prima eseguiamo il ciclo su quell'array di oggetti WP_User e quindi riecheggiamo i singoli dati del campo usermeta ($ field proviene da un array di $ field che scorre al di fuori del loop $ users):
// build row values for each user ##
foreach ( $users as $user ) {
// grab value from $user object ##
$value = $user->{$field};
}
I dati del campo vengono aggiunti magicamente all'oggetto $ user, anche se questo non è mostrato nei dati dell'oggetto restituiti originariamente - tuttavia, non abbiamo alcun controllo su se restituisce un singolo o array di valori per ciascun campo usermeta.
Poiché i dati vengono restituiti automaticamente, non controlliamo il metodo selezionato, cosa che saremmo in grado di fare se usassimo direttamente get_user_meta (ma avremmo ancora il problema di non sapere che i dati memorizzati sono unici o no, senza eseguire extra query - che sarebbero costose su grandi esportazioni).
Sto scrivendo tutto questo per cercare di spiegare agli altri il problema, ma anche per aiutarci a cercare risposte e risolvere il problema.
Aggiornare
Abbiamo inviato una correzione di prova a github utilizzando un metodo per verificare la presenza di chiavi usermeta non univoche e restituire un array nel caso in cui vi siano più chiavi corrispondenti