有没有一种聪明的方法可以只获得一些选定的用户元数据的列表?

时间:2019-04-10 作者:TTT

我有一个例子,如果我自己编写DB和查询,我只会执行以下操作SELECT name, firstname, email FROM users WHERE .... 返回给我一个列表/集合/数组,我的意思是,不一定是单个用户。

但我了解到,要在WordPress中获取name和firstname,首先需要获取一些用户的ID,然后使用类似的方法$targetUsers = get_users([\'include\' => wp_list_pluck($targetUsersIDs,\'ID\')]);

这意味着我得到了一个完整的用户对象集合,这可能是大量的数据。

目前,我想到的最好办法是运行以下查询:

SELECT u.ID, u.user_email, um.meta_key, um.meta_value FROM wp_users u JOIN wp_usermeta um ON u.ID = um.user_id
WHERE um.meta_key = \'last_name\' OR um.meta_key = \'first_name\'
GROUP BY u.ID, u.user_email, um.meta_key, um.meta_key
ORDER BY u.ID
然后循环构建我自己的对象。

或者可能与某些嵌套查询有关。。。

请注意,问题不是从用户表中选择特定字段,而是从用户元表中选择!

1 个回复
SO网友:leymannx

我想你应该坚持WP_User_Query. 在那里,您可以简单地指定要用于选择特定用户的字段。还有元字段。

WP_User_Query 是一个类,在中定义wp-includes/user.php, 允许查询WordPress数据库表wp_userswp_usermeta.

但是是的(!),这不会返回用户元值。即使在设置时\'fields\' => \'all_with_meta\'.

all_with_meta 当前返回的字段与all 其中不包括存储在中的用户字段wp_usermeta. 您必须创建第二个查询以按ID获取用户元字段,或者使用__get PHP magic方法来获取这些字段的值。

也就是说,我的结论是meta_query 在a中WP_User_Query 通过某些元数据选择用户,并使用该结果通过调用来检索其他元数据,例如get_user_meta($user->ID, \'meta_key\', TRUE).

$user_query = new WP_User_Query([
  \'role\'       => \'editor\', 
  \'meta_query\' => [
    [
      \'key\'     => \'meta_key\',
      \'compare\' => \'EXISTS\', // Use \'NOT EXISTS\' for non-existance of this key.
    ],
  ],
]);

$editors = $user_query->get_results();

foreach ($editors as $editor) {
  $first_name = $editor->display_name;
  $meta_value = get_user_meta($editor->ID, \'meta_key\', TRUE);
  // ...
}
在我看来,这比自定义数据库查询的可读性和可维护性高出一百倍。

关于性能,请查看同一主题的相关答案,仅用于发布元数据:Can WP_Query return post meta in a single request? 将您链接到:Custom post meta field effect on the performance on the post.

相关推荐

Reducing Database Query Time

在这里寻找一些建议。有一位客户已经在WooCommerce上工作了大约一年半。我们为他们建了一个新网站。他们开始增加一条新的家具生产线。每个项目有700-800个产品变体组合。由于从生产线中添加了大约8个新产品,当您在管理中查看产品列表时,加载需要花费很长时间。如果您快速编辑一个产品,并说将其添加到第二个类别,然后单击“更新”,则完成查询平均需要10.2-10.8秒(根据查询监视器)。意识到有700-800个变体需要迭代,如果可以理解的话,可能需要更长的时间。我已经恢复到2017主题,禁用了除woocom