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

问题描述

当有人将商品添加到购物车时,我正在尝试为woocommerce 创建买一送一的报价。下面的代码有效,但仅适用于简单的产品,我尝试将变体arr.each_with_object([]) do |h,arr| arr << h["count"] if h["work_category"] == "CASE PICKS" end #=> ["21315","16842","24849"] 添加到变量中,但不起作用。有任何想法吗?感谢社区

ID

解决方法

要将产品变体添加到购物车,您需要父变量产品ID和产品变体ID(两者)。

现在,如果客户在购物车页面中更新购物车并删除了所需的产品ID,那么您正在使用的代码已过时,将无法使用。在这种情况下,礼品产品将在重新加载页面或跳转到另一页面后被删除。因此,template_redirect不是要使用的正确钩子。

尝试以下方法,它们也可以处理简单的产品和产品变体:

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

代码进入活动子主题(或活动主题)的functions.php文件中。经过测试,可以正常工作。