我想在WooCommerce的购物车页面上增加产品的数量,如果该产品已经存在于购物车上.

我试过这段代码

if ( 'same_product_added_to_cart' === $customer_gets_as_free ) {
   foreach ( $main_product_id as $main_product_single ) {
        $main_product_single = intval( $main_product_single );
    foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
        if ( $cart_item['product_id'] === $main_product_single ) {
        // Get the current quantity
        $current_quantity = $cart_item['quantity'];
        // Increase the quantity by one
        $new_quantity = $current_quantity + 1;

        // Update the cart with the new quantity
        WC()->cart->set_quantity( $cart_item_key, $new_quantity );

        break; // Exit the loop since we have found our product
       }
       }
   }
}

它没有起作用,相反,它触发了无限数量的循环,从而导致错误.我在这里做错了什么.add_to_cart()函数也会给出相同类型的错误.

推荐答案

通常,如果没有不同的定制购物车项目数据添加到添加到购物车上的购物车项目,WooCommerce会自己执行此操作.

您的代码中存在错误和缺失的步骤.

以下是合并重复产品(购物车项目)的方法:

add_action( 'woocommerce_before_calculate_totals', 'merge_duplicated_products_in_cart');
function merge_duplicated_products_in_cart( $cart ) {
    if ((is_admin() && !defined('DOING_AJAX')))
        return;

    if (did_action('woocommerce_before_calculate_totals') >= 2)
        return;

    $items_data = $item_update = []; // initializing

    // Loop through cart items
    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        $product_id = $cart_item['data']->get_id();
        $quantity   = $cart_item['quantity'];

        // Check if the product exists
        if( in_array($product_id, array_keys($items_data)) ) {
            // Same product found
            $item_update['item_qty'] = $items_data[$product_id]['qty'] + $quantity; // Set cumulated quantities
            $item_update['item_key'] = $items_data[$product_id]['key']; // Add first product item key
            $item_update['item_remove'] = $cart_item_key; // Add current item key (product to be removed)
            break; // Stop the loop
        } 
        // Add product_id, cart item key and item quantity to the array (for each item)
        else {
            $items_data[$product_id] = array(
                'key' => $cart_item_key,
                'qty' => $quantity
            );
        }
    }
    unset($items_data); // delete the variable

    if ( ! empty($item_update) ) {
        $cart->remove_cart_item($item_update['item_remove']); // remove last item (same product)
        $cart->set_quantity($item_update['item_key'], $item_update['item_qty']); // Update quantity on first item(same product)
        unset($item_update); // delete the variable
    }
}

代码位于您的子主题的unctions.php文件中(或在插件中).经过测试,效果良好.


Addition,(based on the OP comment):

以下内容将针对特定定义的产品(S).如果特定产品已经在购物车中,则将数量增加1(define your product(s) ID(s) below):

add_action( 'woocommerce_before_calculate_totals', 'merge_duplicated_products_in_cart');
function merge_duplicated_products_in_cart( $cart ) {
    if ((is_admin() && !defined('DOING_AJAX')))
        return;

    if (did_action('woocommerce_before_calculate_totals') >= 2)
        return;

    $targeted_product_ids = array(18); // <== HERE set your(s) targeted product(s) ID(s)

    $items_data = $item_update = []; // initializing

    // Loop through cart items
    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        $product_id = $cart_item['data']->get_id();

        // Look for specific products only
        if ( in_array($product_id, $targeted_product_ids) ) {
            $quantity   = $cart_item['quantity'];

            // Check if the product is already in cart
            if( in_array($product_id, array_keys($items_data)) ) {
                // Same product found
                $item_update['item_qty'] = $items_data[$product_id]['qty'] + 1; // ADD ONE TO THE QUANTITY
                $item_update['item_key'] = $items_data[$product_id]['key']; // Add first product item key
                $item_update['item_remove'] = $cart_item_key; // Add current item key (product to be removed)
                break; // Stop the loop
            } 
            // Add product_id, cart item key and item quantity to the array (for SPECIFIC items only)
            else {
                $items_data[$product_id] = array(
                    'key' => $cart_item_key,
                    'qty' => $quantity
                );
            }
        }
    }
    unset($items_data); // delete the variable

    if ( ! empty($item_update) ) {
        $cart->remove_cart_item($item_update['item_remove']); // remove last item (same product)
        $cart->set_quantity($item_update['item_key'], $item_update['item_qty']); // Update quantity on first item(same product)
        unset($item_update); // delete the variable
    }
}

代码位于您的子主题的unctions.php文件中(或在插件中).经过测试,效果良好.

Php相关问答推荐

用户信息更新期间Laravel邮箱验证问题

获取要删除的图像的公共ID

有没有办法为整个PHP应用程序启用严格类型

为什么在我的PHP联系人脚本中开机自检后出现未定义变量错误?

如何确保所有语言文件都使用Laravel中的新密钥进行更新?

使用随机生成器在MYSQL中创建唯一ID-定义一个数组来存储已知ID是否安全

shell_exec运行大型数据处理

显示 woocommerce 中所选变体的属性术语描述

将一个表中的行连接为不同表MYSQL中的一列

将自定义保存金额移至 Woocommerce 简单产品中的价格以下

当我激活插件时出现错误注意:未定义的偏移量:1

致命错误:未捕获 Google_Exception:客户端机密 JSON 文件无效.在 /somepath/lib/vendor/google/apiclient/src/Google/Client.php

使用其ID查询和捕获与订单相关的其他详细信息的shopware 6方法

判断类别是否存在 Shopware 6

同时执行odbc_execute、odbc_fetch_row和odbc_result

PHP / DOM : 解析 HTML 以提取基于类的数​​据

在 laravel 中更新表单时如何在 Select 选项中保留旧值?

我需要获取传递到这个数组中的数据,但我没有得到它,因为在 Laravel 中数组是这样出现的

无法在 Laravel 10 中安装 jenssegers/mongodb

为什么非贪婪匹配会消耗整个模式,即使后面跟着另一个非贪婪匹配