WooCommerce - 如果数量超过 1,请单独处理购物车商品

WooCommerce - Treat cart items separate if quantity is more than 1

我正在尝试执行以下操作:

客户将数量为“1”的产品添加到购物车(单个产品页面上的数量字段已删除,因此只能添加 1 个)。

如果再次添加具有相同变体的相同产品,它不会将数量增加到“2”,而是将其作为单独的产品添加。

我设法用下面的过滤器完成了上述操作,这是我在 WordPress 论坛上找到的。

add_filter('woocommerce_add_cart_item_data', 'force_separate_item_add', 10, 2);
function force_separate_item_add($cart_item_data, $product_id) {

    $unique_cart_item_key = md5(microtime().rand()."Hi Mom!");
    $cart_item_data['unique_key'] = $unique_cart_item_key;

    return $cart_item_data;
}

大佬讲解的很好,我明白了:"When an item gets added to the cart, a 'key' for that individual item in the cart is created based on the item being added and its associated meta data. If the item and its meta data are identical to another item in the cart, then the generated key will be identical too, and the the quantity of the item already in the cart will simply be incremented by the quantity being added".

上面的代码只是添加了一个新键,然后购物车将它们视为单独的条目。

我现在要做的是在通过购物车更改数量时为此找到合适的过滤器。因此,如果客户将数量更改为“2”,它将为“2nd”项目生成一个新密钥并单独处理。

我尝试了几乎所有我能找到的 "cart" 相关过滤器,搜索 WooCommerce 文档,在 Sublime 的 woocommerce 插件文件夹中大量查找 "update cart","cart"等等,但恐怕我不确定要使用哪个。我做的最多的是这个:

add_action('woocommerce_before_calculate_totals', 'change_cart_item_price');
function change_cart_item_price($cart_object) {

    global $woocommerce;

    foreach ($woocommerce->cart->cart_contents as $cart_key => $cart_item_array) {        
        if($cart_item_array['quantity'] > 1 ) {
            $cart_item_key = md5(microtime().rand()."Hi Mom!");
            $cart_item_data['unique_key'] = $cart_item_key;

            $woocommerce->cart->set_quantity($cart_item_key, '1');
        }
   }

   return $cart_object;
}

在这里,我 运行 通过购物车对象,检查数量是否大于一个,如果是,我分配一个新密钥。我真的不知道我做的对不对。

有过滤器挂钩 woocommerce_update_cart_validation

您的 woocommerce_add_cart_item_data 过滤器对我来说是一个很好的开始。我最终保留原样并转到 woocommerce_add_to_cart 挂钩以手动处理。

这是目前对我有用的精简版。

/**
 * This hook runs at the end of the default add to cart processes, when you try to add an item to cart.
 * If trying to add more than item to the cart, separate them into individual cart items
 *
 * @author  Mike Hemberger <mike@bizbudding.com>
 *
 * @return  void
 */
add_action( 'woocommerce_add_to_cart', 'mai_split_multiple_quantity_products_to_separate_cart_items', 10, 6 );
function mai_split_multiple_quantity_products_to_separate_cart_items( $cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data ) {

    // If product has more than 1 quantity
    if ( $quantity > 1 ) {

        // Keep the product but set its quantity to 1
        WC()->cart->set_quantity( $cart_item_key, 1 );

        // Run a loop 1 less than the total quantity
        for ( $i = 1; $i <= $quantity -1; $i++ ) {
            /**
             * Set a unique key.
             * This is what actually forces the product into its own cart line item
             */
            $cart_item_data['unique_key'] = md5( microtime() . rand() . "Hi Mom!" );

            // Add the product as a new line item with the same variations that were passed
            WC()->cart->add_to_cart( $product_id, 1, $variation_id, $variation, $cart_item_data );
        }

    }

}