Woocommerce:在我的网站下订单后强制清除购物车?

JPa*_*shs 6 php woocommerce

我的 Woocommerce 网站经常出现一个问题,即在我的网站下订单后购物车未清除。

我想在 my_theme/functions.php 中添加代码以确保购物车已清除。我设法创建了这段代码(如下)。

这足以满足我的需要吗?

add_action('woocommerce_new_order','clear_the_cart');

    function clear_the_cart() 
    {
        global $woocommerce;
        $woocommerce->cart->empty_cart();
    }
Run Code Online (Sandbox Code Playgroud)

我是否需要添加代码来获取用户 ID,然后清除该用户的购物车?

如果为每个用户而不是为所有用户清除购物车,那么我想我将需要获取当前用户 ID,然后执行代码行以清除该用户的购物车。

我的问题是我应该按用户还是全局清理购物车?

我知道如何获取用户 ID:

$user_ID = get_current_user_id();
....
Run Code Online (Sandbox Code Playgroud)

Mtx*_*txz 4

添加到 function.php 后,您的方法应该按预期工作。

您也可以使用 来调用它WC()->cart->empty_cart();。有empty_cart()一个$clear_persistent_cart参数,但默认为 true,因此您的代码没问题。

如果没有任何奇怪的东西挂在钩子上,您可以检查您的主题和插件woocommerce_before_cart_emptied,该钩子是在方法开始时触发的empty_cart()

只会empty_cart()清空当前用户的购物车(传递订单的购物车),如果此代码不是由其他服务器(例如:队列)或 PHP 进程执行:客户的会话数据将可用,因此可以清空购物车。这不会清除每个客户购物车内容(要恢复,empty_cart()必须从客户请求(无论是否使用ajax)调用,并将清除此客户购物车。)

相反,从您的支付提供商到您的 Woocommerce 网关或 CRON 的 Webhook 或 admin-ajax 请求将不会清除任何购物车(您没有会话数据)。如果这是你的情况,你将需要类似的东西:将客户 ID 保存在数据库中的某个位置,然后init使用检查“如果用户 ID 在数据库数组中,则从数据库数组中删除”的方法挂钩某处(例如 )clear_cart()

现在,Woocommerce 应默认在订单完成后清除购物车。以下是一些需要尝试和测试的事情:

  • 更改你的 add_action add_action( 'woocommerce_new_order', 'clear_the_cart', 50, 3 );,增加最后运行的 $priority
  • 您可以使用woocommerce_order_status_completed钩子进行测试是否符合您的要求
  • 每个顾客都会遇到这种情况吗?您直接在本地、开发还是生产环境中工作?如果是这样,您可以尝试在您的方法中添加wp_die()或 相关的,clear_the_cart()以验证此代码在您的订单后触发
  • 您使用自定义 woocommerce 支付网关吗?请添加 WP 版本、Woocommerce 版本、支付网关等详细信息。

请注意,某些插件(以及挂钩上的一些自定义代码)可以防止订单完成后清空购物车(请参阅