【问题标题】:updating product subtotal in cart contents更新购物车内容中的产品小计
【发布时间】:2021-11-14 15:05:47
【问题描述】:

我正在尝试编写我的广告系列插件。 问题来了,

我想在$cart_items 的产品中更新line_subtotalline_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);

【问题讨论】:

  • 你的问题对我来说并不完全清楚。是否打算根据购物车中产品的数量调整购物车中每个订单项(每个产品)的价格和小计?
  • 是的,需要根据产品进行更新。我也添加了,解决方案谢谢。

标签: woocommerce hook-woocommerce woocommerce-theming


【解决方案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);

【讨论】:

    猜你喜欢
    • 2015-07-21
    • 2021-11-08
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多