Php WooCommerce-如果数量超过1,则单独处理购物车项目

Php WooCommerce-如果数量超过1,则单独处理购物车项目,php,wordpress,woocommerce,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

我正在努力做到以下几点:

客户将数量为“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”,它将为“第2个”项目生成一个新的密钥并单独处理。

我已经尝试了我能找到的几乎所有与“购物车”相关的过滤器,搜索WooCommerce文档,在WooCommerce插件文件夹中的Sublime上大量查找“更新购物车”、“购物车”等,但恐怕我不太确定要使用哪一个。我做得最多的是这一个:

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

在这里,我正在运行cart对象,检查数量是否大于1,以及是否大于1,我分配了一个新的密钥。我真的不知道我是否做了正确的事情。

有一个过滤器钩子woocommerce\u update\u cart\u validation

你的
woocommerce\u add\u cart\u item\u data
过滤器对我来说是一个很好的开始。我最终离开了这个过滤器按原样移动到
woocommerce\u添加到\u购物车
hook手动处理

这是一个苗条的版本,目前正在为我工作

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

    }

}
/**
*当您尝试将项目添加到购物车时,此挂钩将在默认的“添加到购物车”过程结束时运行。
*如果尝试向购物车中添加多个项目,请将它们分隔为各个购物车项目
*
*@作者迈克·亨伯格
*
*@返回无效
*/
添加操作('woocommerce\u add\u to\u cart'、'mai\u split\u multiple\u quantity\u products\u to\u separate\u cart\u items',10,6);
函数mai\u split\u multiple\u quantity\u products\u to\u separate\u cart\u items($cart\u item\u key,$product\u id,$quantity,$variation\u id,$variation,$cart\u item\u data){
//如果产品数量超过1个
如果($quantity>1){
//保留产品,但将其数量设置为1
WC()->cart->set_数量($cart_item_key,1);
//运行一个小于总数量1的循环
对于($i=1;$i购物车->将商品添加到购物车($product\u id,1,$variation\u id,$variation,$cart\u item\u data);
}
}
}
试试这个


参考:答案代码

当有人更新购物车时,如何将其修改为同时运行?例如,我将某个物品的数量更改为2,然后点击“更新购物车”?理想情况下,我希望它们再次拆分为单独的物品?@HectorOfTroy407我也在寻找该选项?你得到答案了吗?如何将其修改为同时运行r当有人更新购物车时取消?例如,我将某个商品的数量更改为2,然后点击“更新购物车”?理想情况下,我希望它们再次拆分为单独的商品?我也在寻找这个。有什么帮助吗?这个(旧)问题已经包含多个答案和一个已接受的答案。如果您想引用现有答案,最好通过评论部分(有足够的声誉,您可以这样做)。您还可以解释(通过编辑您的答案)此答案与其他答案的不同之处吗?