我正试图在我的网站上做BOGO的情况是,当有人添加一个产品到购物车的数量5或有人在购物车页面增加一个特定的购物车项目数量大于5自动在购物车页面上,购物车项目将复制和添加作为购物车项目的小计0.00美元.下面是一个例子

Product Quantity Subtotal
T-Shirt 5 10.00$
T-Shirt 1 FREE

贝娄,我已经在我的插件页面上试过了.

add_filter('woocommerce_update_cart_action_cart_updated', 'on_action_cart_updated');

function on_action_cart_updated( $cart_updated ) {

    if ( WC()->cart ) {

        $cart_items = WC()->cart->get_cart();

        foreach ( $cart_items as $key => $cart_item ) {
            if ( $cart_item && 5 <= $cart_item['quantity'] ) {
                $unique_key = md5( microtime().rand() );
                $duplicate_item = $cart_item;
                $duplicate_item['key'] = $unique_key;
                $duplicate_item['quantity'] = 1;

                $item_object = $cart_item['data'];
                $item_object->add_meta_data('duplicated','yes');

                $_product = wc_get_product( $cart_item );
                error_log( $_product->get_type() );
//                $product =  new WC_Product_Simple();
//                $product->set_title('')
//                //$item_object->get_meta_data('duplicated');
//
//                WC()->cart->add_to_cart( $cart_item['product_id'], 1, 0, 0, [], $unique_key);
                WC()->cart->add_to_cart($cart_item['product_id'],1);
//                WC()->cart->cart_contents[$unique_key] = $duplicate_item;
            }
        }
    }

    return $cart_updated;
}

此代码将增加旧购物车项目的数量,而不是将新的购物车项目添加为购物车列表上的重复旧购物车项目.

推荐答案

请try 使用以下内容:

// Duplicate cart item (separated)
add_filter('woocommerce_update_cart_action_cart_updated', 'action_on_cart_updated');
function action_on_cart_updated( $cart_updated ) {
    $cart = WC()->cart;

    if ( ! $cart->is_empty() ) {
        foreach ( $cart->get_cart() as $item_key => $item ) {
            if ( $item && 5 <= $item['quantity'] ) {
                // Adjust cart item quantity
                $cart->set_quantity( $item_key, ($item['quantity'] - 1), false );
                $item_data = ['unique_key' => md5(microtime().rand()), 'free_item' => 'yes'];
                // Add a separated product (free )
                $cart->add_to_cart($item['product_id'], 1, $item['variation_id'], $item['variation'], $item_data);
            }
        }
    }
    return $cart_updated;
}

// Set cart item price
add_filter('woocommerce_before_calculate_totals', 'action_before_calculate_totals');
function action_before_calculate_totals( $cart ) {
    if ((is_admin() && !defined('DOING_AJAX')))
        return;

    foreach ( $cart->get_cart() as $item_key => $item ) {
        if ( isset($item['free_item']) ) {
            $item['data']->set_price(0);
        }
    }
}

// Display "Free" instead of "0" price
add_action('woocommerce_cart_item_subtotal', 'filter_cart_item_displayed_price', 10, 2);
add_action('woocommerce_cart_item_price', 'filter_cart_item_displayed_price', 10, 2);
function filter_cart_item_displayed_price($price_html, $cart_item){
    if (isset($cart_item['free_item'])) {
        return 'FREE';
    }
    return $price_html;
}

代码位于您的子主题的unctions.php文件中(或在插件中).应该能行得通.

Php相关问答推荐

在PHP中替换数组中的文本并同时使用其他函数

LaravelEloquent 的地方条件父/子与第三模型多对多

在特定日期之间使用特定的元密钥销售产品

在WooCommerce中添加基于类别的固定费用

将SVG包含在另一个php生成的SVG中

在WooCommerce Admin产品列表自定义列中显示来自元数据的统计数据

在WooCommerce购物车页面应用优惠券不会';t刷新总计

更改特定产品标签的 Woocommerce 产品名称

Woocommerce 仅在前端为登录用户提供价格折扣

用户注册表单中的 HTTP 错误 405

根据页面以及是否在促销,向 WooCommerce 中显示的价格添加前缀

需要以一种形式执行两个操作

过滤会员计划标题和标签

如何为自定义帖子类型的自定义角色提供功能

我的功能以舒适的方式显示数组 struct

为WooCommerce中的运输方式ID设置必填的 checkout 订单备注字段

如何修复正则表达式以在换行符后查找非数值

从 laravel 中的日期类型中删除时间

PHP 自动函数参数和变量

为什么可以从 PHP 类访问 PHP Trait 的私有成员?