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

时间:2021-07-22 12:17:28

标签: 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();
    }

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

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

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

我知道如何获取用户 ID:

$user_ID = get_current_user_id();
....

1 个答案:

答案 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 默认应在订单完成后清空购物车。以下是一些可以尝试和测试的内容:

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

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