WooCommerce - 如果数量超过1,则将购物车商品分开处理

时间:2015-09-09 16:45:06

标签: php wordpress woocommerce

我试图执行以下操作:

客户添加数量为" 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;
}

这家伙的解释非常好,我明白了:"当一件物品被添加到购物车时,一把钥匙就会出现在'对于购物车中的单个项目,是根据要添加的项目及其关联的元数据创建的。如果物品及其元数据与购物车中的另一个物品相同,那么生成的钥匙也将是相同的,并且购物车中已有商品的数量将仅增加添加的数量"

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

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

我几乎尝试了所有的购物车"我可以找到相关的过滤器,在WooCommerce文档上搜索,在woocommerce插件文件夹上对Sublime进行大量查找,更新购物车"," 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;
}

我在这里运行购物车对象,检查数量是否大于1,如果是,我分配一个新密钥。我真的不知道我是做正确的事,还是我完全离开赛道,所以任何指针都会非常受欢迎。

如果您需要更多信息,请告诉我,我会尽力提供。

非常感谢。

3 个答案:

答案 0 :(得分:5)

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

    }

}

答案 1 :(得分:0)

有过滤器挂钩woocommerce_update_cart_validation

答案 2 :(得分:0)