自动添加或删除 Woocommerce 购物车中的免费产品

Bre*_*oks 4 php wordpress product cart woocommerce

我正在尝试创建代码,一旦客户达到购物车中的特定价格点,该代码就会自动将商品添加到客户的购物车中。如果他们只订购虚拟产品,我试图排除这种情况的发生,因为“免费礼物”仅适用于正在发货的产品。我使用的代码是以正确的金额添加免费礼物,但并不排除任何虚拟产品。谁能找出我做错了什么吗?

\n

这是代码:

\n
/**\n * Add another product depending on the cart total\n */\n\nadd_action( 'template_redirect', 'add_product_to_cart' );\nfunction add_product_to_cart() {\n  if ( ! is_admin() ) {\n        global $woocommerce;\n        $product_id = 85942; //replace with your product id\n        $found = false;\n        $cart_total = 15; //replace with your cart total needed to add above item\n\n        if( $woocommerce->cart->total >= $cart_total ) {\n            //check if product already in cart\n            if ( sizeof( $woocommerce->cart->get_cart() ) > 0 ) {\n\n                $isVirtualOnly = false;\n                foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values) {\n                    $_product = $values[\xe2\x80\x98data\xe2\x80\x99];\n                    if ($_product != null)\n                        if ($_product->get_type() != $_virtual)\n                                $isVirtualOnly = false;\n                }\n\n                if ($isVirtualOnly != true) {\n                    foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values ) {\n                        $_product = $values['data'];\n                        if ( $_product->get_id() == $product_id )\n                            $found = true;\n                    }\n                    // if product not found, add it\n                    if ( ! $found )\n                        $woocommerce->cart->add_to_cart( $product_id );\n                }\n            } else {\n                    // if no products in cart, add it\n                    $woocommerce->cart->add_to_cart( $product_id );\n            }\n        }\n    }\n}\n\n/**\n * END Add another product depending on the cart total\n */\n
Run Code Online (Sandbox Code Playgroud)\n

Loi*_*tec 6

更新:以下内容将自动将免费产品添加到购物车:

  • 如果购物车中至少有一件可发货的商品,
  • 如果免费产品尚未加入购物车,
  • 如果购物车小计不低于特定金额。

或者将从购物车中删除收费产品:

  • 如果购物车小计不低于特定金额,
  • 如果只有虚拟产品。

代码:

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

    $free_product_id = 38; // <= Set the free product id to add
    $min_subtotal    = 80; // <= Set the minimum cart subtotal required

    $has_shippable   = $free_key = false; // Initializing
    $cart_subtotal   = 0;

    // Loop through cart items (first loop)
    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ){
        // Check if free product is in cart
        if ( $free_product_id == $cart_item['product_id'] ) {
            $free_key = $cart_item_key;
            $free_qty = $cart_item['quantity'];
            $cart_item['data']->set_price(0); // Optional: Set free product price to zero
        }

        // Check for non virtual products
        if ( $cart_item['data']->is_virtual() !== true ) {
            $has_shippable = true;
        }
        // Calculate items subtotal: Add discounted Line total with taxes
        $cart_subtotal += $cart_item['line_total'] + $cart_item['line_tax'];
    }

    // Add Free product
    if ( $cart_subtotal >= $min_subtotal && $has_shippable && $free_key === false ) {
        $cart->add_to_cart( $free_product_id, 1 );
    }
    // Remove free product
    elseif ( ( $cart_subtotal < $min_subtotal  ) && $free_key !== false ) {
        $cart->remove_cart_item( $free_key );
    }
    // Adjust free product quantity to 1
    elseif ( $free_key !== false && $free_qty > 1 ) {
        $cart->set_quantity( $free_key, 1 );
    }
}

// Optional: Display free product price to zero on minicart
add_filter( 'woocommerce_cart_item_price', 'change_minicart_free_gifted_item_price', 10, 3 );
function change_minicart_free_gifted_item_price( $price_html, $cart_item, $cart_item_key ) {
    $free_product_id   = 38;

    if( $cart_item['product_id'] == $free_product_id ) {
        return wc_price( 0 );
    }
    return $price_html;
}
Run Code Online (Sandbox Code Playgroud)

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

有关的: