WP_User_Query e dati usermeta non univoci


8

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

Risposte:


3

La soluzione che abbiamo seguito alla fine utilizza una singola chiamata a get_user_meta passando solo $ user_id - in questo modo tutti i dati dell'utente vengono restituiti in una singola query, riducendo un carico pesante sul DB durante grandi esportazioni di dati utente.

Eseguiamo quindi una serie di controlli sui dati restituiti, tra cui:

  • is_serialized ($ value) - per verificare se i dati sono stati restituiti in un formato serializzato (tentiamo quindi di annullare la serializzazione - in alcuni casi ciò non riesce se i dati sono stati memorizzati in un formato errato).
  • is_array ($ value) - per verificare se i dati restituiti sono in effetti un array

Se rileviamo che i dati vengono restituiti in un array impiantiamo ricorsivamente l'array fino a quando non abbiamo una stringa di dati da restituire al file di esportazione.

Non ho incluso un codice specifico in questa risposta, ma piuttosto collegato ai file github ospitati (so che questo non è l'ideale per il futuro, ma le parti relative a questa risposta sono sparse nel codice).

Le esportazioni si svolgono in modo pulito e non si bloccano: rilasceremo il plugin aggiornato la prossima settimana.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.