WP_User_Query e dados não exclusivos do usuário

8

Temos um problema com um plug-in WP que escrevemos e mantemos - Exportar dados do usuário

Um usuário relatou um problema em que os registros de metadados do usuário não exclusivos não estão sendo retornados corretamente - aqui

No plug-in, exportamos os metadados do usuário selecionados pelo usuário - usando get_users () que, por sua vez, usa WP_User_Query:

Passamos alguns argumentos simples para get_users:

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

Se inspecionarmos um objeto WP_User retornado, os campos usermeta não serão retornados - por exemplo (dados do objeto reduzidos para economizar espaço):

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

        [ID] => 1267
        ...
    )

[1]...

Tentamos alterar os argumentos get_users do parâmetro "fields" de "all" para "all_with_meta", no entanto, isso não parece alterar os dados retornados originalmente.

No momento em que exportamos essas linhas de metadados do usuário, primeiro fazemos um loop sobre essa matriz de objetos WP_User e, em seguida, ecoamos os dados individuais do campo de usermeta (o campo $ vem de uma matriz de campos $ que faz um loop fora do loop $ users):

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

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

}

Os dados do campo estão sendo adicionados magicamente ao objeto $ user, mesmo que isso não seja mostrado nos dados do objeto retornados originalmente - no entanto, não temos controle sobre se ele retorna um único ou conjunto de valores para cada campo de usermeta.

Como os dados estão sendo retornados automaticamente, não estamos controlando o método selecionado, o que poderíamos usar se get_user_meta diretamente (mas ainda teríamos o problema de não saber que os dados armazenados são únicos ou não, sem executar extra consultas - que custariam grandes exportações).

Estou escrevendo tudo isso para tentar explicar aos outros o problema, além de nos ajudar a procurar respostas e resolver esse problema.

Atualizar

Enviamos uma correção de teste para o github usando um método para verificar se há chaves não exclusivas do usuário e retornar uma matriz no caso de haver mais de uma chave correspondente

Q Studio
fonte

Respostas:

3

A solução que escolhemos no final usa uma única chamada para get_user_meta passando apenas o $ user_id - dessa forma, todos os dados do usuário são retornados em uma única consulta, reduzindo uma carga pesada no banco de dados durante grandes exportações de dados do usuário.

Em seguida, executamos uma série de verificações nos dados retornados - incluindo:

  • is_serialized ($ value) - para verificar se os dados foram retornados em um formato serializado (tentamos desserializá-los - em alguns casos, isso falha quando os dados foram armazenados de forma incorreta).
  • is_array ($ value) - para verificar se os dados retornados são de fato uma matriz

Se acharmos que os dados são retornados em uma matriz, nós implodimos recursivamente a matriz até termos uma sequência de dados para retornar ao arquivo de exportação.

Não incluí código específico nesta resposta, mas vinculado aos arquivos hospedados no github (sei que isso não é ideal para o futuro, mas as partes relacionadas a essa resposta estão espalhadas no código).

As exportações são executadas de forma limpa e não são interrompidas - lançaremos o plug-in atualizado na próxima semana.

Q Studio
fonte