简体   繁体   English

在 WooCommerce 中以编程方式自动将礼品产品变体添加到购物车?

[英]Auto add to cart a Gift product variation programmatically in WooCommerce?

I'm trying to create a buy one get one offer for woocommerce when someone adds a product to the cart.当有人将产品添加到购物车时,我正在尝试为woocommerce创建买一送一优惠。 The code below works but only with simple products, I've tried adding the variation ID to the variable but it does not work.下面的代码有效,但仅适用于简单的产品,我尝试将变体ID添加到变量中,但它不起作用。 Any ideas?有任何想法吗? thanks to the community感谢社区

add_action( 'template_redirect', 'bbloomer_add_gift_if_id_in_cart' );
 
function bbloomer_add_gift_if_id_in_cart() {
 
   if ( is_admin() ) return;
   if ( WC()->cart->is_empty() ) return;
 
   $product_bought_id = 421;
   $product_gifted_id = 1256;
 
   // see if product id in cart
   $product_bought_cart_id = WC()->cart->generate_cart_id( $product_bought_id );
   $product_bought_in_cart = WC()->cart->find_product_in_cart( $product_bought_cart_id );
 
   // see if gift id in cart
   $product_gifted_cart_id = WC()->cart->generate_cart_id( $product_gifted_id );
   $product_gifted_in_cart = WC()->cart->find_product_in_cart( $product_gifted_cart_id );
 
   // if not in cart remove gift, else add gift
   if ( ! $product_bought_in_cart ) {
      if ( $product_gifted_in_cart ) WC()->cart->remove_cart_item( $product_gifted_in_cart );
   } else {
      if ( ! $product_gifted_in_cart ) WC()->cart->add_to_cart( $product_gifted_id );
   }
}

To add a product variation to cart you need the parent variable product id and the product variation Id (both).要将产品变体添加到购物车,您需要父变量产品 ID 和产品变体 ID(两者)。

Now the code that you are using is obsolete and will not work if customer update cart in cart page, removing the required product id.现在您使用的代码已过时,如果客户在购物车页面更新购物车,删除所需的产品 ID,则该代码将无法使用。 In this case, the Gift product will be removed after reloading the page or jumping to another page.在这种情况下,Gift 产品将在重新加载页面或跳转到另一个页面后被删除。 So template_redirect is not the right hook to be used.所以template_redirect不是要使用的正确钩子。

Try the following instead, that handle simple products and product variations too:请尝试以下方法,它们也可以处理简单的产品和产品变体:

add_action( 'woocommerce_before_calculate_totals', 'wc_auto_add_gift_to_cart' );
function wc_auto_add_gift_to_cart( $cart ) {
    if (is_admin() && !defined('DOING_AJAX'))
        return;
    
    $required_product_id = 37; // The required product Id (or variation Id)
    $parent_gift_id      = 40; // The parent variable product Id (gift) for a product variation (set to zero for simple products)
    $product_gift_id     = 41; // the variation Id or the product Id (gift)
    
    $has_required = $gift_key = false; // Initializing
    
    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        // Check if required product is in cart
        if( in_array( $required_product_id, array($cart_item['product_id'], $cart_item['variation_id']) ) ) {
           $has_required = true;
        }
        // Check if gifted product is already in cart
        if( $cart_item['data']->get_id() == $product_gift_id ) {
           $gift_key = $cart_item_key;
        }
    }
    
    // If gift is in cart, but not the required product: Remove gift from cart
    if ( ! $has_required && $gift_key ) {
        $cart->remove_cart_item( $gift_key );
    }
    // If gift is not in cart and the required product is in cart: Add gift to cart
    elseif ( $has_required && ! $gift_key ) {
        // For simple products
        if( $parent_gift_id == 0 ) {
            $cart->add_to_cart( $product_gift_id );
        } 
        // For product variations (of a variable product)
        else {
            $cart->add_to_cart( $parent_gift_id, 1, $product_gift_id );
        }
    }
}

Code goes in functions.php file of your active child theme (or active theme).代码进入您的活动子主题(或活动主题)的 functions.php 文件。 Tested and works.测试和工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM