基于另一个元字段更新多个用户元字段

时间:2017-03-23 作者:A Sinclair

我有一个名为“user\\u status”的用户元字段和另一个名为“user\\u profile\\u id”的用户元字段。用户配置文件ID是手动管理的唯一字段。这是一个4位数的数字。如果用户联机或未联机,则user\\u status字段仅为1或0。

我有一个XML提要,其中包含user\\u profile\\u id及其状态(1或0)的列表。我可以将XML放入数组并循环显示每个user\\u profile\\u id及其关联状态。

然而,我无法了解如何更新数据库中每个用户的状态。我有一个数组,看起来像这样:

//online $users_online
Array
(
    [0] => 1122
    [1] => 3678
    [2] => 8872
)

//offline $users_offline
Array
(
    [0] => 3342
    [1] => 5784
)
我只想调用WPDB类来执行"update users set user_status = 1 where user_profile_id IN ($online_array)" 某种声明。

我已经查看了meta\\u查询,但这似乎不是我想要的。

最简单的方法是在循环XML提要结果时,获取该用户\\u profile\\u id并为该用户运行单独的更新。。。然后转到下一个。然而,这是每20秒左右调用一次,如果我们有数百个用户,这对数据库来说是一个相当大的压力!

有人对处理这个问题的最佳方法有什么想法吗?我不知所措!!

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

您对每隔20秒左右更新每个相关用户行的担忧是完全正确的。因此,一种解决方案是将此数据存储在一行中,而不是使用元数据API或自定义SQL将数据与每个用户关联。这个Options API 以及Transients API 都非常适合这项任务。

使用Transients API还提供了一些额外的好处—在使用过期时间时,您可以轻松限制更新(即,即使您每分钟解析XML 3次,也可以每分钟更新一次联机状态),而且—也许更重要的是—如果您在站点上使用缓存插件,该插件可能支持在请求之间将临时数据保存在内存中,进一步减少数据库交互。

由于4位配置文件ID用作与单个WordPress用户相关的标识信息,并且不太可能频繁更改,因此最好还是将配置文件ID存储为用户元数据。假定联机/脱机状态为二进制状态(用户必须是其中一个或另一个),您可以通过只存储一个阵列来获取-即,如果用户在阵列中,则他们处于联机状态。如果没有,则处于脱机状态。

在瞬态中存储哪些数据在某种程度上取决于您的应用程序。存储WordPress用户ID似乎有点不合理,因为这意味着每次更新列表时,您都要运行一个用户查询来确定哪些WordPress ID构成“在线列表”。相反,简单地存储具有联机状态的用户配置文件ID数组可能会更有效-当您需要显示用户的联机状态时,使用元数据API获取他们的配置文件ID,然后简单地检查该配置文件ID是否在您的“profiles online”瞬态中。如果您需要具有联机状态的WordPress用户列表,请使用元查询运行用户查询,以查找瞬态中包含配置文件ID的用户。

最后,请注意,不要每次解析XML时都更新瞬态数据。相反,从XML数据创建在线概要文件数组,然后使用两个调用array_diff() 将XML生成的数组中的元素与瞬态数据中的元素进行比较。如果任一结果数组的长度大于0, “在线列表”已更改,您应该更新瞬态。这将节省更多潜在的数据库交互。

相关推荐

使WordPress在USERS屏幕上显示wp_USERS表时,将默认用户元与另一个表中的列联接

我正在创建一个插件,将自定义的可排序列(声誉分数)添加到admin page>users中显示的users表中,问题是该列的数据应该从MySQL表wp\\U user\\U Reputation中提取(userid,user_reputation_score) [为我们自己的目的而创建]。我的评估是,我需要在查询中显示该列,以便为其添加排序功能。如何使make WordPress以wp\\u user\\u信誉加入wp\\u users表。我感谢你的帮助。