问题描述
我正在尝试对购物车中的所有物品应用TOTAL CART折扣,具体取决于所添加物品的数量.我已经从 answer中获取并修改了代码示例在这里,并且大多数逻辑都起作用了.
I am trying to apply a TOTAL CART discount to all the items in the cart, depending on the quantity of items added. 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.
场景:
- 如果购物车中没有任何物品在9至12之间,请对所有物品应用5%的折扣.
- 如果购物车中的商品均不在13-16之间,请对所有商品应用10%的折扣.
- 折扣不应该叠加.例如购物车中有12件商品时,可享受5%的折扣...在添加13件商品时,应去除5%的折扣,并享受10%的折扣.
代码:
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 do it by cart item quantity or globally based on cart items count:
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]);
}
}
}
代码进入您的活动子主题(或活动主题)的function.php文件中.经过测试,可以正常工作.
Code goes in function.php file of your active child theme (or active theme). Tested and works.
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]);
}
}
}
代码进入您的活动子主题(或活动主题)的function.php文件中.经过测试,可以正常工作.
Code goes in function.php file of your active child theme (or active theme). Tested and works.
这篇关于Woocommerce 3中的购物车项目数量累进百分比折扣的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!