WP_USER_QUERY和非唯一用户元数据

时间:2014-10-31 作者:Q Studio

我们编写并维护的WP插件存在问题-Export User Data

用户报告了一个问题,即未正确返回非唯一用户元数据记录-here

在该插件中,我们使用get\\u users()导出用户选择的用户元数据,而get\\u users()反过来使用WP\\u user\\u查询:

我们传递几个简单的参数来获取\\u用户:

// build argument array ##
$args = array(
      \'fields\'    => \'all\',
      \'role\'      => sanitize_text_field( $_POST[\'role\'] )
);
如果我们检查返回的WP\\U用户对象,则不会返回usermeta字段-例如(对象数据减少以节省空间):

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

        [ID] => 1267
        ...
    )

[1]...
我们已尝试将“fields”参数的get\\u users参数从“all”更改为“all\\u with\\u meta”,但这似乎并没有更改最初返回的数据。

在导出这些用户元数据行时,我们首先循环该WP\\u用户对象数组,然后回显单个usermeta字段数据(字段来自在$users循环外循环的$字段数组):

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

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

}
现场数据正在magically 添加到$user对象中,尽管这没有显示在最初返回的对象数据中,但我们无法控制它是否为每个usermeta字段返回单个值或值数组。

由于数据是自动返回的,因此我们不控制所选的方法,如果使用get_user_meta 直接(但我们仍然存在一个问题,即不知道存储的数据是否唯一,而不运行额外的查询,这对于大型导出来说代价高昂)。

我写这篇文章是为了尝试向其他人解释这个问题,同时也帮助我们寻找答案并解决这个问题。

Update

我们已将测试修复推到github 使用一种方法检查非唯一的usermeta键,并在存在多个匹配键的情况下返回一个数组

1 个回复
最合适的回答,由SO网友:Q Studio 整理而成

我们最终采用的解决方案使用一个调用get_user_meta 只传递$user\\u id-这样,所有用户数据都将在一个查询中返回,从而减少了大型用户数据导出期间数据库的沉重负载。

然后,我们对返回的数据运行一系列检查,包括:

  • is_serialized($value)-检查数据是否以序列化形式返回(然后尝试取消序列化-在某些情况下,如果数据以错误形式存储,则会失败)
  • is_array($值)-检查返回的数据是否实际上是一个数组recursively implode 数组,直到我们有一个数据字符串返回到导出文件。

    我没有在这个答案中包含特定的代码,而是链接到托管的github文件(我知道这对未来来说并不理想,但与这个答案相关的部分在代码中分布)。

    导出运行干净,不会阻塞-下周我们将发布更新的插件。

结束

相关推荐

修改具有多个分类的users.php查询

我已经使用此代码的registered\\u taxonomy和update\\u count函数成功创建了3个附加到user对象的分类法-https://gist.github.com/portfola/10750784#file-user-taxonomies-php (其余的我不需要,因为它们只与显示管理UI或分类归档的分类相关,而我不需要)。这些分类法存储每个用户分配给哪个公司、办公室和团队。我知道自定义分类法正在存储数据,因为我通过wp_get_object_terms($user->ID