在 Woocommerce 购物车中自动添加或删除免费产品 [英] Add or remove automatically a free product in Woocommerce cart

查看:77
本文介绍了在 Woocommerce 购物车中自动添加或删除免费产品的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建代码,一旦客户达到购物车中的特定价格点,该代码就会自动将商品添加到客户的购物车中.如果他们只订购虚拟产品,作为免费礼物",我试图将这种情况排除在外.仅适用于正在发货的产品.我使用的代码是以正确的美元金额添加免费礼物,但不排除任何虚拟产品.任何人都可以识别我做错了什么吗?

I'm trying to create code that automatically adds an item to the customer's cart once they reach a particular price point in the cart. AND I'm trying to exclude that from happening if they are only ordering virtual products, as the "free gift" is only meant for products that are being shipped out. The code I'm using is adding the free gift at the right dollar amount, but it's not excluding any virtual product. Can anyone id what I'm doing wrong?

代码如下:

/**
 * Add another product depending on the cart total
 */

add_action( 'template_redirect', 'add_product_to_cart' );
function add_product_to_cart() {
  if ( ! is_admin() ) {
        global $woocommerce;
        $product_id = 85942; //replace with your product id
        $found = false;
        $cart_total = 15; //replace with your cart total needed to add above item

        if( $woocommerce->cart->total >= $cart_total ) {
            //check if product already in cart
            if ( sizeof( $woocommerce->cart->get_cart() ) > 0 ) {

                $isVirtualOnly = false;
                foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values) {
                    $_product = $values[‘data’];
                    if ($_product != null)
                        if ($_product->get_type() != $_virtual)
                                $isVirtualOnly = false;
                }

                if ($isVirtualOnly != true) {
                    foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values ) {
                        $_product = $values['data'];
                        if ( $_product->get_id() == $product_id )
                            $found = true;
                    }
                    // if product not found, add it
                    if ( ! $found )
                        $woocommerce->cart->add_to_cart( $product_id );
                }
            } else {
                    // if no products in cart, add it
                    $woocommerce->cart->add_to_cart( $product_id );
            }
        }
    }
}

/**
 * END Add another product depending on the cart total
 */

推荐答案

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

Updated: The following will auto add to cart a free product:

  • 如果购物车中至少有一件可发货的商品,
  • 如果免费产品还没有在购物车中,
  • 如果购物车小计未低于特定金额.

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

Or will remove the fee product from cart:

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

代码:

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;
}

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

Code goes in functions.php file of the active child theme (or active theme). Tested and works.

相关:

这篇关于在 Woocommerce 购物车中自动添加或删除免费产品的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆