在WooCommerce中添加商品前清空购物车

12

我正在使用WP Job Manager与Woo Subscriptions。

现在:

  1. 首先,我选择了一个套餐(Woo Subscription)
  2. 然后我添加了所有的细节。
  3. 但是没有提交它。
  4. 回到网站,所以要再次购买,我需要选择一个套餐。 所以我选择了套餐并填写了详细信息,然后去支付包。
  5. 现在在我的购物车中同时存在两个包(即我第一次选择但没有购买的和最近选择的)
  6. 如何修复此问题,使最新选择的产品出现在购物车中,并且在选择最新产品时立即删除早期的产品?

我尝试过这个WooCommerce 删除购物车中的所有产品并将当前产品添加到购物车中,但没有帮助。

2个回答

32

更新(提供2种不同的替代方案)

你应该尝试以下内容:

add_filter( 'woocommerce_add_to_cart_validation', 'remove_cart_item_before_add_to_cart', 20, 3 );
function remove_cart_item_before_add_to_cart( $passed, $product_id, $quantity ) {
    if( ! WC()->cart->is_empty() )
        WC()->cart->empty_cart();
    return $passed;
}

将代码放入您当前使用的子主题(或主题)的functions.php文件中已测试并能够适用于ajax-add-to-cart和normal add-to-cart…


或者您可以使用这个不同的代码,它会将最后添加的商品保留在购物车中:

// Keep only last cart item
add_action( 'woocommerce_before_calculate_totals', 'keep_only_last_cart_item', 30, 1 );
function keep_only_last_cart_item( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    $cart_items = $cart->get_cart();

    if( count( $cart_items ) > 1 ){
        $cart_item_keys = array_keys( $cart_items );
        $cart->remove_cart_item( reset($cart_item_keys) );
    }
}

将代码放入您活动的子主题(或主题)的function.php文件中。已测试并有效


感谢您的快速回复,伙计。我在functions.php中添加了这个过滤器,但它没有起作用。该包使用“Ajax”进行选择,我不确定是否会导致问题。
  • 选择套餐->添加发布->结账页面是流程。
- Ram
@Ram 这段代码已经测试过,可以完美地与添加到购物车的ajax和普通添加到购物车一起使用。我使用的钩子位于普通的WC_Cart add_to_cart()方法和WC_Ajax add_to_cart()方法中...任何人都无法复制您的问题、设置、安装和插件... - LoicTheAztec
@Ram 我已经添加了另一个不同的钩子函数,可能适用于你的情况... 请尝试一下并告诉我是否有效... 谢谢。 - LoicTheAztec
我不确定第一个为什么不起作用。但是你分享的第二个筛选器非常好用。谢谢LoicTheAztec。 - Ram
@LoicTheAztec,我已经给答案点赞了,再次感谢。 - Ram

-1

进入您的网站数据库,并查找表“wp_woocommerce_sessions”,查看其“session_id”列是否包含0值,如果是

  1. 删除所有这些0条目记录
  2. 将“session_id”列设置为主键。
  3. 将“session_id”列设置为自动递增。

不好的想法。清空购物车时,您并不总是希望丢失所有会话变量。 - Maxime
它不是用于删除会话值,只是用于删除有问题的记录并纠正数据库结构。 - Waiseman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接