有没有一种方法可以在不创建争用条件的情况下附加元数据?

时间:2019-04-24 作者:Pikamander2

我们的网站有一个冗长的AJAX功能,可以将内容附加到用户的购物车中,购物车以数组的形式存储在usermeta 桌子

函数如下所示:

$cart = get_user_meta($userID, \'cart\', true);
$cart[] = $newItemID;
update_user_meta($userID, \'cart\', $cart);
我们遇到了一个问题,当用户尝试快速连续地将多个项目添加到购物车时,更新\\u user\\u meta的最终调用有时会用旧数据覆盖购物车。

据我所知,这是一种竞争条件,部分原因是WordPress将数组数据存储为序列化字符串,而不是一组表行。

我知道我可以创造一个cart 表并使用查询来管理它,但我希望有一种方法可以通过现有的get\\u user\\u meta/update\\u user\\u meta函数来实现。

1 个回复
SO网友:KAGG Design

这是由于ajax调用的性质造成的,它们是异步的。当您有一个很长的函数(或大量插件和缓慢的站点加载)时,几个ajax调用会同时运行,没有人能够预测哪一个会更快地访问db数据。

在这种情况下,使用自己的表不是解决方案。

解决此问题的最简单方法是阻止Javascript进一步添加产品,直到当前ajax完成。

因此,js中的操作顺序应该是:

单击“添加到购物车”按钮,设置阻止其他单击的标志

运行ajax

  • 英寸。完成功能删除标志,以便允许进一步添加到购物车单击

  • 相关推荐

    是否从未创建Debug.log文件?

    这是我第一次看到这个。在我正在进行的一个项目中,我尝试打开wordpress的调试模式以查看日志。即使我激活了debug\\u登录wp-config.php, debug.log 从未在中创建文件/htdocs/wp-content/wp-config.phpdefine(\'WP_DEBUG\', true); define(\'WP_DEBUG_LOG\', true); define(\'WP_DEBUG_DISPLAY\', false); @ini_set(\'