【问题标题】:How to use cart total to change cart items prices in WooCommerce如何使用购物车总数来更改 WooCommerce 中的购物车商品价格
【发布时间】:2021-06-28 03:10:59
【问题描述】:

我正在尝试使用 woocommerce_after_calculate_totalswoocommerce_before_calculate_totals 挂钩将购物车的总金额 ($GetTotalPrice) 从函数 cart_prices_GetPrice() 传递给函数 cart_prices_ApplyPrice(),但我得到一个空值。

//Trying to get cart amount
add_action('woocommerce_after_calculate_totals', 'cart_prices_GetPrice'); 
function cart_prices_GetPrice()  {

    //Getting the cart amount
    $GetTotalPrice = WC()->cart->get_cart_total();
    return $GetTotalPrice;

}

//Applying custom price
add_action('woocommerce_before_calculate_totals', 'cart_prices_ApplyPrice');
function cart_prices_ApplyPrice( $cart_object ) {

    //Getting the cart amount from first function
    
    $totalprice = cart_prices_GetPrice(); // doesn't work and returns 0 :(


    //price change to cost2
    if( $totalprice != 0 && $totalprice >= 2000 ) {
       foreach ( $cart_object->get_cart() as $cart_id => $cart_item ) {
            
               // get products id
               $product_id = $cart_item['product_id'];
               if( $cart_item['product_id'] == $product_id ) {
                   
               // price change to cost2
               $new_price1 = 0.20;
               $cart_item['data']->set_price( $new_price1 );
               
              }

       } 
    } 
 }

同时,每个功能单独工作完美。
我究竟做错了什么?是否有可能以某种方式链接两个钩子数据,以便第一个不返回空值?


更新:
我将无法拒绝钩子woocommerce_before_calculate_totals,因为我需要为购物车中的每个产品单独申请降价。

【问题讨论】:

  • @LoicTheAztec 感谢您的好建议,但在这种情况下,搜索购物车中每件商品的产品 ID 将不起作用。我需要为购物车中的每件商品单独降价。

标签: php wordpress woocommerce cart hook-woocommerce


【解决方案1】:

当您出于多种原因想要更改购物车商品价格时,您不能在 woocommerce_before_calculate_totals 中使用购物车总数……

相反,您将在 woocommerce_before_calculate_totals 挂钩中获得购物车项目小计。在下面的代码中,我使用了包含税费的折扣购物车商品小计:

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

    // Avoiding the hook repetition for price calculations
    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    $threshold_amount = 1000; // Min subtotal
    $discount_rate    = 0.2; // price discount rate (20%)

    $cart_items       = $cart->get_cart();

    // Getting non discounted cart items subtotal
    $subtotal_excl_tax = array_sum( wp_list_pluck( $cart_items, 'line_subtotal' ) );
    $subtotal_tax = array_sum( wp_list_pluck( $cart_items, 'line_subtotal_tax' ) );

    // Getting discounted cart items subtotal
    $total_excl_tax = array_sum( wp_list_pluck( $cart_items, 'line_total' ) );
    $total_tax = array_sum( wp_list_pluck( $cart_items, 'line_tax' ) );

    if( ( $total_excl_tax + $total_tax ) >= $threshold_amount ) {
        // Loop through cart items
        foreach ( $cart_items as $item ) {
            $price = $item['data']->get_price(); // Get price

            $item['data']->set_price( $price * ( 1 - $discount_rate ) ); // Set new price
        }
    }
}

代码位于活动子主题(或活动主题)的functions.php 文件中。经过测试并且可以工作。

请参阅Change cart item prices in Woocommerce 3 答案代码,了解如何处理 minicart 显示的自定义购物车商品价格。

【讨论】:

  • 非常感谢!这种方法非常灵活。一些调整,一切都会准备就绪。你让我开心!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 2019-12-09
  • 2017-09-10
  • 2019-12-21
  • 2019-10-08
  • 1970-01-01
相关资源
最近更新 更多