Search code examples
phpwordpresswoocommercecartfee

woocommerce_cart_calculate_fees load after woocommerce_before_cart_table


I have a problem trying to do some calculations with woocommerce_before_cart_table custom values and passing them to woocommerce_cart_calculate_fees. The problem is that woocommerce_before_cart_table is loading first and I am not able to pass that values from woocommerce_before_cart_table to woocommerce_cart_calculate_fees hook…

add_action( 'woocommerce_before_cart_table', 'my_custom_cart_items_raw_output');
function my_custom_cart_items_raw_output() {
    //$sum = array();
    foreach(WC()->cart->get_cart() as $cart_item_key => $item_values){ 

        global $wpdb;

        $mylink = $wpdb->get_row( "SELECT * FROM tax_hotel_and_name WHERE hotel_id= '".$item_values['st_booking_data']['room_id']."'" );
        $x = $mylink->tax_percentage;
        // Outputting the raw Cart items data to retrieve Bookings related data 
         $y = $item_values['st_booking_data']['total_price'];

         $sum[]=    ($x / 100) * $y;
            ($x / 100) * $y.'<br>';
    //  echo '<pre>'; print_r($item_values); echo '</pre>'; 
    }
     array_sum($sum);
}

add_action( 'woocommerce_cart_calculate_fees','woocommerce_custom_surcharge' );
function woocommerce_custom_surcharge() {
    global $woocommerce;

    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
    return;

    // $percentage = 0;
    // $taxes = array_sum($woocommerce->cart->taxes);
    // $surcharge = ( $woocommerce->cart->cart_contents_total + $woocommerce->cart->shipping_total + $taxes ) * $percentage;   
    // // Make sure that you return false here.  We can't double tax people!
    $woocommerce->cart->add_fee( 'Processing Fee', 12, false, '' );
}

How can I pass that calculation on woocommerce_cart_calculate_fees hook?

Thanks


Solution

  • So If I understand you are making some test of calculations related to booking data in your first function hooked in woocommerce_before_cart_table. I have made a little change in your code for global $wpdb;:

    add_action( 'woocommerce_before_cart_table', 'my_custom_cart_items_raw_output');
    function my_custom_cart_items_raw_output() {
    
        global $wpdb; // To be declared only once at the begining before the foreach loop
        
        foreach(WC()->cart->get_cart() as $cart_item_key => $item_values){ 
    
            $mylink = $wpdb->get_row( "SELECT * FROM tax_hotel_and_name WHERE hotel_id= '".$item_values['st_booking_data']['room_id']."'" );
            $x = $mylink->tax_percentage;
            // Outputting the raw Cart items data to retrieve Bookings related data 
            $y = $item_values['st_booking_data']['total_price'];
    
            $sum[] = ($x / 100) * $y;
            // echo    ($x / 100) * $y.'<br>';
            // echo '<pre>'; print_r($item_values); echo '</pre>'; 
        }
        array_sum($sum);
        // test output of $sum
        echo $sum;
    }
    

    Once you are sure of your calculations, as cart data is kind of live, you can use your calculation code directly in your 2nd hooked function in woocommerce_cart_calculate_fees action hook, with some little changes as this hook has a native $cart_object argument.

    So your code should be something like this:

    add_action( 'woocommerce_cart_calculate_fees','woocommerce_custom_surcharge', 10, 1 );
    function woocommerce_custom_surcharge( $cart_object ) {
    
        if ( is_admin() && ! defined( 'DOING_AJAX' ) )
            return;
    
        ## ---- CALCULATION ---- ##
    
        global $wpdb;
    
        foreach( $cart_object->get_cart() as $values ){ 
            
            $tax_hotel = $wpdb->get_row( "SELECT * FROM tax_hotel_and_name WHERE hotel_id= '".$values['st_booking_data']['room_id']."'" );
    
            $sum[] = ($tax_hotel->tax_percentage / 100) * $values['st_booking_data']['total_price'];
        }
    
        $fee = array_sum($sum);
    
        ## ---- APPLYING CALCULATED FEE ---- ##
    
        if($fee > 0)
            $cart_object->add_fee( __('Processing Fee'), $fee, false );
    }
    

    Code goes in functions.php file of your active child theme (or theme) or also in any plugin file.

    This code is untested, but it should work…