Search code examples
wordpresswoocommerceroundingcarthook-woocommerce

Round cart total and subtotal decimals off to nearest 5 unit in WooCommerce


I have been working on the cart value roundup to the nearest value and created a function but it roundups the complete value.

What am I doing wrong?

//round cart total up to nearest dollar
add_filter( 'woocommerce_calculated_total', 'custom_calculated_total' );
function custom_calculated_total( $total ) {
    $total = round( $total );
    return ceil($total / 5) * 5;
}

If I have the values 44.24 I want to output as 44.25 and if I have the value as 44.28 then the output should be as 44.30


Solution

  • First of all you will need to use the woocommerce_cart_subtotal filter hook in addition to the woocommerce_calculated_total filter hook. Otherwise your subtotal will deviate from the total, which seems weird

    Then you can use 1 of the answers from: Rounding Mechanism to nearest 0.05

    So you get:

    function rnd_func( $x ) {
        return round( $x * 2, 1 ) / 2;
    }
    
    function filter_woocommerce_cart_subtotal( $subtotal, $compound, $cart ) {
        // Get cart subtotal
        $round = rnd_func( $cart->subtotal );
        
        // Use wc_price(), for the correct HTML output
        $subtotal = wc_price( $round );
    
        return $subtotal;
    }
    add_filter( 'woocommerce_cart_subtotal', 'filter_woocommerce_cart_subtotal', 10, 3 );
    
    // Allow plugins to filter the grand total, and sum the cart totals in case of modifications.
    function filter_woocommerce_calculated_total( $total, $cart ) {    
        return rnd_func( $total );
    }
    add_filter( 'woocommerce_calculated_total', 'filter_woocommerce_calculated_total', 10, 2 );