简体   繁体   中英

How to use cart total to change cart items prices in WooCommerce

I am trying to pass the total amount of the cart ( $GetTotalPrice ) from function cart_prices_GetPrice() to function cart_prices_ApplyPrice() , using a woocommerce_after_calculate_totals and woocommerce_before_calculate_totals hooks, but I get an empty value.

//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 );
               
              }

       } 
    } 
 }

At the same time, each of the functions separately works perfectly.
What am I doing wrong? Is it possible to somehow link two hook data so that the first one doesn't return an empty value?


Update:
I will not be able to refuse the hook woocommerce_before_calculate_totals , because I need to apply a separate price reduction for each product in the cart.

You can simply not use cart total in woocommerce_before_calculate_totals when you want to alter cart item price for many reasons…

Instead you will get cart item subtotal inside woocommerce_before_calculate_totals hook. On the code below I use the discounted cart item subtotal including taxes:

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
        }
    }
}

Code goes in functions.php file of the active child theme (or active theme). Tested and works.

See on Change cart item prices in Woocommerce 3 answer code, to see how to handle minicart displayed custom cart item price.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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