Woocommerce 3中基于数量的购物车项目折扣 [英] Cart item discount based on quantity in Woocommerce 3

查看:92
本文介绍了Woocommerce 3中基于数量的购物车项目折扣的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的WP网站出售定制的T恤.定制插件使每个定制衬衫成为woocommerce购物车中的一个订单项.如果订购了2件具有一种设计的衬衫(该订单项的数量为2件),我想打折.但是,如果每行只有1个项目,我不想打折.

My WP site sells customized t-shirts. The customization plugin makes each customized shirt a line item in the woocommerce cart. If there are 2 shirts ordered of one design (quantity of 2 on that line item) I want to discount. But if there is just 1 item per line I dont want to discount.

我找到了解决方案

通过购物车添加折扣物品根据物品数量有条件地

但是这似乎改变了分贝中的产品价格,因此在打折说2件蓝色衬衫之后,因为在1行上订购了2件蓝色衬衫,如果我在单独的一行上添加第3件衬衫,它也会获得折扣,我不想要.

But this seems to change the product price in the db, so after the discount kicks in for say 2 blue shirts because there were 2 ordered on 1 line, if I add a 3rd shirt on a separate line it also gets the discount, which I dont want.

推荐答案

自woocommerce版本3+起,链接的答案代码不起作用.它需要一些不同的东西,甚至可以更好的方式完成.

Since woocommerce version 3+ the linked answer code doesn't work. It needs something different and can even be done in a better way.

代码将根据购物车商品数量应用购物车商品折扣.在此代码示例中,当数量等于或大于2(两)时,它将对购物车商品应用5%的折扣.

The code will apply a cart item discount based on the cart item quantity. In this code example, it will apply a discount of 5% on the cart item, when the quatity is equal or more than 2 (two).

显示的购物车项目单价始终是实际产品价格.折扣将生效并显示在购物车项目小计中.

The cart item unit price displayed is always the real product price. The discount will be effective and displayed on the cart item subtotal.

另外,产品名称将附加折扣说明.

Additionally the product name will be appended with a discount mention.

代码:

add_filter('woocommerce_add_cart_item_data', 'add_items_default_price_as_custom_data', 20, 3 );
function add_items_default_price_as_custom_data( $cart_item_data, $product_id, $variation_id ){
    $product_id = $variation_id > 0 ? $variation_id : $product_id;

    ## ----- YOUR SETTING ----- ##
    $discount_percentage = 5; // Discount (5%)

    // The WC_Product Object
    $product = wc_get_product($product_id);

    // Only for non on sale products
    if( ! $product->is_on_sale() ){
        $price = (float) $product->get_price();

        // Set the Product default base price as custom cart item data
        $cart_item_data['base_price'] = $price;

        // Set the Product discounted price as custom cart item data
        $cart_item_data['new_price'] = $price * (100 - $discount_percentage) / 100;

        // Set the percentage as custom cart item data
        $cart_item_data['percentage'] = $discount_percentage;
    }

    return $cart_item_data;
}

// Display the product original price
add_filter('woocommerce_cart_item_price', 'display_cart_items_default_price', 20, 3 );
function display_cart_items_default_price( $product_price, $cart_item, $cart_item_key ){
    if( isset($cart_item['base_price']) ) {
        $product        = $cart_item['data'];
        $product_price  = wc_price( wc_get_price_to_display( $product, array( 'price' => $cart_item['base_price'] ) ) );
    }
    return $product_price;
}

// Display the product name with the discount percentage
add_filter( 'woocommerce_cart_item_name', 'append_percetage_to_item_name', 20, 3 );
function append_percetage_to_item_name( $product_name, $cart_item, $cart_item_key ){
    if( isset($cart_item['percentage']) && isset($cart_item['base_price']) ) {
        if( $cart_item['data']->get_price() != $cart_item['base_price'] )
            $product_name .= ' <em>(' . $cart_item['percentage'] . '% discounted)</em>';
    }
    return $product_name;
}

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

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

    ## ----- YOUR SETTING ----- ##
    $targeted_qty = 2; // Targeted quantity

    // Loop through cart items
    foreach ( $cart->get_cart() as $cart_item ) {

        // For item quantity of 2 or more
        if( $cart_item['quantity'] >= $targeted_qty && isset($cart_item['new_price']) ){

            // Set cart item discounted price
            $cart_item['data']->set_price($cart_item['new_price']);
        }
    }
}

代码进入您的活动子主题(或活动主题)的functions.php文件中.经过测试,可以正常工作.

Code goes in functions.php file of your active child theme (or active theme). Tested and works.

要显示打折的产品价格而不是原始产品价格,只需删除woocommerce_cart_item_price()函数(并挂钩)

To display the discounted product price instead of the original product price, just remove woocommerce_cart_item_price() function (and hook)

最新类似的: 查看全文

登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆