WooCommerce 自定义代码将项目添加到购物车后立即删除

问题描述

我正在尝试设置自定义优惠券代码,以便客户可以将附加产品添加到他们的购物车中,前提是他们的购物车总额为 50 美元或更多。

我正在使用 Allow add to cart for specific products based on cart total in WooCommerce 答案代码,根据他们的购物车总数允许或拒绝添加产品,这很好用。

我的问题是我还有一段代码,如果它在购物车中并且购物车总数不再在阈值内,我应该删除它。

就我而言,我将门槛设置为 50 美元,而附加产品的价格为 10 美元。

在测试中,我发现当购物车总额为 60 美元或更多时,一切正常。我什至可以从购物车中移除几件物品,附加物品会一直保留,直到总数低于阈值,然后它也会被移除。

但是,如果在我添加插件时购物车的总金额在 50 美元到 60 美元之间,则该插件添加后会立即被删除

我希望操作顺序能够

  1. 检查购物车总额,发现它超过 50 美元
  2. 允许我添加插件
  3. 检查包含附加项目的购物车总数,发现它现在超过 60 美元
  4. 允许插件保留

基于 Add or remove specific cart Item based on WooCommerce cart total 答案代码,这是我正在使用的代码

add_action( 'woocommerce_before_calculate_totals','add_or_remove_cart_items',10,1 );
function add_or_remove_cart_items( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // ONLY for logged users (and avoiding the hook repetition) 
    if ( ! is_user_logged_in() && did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    $threshold_amount = 50; // The threshold amount for cart total
    $addon_product_id  = 7039; // ID of the addon item
    $addon_product_cost = 10; // Cost of addon item
    $cart_items_total = 0; // Initializing
    $threshold_amount_with_addon = $threshold_amount + $addon_product_cost;

    // Loop through cart items
    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ){
        // Check if the free product is in cart
        if ( $cart_item['data']->get_id() == $addon_product_id ) {
            $addon_item_key = $cart_item_key;
        }
        // Get cart subtotal incl. tax from items (with discounts if any)
        $cart_items_total += $cart_item['line_total'] + $cart_item['line_tax'];
    }

    // If cart total is below the defined amount and addon product is in cart,we remove it.
    if ( $cart_items_total < $threshold_amount_with_addon && isset($addon_item_key) ) {
        $cart->remove_cart_item( $addon_item_key );
        return;
    }
}

我终其一生都无法弄清楚出了什么问题。任何帮助将不胜感激。

解决方法

下面,我们从小计计算中排除了附加商品,因此我们不需要将附加商品价格添加到阈值金额(因此我们保留您的步骤 1、2 和 4)。

重新访问的代码:

add_action( 'woocommerce_before_calculate_totals','add_or_remove_cart_items',10,1 );
function add_or_remove_cart_items( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // ONLY for logged users,avoiding the hook repetition
    if ( ! is_user_logged_in() || did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    $addon_product_id = 7039; // ID of the addon item
    $threshold_amount = 50; // The threshold amount
    $cart_items_total = 0; // Initializing

    // Loop through cart items
    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ){
        // For Add-On product: Check if it is in cart
        if ( in_array( $addon_product_id,[$cart_item['product_id'],$cart_item['variation_id']] ) ) {
            $addon_item_key = $cart_item_key;
        }
        // For other items: add their line total including taxes to items subtotal
        else {
            // Sum dicounted line total incl. taxes to get other items subtotal
            $cart_items_total += $cart_item['line_total'] + $cart_item['line_tax'];
        }
    }

    // If cart total is below the defined amount and addon product is in cart,we remove it.
    if ( $cart_items_total < $threshold_amount && isset($addon_item_key) ) {
        $cart->remove_cart_item( $addon_item_key );
    }
}

代码位于活动子主题(或活动主题)的functions.php 文件中。经测试有效。