WP_User_Query和非唯一的用户元数据


8

我们编写并维护的WP插件存在问题- 导出用户数据

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

在插件中,我们导出用户选择的usermeta数据-使用get_users(),而后者又使用WP_User_Query:

我们将一些简单的参数传递给get_users:

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

如果我们检查返回的WP_User对象,则不返回usermeta字段-例如(减少对象数据以节省空间):

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

        [ID] => 1267
        ...
    )

[1]...

我们试图将“ fields”参数的get_users参数从“ all”更改为“ all_with_meta”,但是这似乎并没有改变原始返回的数据。

在导出这些用户元数据行的那一点上,我们首先循环遍历WP_User对象的数组,然后回显单个usermeta字段数据($ field来自$ fields数组,该数组在$ users循环之外循环):

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

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

}

即使未在最初返回的对象数据中显示该字段数据,也已将其神奇地添加到$ user对象中-但是,我们无法控制它是否为每个usermeta字段返回单个值或值数组。

由于数据是自动返回的,因此我们无法控制所选的方法,如果我们直接使用get_user_meta,我们将能够做到这一点(但仍然存在不知道存储的数据是否唯一,而无需运行额外操作的问题)查询-这对于大型出口而言将是昂贵的)。

我正在全力以赴试图向他人解释这个问题,同时也帮助我们寻找答案并解决这个问题。

更新资料

我们已经使用一种方法将测试修补程序推送到github,以检查非唯一的usermeta密钥,并在存在多个匹配密钥的情况下返回一个数组

Answers:


3

最后,我们使用的解决方案使用对get_user_meta的单个调用,仅传递$ user_id-这样,所有用户数据都在单个查询中返回,从而减少了在导出大量用户数据时数据库上的沉重负担。

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

  • is_serialized($ value)-检查数据是否以序列化形式返回(我们然后尝试对其进行反序列化-在某些情况下,如果数据以不正确的形式存储,则失败)。
  • is_array($ value)-检查返回的数据是否实际上是一个数组

如果发现数据是在数组中返回的,则将递归内爆该数组,直到我们有数据字符串返回到导出文件为止。

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

导出运行正常且不会中断-我们下周将发布更新的插件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.