更新购物车内容中的产品小计
Posted
技术标签:
【中文标题】更新购物车内容中的产品小计【英文标题】:updating product subtotal in cart contents 【发布时间】:2021-11-14 15:05:47 【问题描述】:我正在尝试编写我的广告系列插件。 问题来了,
我想在$cart_items
的产品中更新line_subtotal
和line_total
。
1- woocommerce_cart_product_subtotal
并没有真正起作用。
2- 我尝试通过cart_item_key
重新定义数组元素
foreach($cartItems as $hash => $perProduct)
if($perProduct['product_id'] = $lastItemsProductId)
if($lastItemsQuantity > 1)
$lineSubtotal = data_get($lastItemInCart, 'line_subtotal');
$lineTotal = data_get($lastItemInCart, 'line_total');
$newQuantity = $lastItemsQuantity-1;
$lastItemInCart['line_subtotal'] = $newQuantity * $lastItemsPrice;
$lastItemInCart['line_total'] = $newQuantity * $lastItemsPrice;
$cartItems[$lastItemsKey] = $lastItemInCart;
WC()->cart->calculate_totals();
else
此函数也在woocommerce_before_calculate_totals
操作中运行。
当我尝试使用 woocommerce_get_cart_contents
过滤器时,我的购物车会自行清空。
3- 场景:
当我添加A产品时,(如果被系统选择)并且数量超过2,我想对该产品进行折扣。
有什么帮助吗?谢谢。
这是答案
/**
* Add filter for order list
*
* @param [int] $product_subtotal
* @param [object] $product
* @param [int] $quantity
* @param [array] $cart
* @return void
*/
public function filterWoocommerceCartProductSubtotal($product_subtotal, $product, $quantity, $cart) : string
$appliedCoupons = $cart ? $cart->get_applied_coupons() : null;
$cartCount = $cart ? count($cart->get_cart()) : 0;
$cartItems = $cart->get_cart();
$lastItemInCart = last($cartItems);
$lastItemsProductId = data_get($lastItemInCart, 'product_id', data_get($lastItemInCart, 'product_id'));
$lastItemsPrice = $lastItemInCart['data']->get_regular_price();
$lastItemsQuantity = data_get($lastItemInCart, 'quantity');
$lastItemsKey = data_get($lastItemInCart, 'key');
if( in_array('3al2ode', $appliedCoupons))
if($lastItemsQuantity > 1)
if(@data_get($product,'id') == $lastItemsProductId)
$newSubTotal = 0;
$price = $product->get_price();
$newQuantity = $lastItemsQuantity-1;
$quantity = $newQuantity;
$newSubTotal += $price * $quantity;
return $newSubTotal ? wc_price($newSubTotal) : $product_subtotal;
return $product_subtotal;
正确的,过滤器应该是这样的;
add_filter( 'woocommerce_cart_product_subtotal', [$this,'filterWoocommerceCartProductSubtotal'], 10, 4);
【问题讨论】:
你的问题对我来说并不完全清楚。是否打算根据购物车中产品的数量调整购物车中每个订单项(每个产品)的价格和小计? 是的,需要根据产品进行更新。我也添加了,解决方案谢谢。 【参考方案1】:根据你目前的情况-当我添加一个产品时,(它是系统选择的),如果数量超过2个,我想给这个产品打折。
你应该试试这个-
add_action( 'woocommerce_cart_calculate_fees','woocommerce_add_discount',10, 1 );
function woocommerce_add_discount()
global $woocommerce;
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
$cart_qty = count($woocommerce->cart->get_cart());
if($cart_qty > 2)
$percentage = 0.5;
$cart_subtotal = $woocommerce->cart->get_subtotal() ?: 0;
//$cart_total = $woocommerce->cart->cart_contents_total;
//$shipping_total = $woocommerce->cart->get_shipping_total() ?: 0;
//$tax_total = $woocommerce->cart->get_taxes_total() ?: 0;
//$grand_total = $cart_total + $shipping_total + $tax_total;
// Calculate the amount to reduce
$discount = $cart_subtotal * $percentage;
$woocommerce->cart->add_fee( 'Discount 50%', -$discount, true, '' );
您可以相应地更新/修改条件。
【讨论】:
您好,感谢您的回复。但是我需要准备订单列表更新的购物车总数。 我也更新了我的答案。【参考方案2】: /**
* Add filter for order list
*
* @param [int] $product_subtotal
* @param [object] $product
* @param [int] $quantity
* @param [array] $cart
* @return void
*/
public function filterWoocommerceCartProductSubtotal($product_subtotal, $product, $quantity, $cart) : string
$appliedCoupons = $cart ? $cart->get_applied_coupons() : null;
$cartCount = $cart ? count($cart->get_cart()) : 0;
$cartItems = $cart->get_cart();
$lastItemInCart = last($cartItems);
$lastItemsProductId = data_get($lastItemInCart, 'product_id', data_get($lastItemInCart, 'product_id'));
$lastItemsPrice = $lastItemInCart['data']->get_regular_price();
$lastItemsQuantity = data_get($lastItemInCart, 'quantity');
$lastItemsKey = data_get($lastItemInCart, 'key');
if( in_array('3al2ode', $appliedCoupons))
if($lastItemsQuantity > 1)
if(@data_get($product,'id') == $lastItemsProductId)
$newSubTotal = 0;
$price = $product->get_price();
$newQuantity = $lastItemsQuantity-1;
$quantity = $newQuantity;
$newSubTotal += $price * $quantity;
return $newSubTotal ? wc_price($newSubTotal) : $product_subtotal;
return $product_subtotal;
正确的,过滤器应该是这样的;
add_filter( 'woocommerce_cart_product_subtotal', [$this,'filterWoocommerceCartProductSubtotal'], 10, 4);
【讨论】:
以上是关于更新购物车内容中的产品小计的主要内容,如果未能解决你的问题,请参考以下文章