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
Advertisement
Answer
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…