简体   繁体   English

Woocommerce 3中的购物车项目数量累进百分比折扣

[英]Cart item quantity progressive percentage discount in Woocommerce 3

I am trying to apply a TOTAL CART discount to all the items in the cart, depending on the quantity of items added. 我正在尝试对购物车中的所有物品应用TOTAL CART折扣,具体取决于所添加物品的数量。 I have taken and modified the code example from answer here and got most of the logic working. 我从此处的答案中提取并修改了代码示例,并使大多数逻辑正常工作。

I cannot however get it working for two scenarios described below. 但是,我无法使其在以下两种情况下正常工作。 It also only applies the rule to a single item in the cart. 它还仅将规则应用于购物车中的单个项目。 Not the entire cart. 不是整个购物车。

Scenario: 场景:

  • If no of items in the cart are between 9-12, Apply 5% Discount to all items. 如果购物车中的任何物品都不在9-12之间,则对所有物品应用5%的折扣。
  • If no of items in the cart are between 13-16, Apply 10% Discount to all items. 如果购物车中的物品数量不在13-16之间,则对所有物品应用10%的折扣。
  • The discount's should not stack. 折扣不应该叠加。 eg when 12 items in cart, apply 5% discount...when 13 items added, remove 5% discount and apply 10% discount. 例如,当购物车中有12件商品时,可享受5%的折扣...当添加13件商品时,应去除5%的折扣并应用10%的折扣。

Code: 码:

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 ) {

    ## ----- YOUR SETTING ----- ##
    $balanced_qty = 9; // Targeted quantity
    $upper_balanced_qty = 12; // Max quantity limit
    // Loop through cart items
    foreach ( $cart->get_cart() as $cart_item ) {

        // For item quantity between 9 and 12
        if( ($cart_item['quantity'] >= $balanced_qty && isset($cart_item['new_price']) && ($cart_item['quantity'] <= $upper_balanced_qty) ) ){

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

在此处输入图片说明

You can add a discount to the whole cart by apply a negative fee. 您可以通过应用负费用为整个购物车添加折扣。

See: Apply a discount on the cart content total excluding taxes in WooCommerce 请参阅: 在WooCommerce中对购物车总计(不含税)应用折扣

Try the code below 试试下面的代码

add_action( 'woocommerce_before_calculate_totals', 'custom_discounted_cart_item_price', 20, 1 );
function custom_discounted_cart_item_price( $cart ) {
  $total_cart_items_count = $cart->get_cart_contents_count();
  $discount = null;

  // Apply 5% discount between 9 - 12 items
  if( $total_cart_items_count >= 9 && $total_cart_items_count <= 12 ) {
    // Calculate 5% of cart total
    $discount = $cart->get_cart_contents_total() * 5 / 100;
  }

  // Apply 10% discount between 13 - 16 items
  if( $total_cart_items_count >= 13 && $total_cart_items_count <= 16 ) {
    // Calculate 10% of cart total
    $discount = $cart->get_cart_contents_total() * 10 / 100;
  }

  if( !empty( $discount ) ) {
    $cart->add_fee(
      __( 'Discount', 'woocommerce' ) . '($percent%)',
      -$discount,
      false // TAX
    );
  }
}

You can do it by cart item quantity or globally based on cart items count: 您可以按购物车商品数量进行选择,也可以根据购物车商品数量进行全局选择:

1) By cart item quantity: 1)按购物车项目数量:

// Utility function that give the discount percentage based on quantity argument
function get_discount_percent( $quantity ){
    if( $quantity < 9 )
        $percent = 0;  // 0 %  ( quantity from 1 to 8 )
    elseif( $quantity >= 9 && $quantity < 13 )
        $percent = 5;  // 5 %  ( quantity from 9 to 12 )
    else
        $percent = 10; // 10 % ( quantity up to 13 )

    return $percent;
}


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 ----- ##
    $percent_1 = 5; //  Discount (5%)
    $percent_2 = 10; // Discount (10%)

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

    $price = (float) $product->get_price();

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

    // Set the Product discounted price of 5% as custom cart item data
    $cart_item_data['discount'][$percent_1] = $price * (100 - $percent_1) / 100;

    // Set the Product discounted price of 10% as custom cart item data
    $cart_item_data['discount'][$percent_2] = $price * (100 - $percent_2) / 100;

    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['discount'][0]) ) {
        $product        = $cart_item['data'];
        $product_price  = wc_price( wc_get_price_to_display( $product, array( 'price' => $cart_item['discount'][0] ) ) );
    }
    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 ){
    // get the percent based on quantity
    $percent = get_discount_percent($cart_item['quantity']);

    if( isset($cart_item['discount'][$percent]) && isset($cart_item['discount'][0]) ) {
        if( $cart_item['data']->get_price() != $cart_item['discount'][0] )
            $product_name .= ' <em>(' . $percent . '% discounted)</em>';
    }
    return $product_name;
}

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

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

    foreach( $cart->get_cart() as $cart_item ){
        // get the percent based on quantity
        $percentage = get_discount_percent($cart_item['quantity']);

        // For items non on sale set a discount based on quantity as defined in
        if( $percentage != 0 && isset($cart_item['discount'][$percentage]) && ! $cart_item['data']->is_on_sale() ) {
            $cart_item['data']->set_price($cart_item['discount'][$percentage]);
        }
    }
}

Code goes in function.php file of your active child theme (or active theme). 代码进入您的活动子主题(或活动主题)的function.php文件中。 Tested and works. 经过测试和工作。

在此处输入图片说明


2) Globally on cart item count (for non on sale products) : 2)全球购物车中的商品数量 (非促销商品)

// Utility function that give the discount percentage based on quantity argument
function get_discount_percent( $quantity ){
    if( $quantity < 9 )
        $percent = 0;  // 0 %  ( quantity from 1 to 8 )
    elseif( $quantity >= 9 && $quantity < 13 )
        $percent = 5;  // 5 %  ( quantity from 9 to 12 )
    else
        $percent = 10; // 10 % ( quantity up to 13 )

    return $percent;
}

// Utility function that count cart items that are not on sale
function get_non_on_sale_cart_items_count(){
    $items_count = 0;
    foreach( WC()->cart->get_cart() as $cart_item ){
        if( ! $cart_item['data']->is_on_sale() ){
            $items_count += $cart_item['quantity'];
        }
    }
    return $items_count;
}


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 ----- ##
    $percent_1 = 5; //  Discount (5%)
    $percent_2 = 10; // Discount (10%)

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

    $price = (float) $product->get_price();

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

    // Set the Product discounted price of 5% as custom cart item data
    $cart_item_data['discount'][$percent_1] = $price * (100 - $percent_1) / 100;

    // Set the Product discounted price of 10% as custom cart item data
    $cart_item_data['discount'][$percent_2] = $price * (100 - $percent_2) / 100;

    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['discount'][0]) ) {
        $product        = $cart_item['data'];
        $product_price  = wc_price( wc_get_price_to_display( $product, array( 'price' => $cart_item['discount'][0] ) ) );
    }
    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 ){
    // Get cart items count
    $items_count = get_non_on_sale_cart_items_count();

    // get the percent based on quantity
    $percent = get_discount_percent($items_count);

    if( isset($cart_item['discount'][$percent]) && isset($cart_item['discount'][0]) ) {
        if( $cart_item['data']->get_price() != $cart_item['discount'][0] )
            $product_name .= ' <em>(' . $percent . '% discounted)</em>';
        elseif ( $cart_item['data']->is_on_sale() && $percent != 0 ){
            $product_name .= ' <em>(Item on sale)</em>';
        }
    }
    return $product_name;
}

// Change cart item price
add_action( 'woocommerce_before_calculate_totals', 'set_custom_discount_cart_item_price', 25, 1 );
function set_custom_discount_cart_item_price( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

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

    // Get cart items count
    $items_count = get_non_on_sale_cart_items_count();

    // get the percent based on quantity
    $percentage = get_discount_percent($items_count);

    foreach( $cart->get_cart() as $cart_item ){
        // For items non on sale set a discount based on quantity as defined in
        if( $percentage != 0 && isset($cart_item['discount'][$percentage]) && ! $cart_item['data']->is_on_sale() ) {
            $cart_item['data']->set_price($cart_item['discount'][$percentage]);
        }
    }
}

Code goes in function.php file of your active child theme (or active theme). 代码进入您的活动子主题(或活动主题)的function.php文件中。 Tested and works. 经过测试和工作。

Here below, in this example, the third item is on sale, so the real count is 10 + 1 = 11 items and then the discount for 11 items is 5% : 这里下面,在该示例中,第三项目有售,所以真正的计数是10 + 1 = 11的项目,然后对折11项是5%

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM