我的 Woocommerce 网站经常出现一个问题,即在我的网站下订单后购物车没有被清除。
我想在 my_theme/functions.php 中添加一个代码以确保购物车被清除。我设法创建了此代码(如下)。
这足以得到我需要的东西吗?
add_action('woocommerce_new_order','clear_the_cart');
function clear_the_cart()
{
global $woocommerce;
$woocommerce->cart->empty_cart();
}
我是否需要添加代码来获取用户 ID,然后清除该用户的购物车?
如果为每个用户而不是所有用户清除购物车,我想我将需要获取当前用户 ID,然后在执行代码行后为该用户清除购物车。
我的问题是我应该按用户还是全局清理购物车?
我知道如何获取用户 ID:
$user_ID = get_current_user_id();
....
答案 0 :(得分:2)
添加到 function.php 后,您的方法应该可以正常工作。
您也可以使用 WC()->cart->empty_cart();
调用它。
empty_cart()
有一个 $clear_persistent_cart
参数,但默认为 true,因此您的代码没问题。
如果在 woocommerce_before_cart_emptied
方法开始时触发的 empty_cart()
钩子上没有任何奇怪的钩子,您可以检查您的主题和插件。
empty_cart()
只会清空当前用户购物车(传递订单的购物车),如果此代码没有被其他服务器(例如:队列)或 PHP 进程执行:客户的会话数据将可用,因此可以清空购物车。这不会清除每个客户购物车的内容(要恢复,必须从客户请求(无论是否使用 ajax)调用 empty_cart()
,并将清除此客户购物车。)
相反,您的支付提供商向您的 Woocommerce 网关或 CRON 发出的 webhook 或 admin-ajax 请求不会清除任何购物车(您没有会话数据)。如果这是您的情况,您将需要类似的东西:将客户 ID 保存在 DB 中的某个位置,然后使用检查“如果用户 ID 在 DB 数组中,init
,然后从数据库数组中删除”。
现在,Woocommerce 默认应在订单完成后清空购物车。以下是一些可以尝试和测试的内容:
clear_cart()
,增加最后运行的 $priorityadd_action( 'woocommerce_new_order', 'clear_the_cart', 50, 3 );
钩子进行测试woocommerce_order_status_completed
方法中添加一个 wp_die()
或相关的,以验证此代码是在您的订单后触发的请注意,某些插件(以及挂钩上的一些自定义代码)可以防止购物车在订单完成后清空 (see)