WP_User_Query y datos de usuario no únicos

8

Tenemos un problema con un complemento WP que escribimos y mantenemos - Exportar datos de usuario

Un usuario ha informado de un problema de que los registros de metadatos de usuario no únicos no se devuelven correctamente, aquí

En el complemento, exportamos los datos de usuario seleccionados por el usuario, usando get_users () que a su vez usa WP_User_Query:

Pasamos algunos argumentos simples a get_users:

// build argument array ##
$args = array(
      'fields'    => 'all',
      'role'      => sanitize_text_field( $_POST['role'] )
);

Si inspeccionamos un objeto WP_User devuelto, los campos usermeta no se devuelven, por ejemplo (datos del objeto reducidos para ahorrar espacio):

Array
(
[0] => WP_User Object
    (
        [data] => stdClass Object
            (
                [ID] => 1267
                [user_login] => user@email.com
                ...
            )

        [ID] => 1267
        ...
    )

[1]...

Hemos tratado de cambiar los argumentos de get_users para el parámetro "fields" de "all" a "all_with_meta", sin embargo, esto no parece cambiar los datos devueltos originalmente.

En el punto en el que exportamos estas filas de metadatos de usuario, primero hacemos un bucle sobre esa matriz de objetos WP_User y luego hacemos eco de los datos individuales del campo usermeta ($ field proviene de una matriz de $ fields que se repite fuera del bucle $ users):

// build row values for each user ##
foreach ( $users as $user ) {

    // grab value from $user object ##
    $value = $user->{$field};

}

Los datos del campo se están agregando mágicamente al objeto $ user, aunque esto no se muestra en los datos del objeto devuelto originalmente; sin embargo, no tenemos control sobre si devuelve un único o conjunto de valores para cada campo usermeta.

Como los datos se devuelven automáticamente, no estamos controlando el método seleccionado, lo que podríamos hacer si usáramos get_user_meta directamente (pero aún tendríamos el problema de no saber que los datos almacenados son únicos o no, sin ejecutar extra consultas, lo que sería costoso en grandes exportaciones).

Escribo todo esto para tratar de explicar el problema a otros, y también para ayudarnos a buscar respuestas y resolver este problema.

Actualizar

Hemos introducido una solución de prueba en github utilizando un método para verificar si hay claves de usuario no únicas y devolver una matriz en caso de que haya más de una clave coincidente

Q Studio
fuente

Respuestas:

3

La solución con la que hemos ido al final utiliza una sola llamada para que get_user_meta pase solo $ user_id; de esta manera, todos los datos del usuario se devuelven en una sola consulta, lo que reduce una gran carga en la base de datos durante las grandes exportaciones de datos de usuario.

Luego ejecutamos una serie de comprobaciones con los datos devueltos, que incluyen:

  • is_serialized ($ value): para verificar si los datos se han devuelto en forma serializada (luego intentamos deserializarlos; en algunos casos esto falla cuando los datos se han almacenado en una forma incorrecta).
  • is_array ($ value): para verificar si los datos devueltos son de hecho una matriz

Si descubrimos que los datos se devuelven en una matriz, implosionamos recursivamente la matriz hasta que tengamos una cadena de datos para volver al archivo de exportación.

No he incluido un código específico en esta respuesta, sino que estoy vinculado a los archivos github alojados (sé que esto no es ideal para el futuro, pero las partes que se relacionan con esta respuesta se extienden en el código).

Las exportaciones se ejecutan limpiamente y no se ahogan: lanzaremos el complemento actualizado la próxima semana.

Q Studio
fuente