Easiest way to double the rate in certain cases?
-
Hey there!
I want to add checkbox to the checkout page where customers can also order return pickup for the items. And if they check that, the kilometers rate should be doubled.
I already have working code to double the basic WooCommerce fees via ajax etc, but how can I attach myself into this plugin and update it’s rate too?
Example of code I’m already using to double the basic shipping costs:
// Add a Custom checkbox field for shipping options (just for testing) add_action( 'woocommerce_after_checkout_billing_form', 'custom_billing_checkbox_for_testing', 10, 1 ); function custom_billing_checkbox_for_testing( $checkout ) { $field_id = 'billing_ups_yn'; // Get the checked state if exist $billing_ups = WC()->session->get('billing_ups' ); if(empty($billing_ups)) $billing_ups = $checkout->get_value( $field_id ); // Add the custom checkout field (checkbox) woocommerce_form_field( $field_id, array( 'type' => 'checkbox', 'class' => array( 'form-row-wide' ), 'label' => __('DOUBLE THE SHIPPING COSTS'), ), $billing_ups ); } // function that gets the Ajax data add_action( 'wp_ajax_woo_get_ajax_data', 'woo_get_ajax_data' ); add_action( 'wp_ajax_nopriv_woo_get_ajax_data', 'woo_get_ajax_data' ); function woo_get_ajax_data() { if ( $_POST['billing_ups'] == '1' ){ WC()->session->set('billing_ups', '1' ); } else { WC()->session->set('billing_ups', '0' ); } echo json_encode( WC()->session->get('billing_ups' ) ); die(); // Alway at the end (to avoid server error 500) } // Conditionally changing the shipping methods costs add_filter( 'woocommerce_package_rates','conditional_custom_shipping_cost', 90, 2 ); function conditional_custom_shipping_cost( $rates, $package ) { if ( WC()->session->get('billing_ups' ) == '1' ){ foreach ( $rates as $rate_key => $rate_values ) { // Not for "Free Shipping method" (all others only) if ( 'free_shipping' !== $rate_values->method_id ) { // Set the rate cost $rates[$rate_key]->cost = $rates[$rate_key]->cost * 2; // Set taxes rate cost (if enabled) $taxes = array(); foreach ($rates[$rate_key]->taxes as $key => $tax) if( $rates[$rate_key]->taxes[$key] > 0 ) // set the new tax cost $taxes[$key] = $taxes[$key] * 2; $rates[$rate_key]->taxes = $taxes; } } } return $rates; } // Enabling, disabling and refreshing session shipping methods data add_action( 'woocommerce_checkout_update_order_review', 'refresh_shipping_methods', 10, 1 ); function refresh_shipping_methods( $post_data ){ $bool = true; if ( WC()->session->get('billing_ups' ) == '1' ) $bool = false; // Mandatory to make it work with shipping methods foreach ( WC()->cart->get_shipping_packages() as $package_key => $package ){ WC()->session->set( 'shipping_for_package_' . $package_key, $bool ); } WC()->cart->calculate_shipping(); } // The Jquery script add_action( 'wp_footer', 'custom_checkout_script' ); function custom_checkout_script() { ?> <script type="text/javascript"> jQuery( function($){ // update cart on delivery location checkbox option $('#billing_ups_yn_field input').change( function () { var checked = 0; if ( $('#billing_ups_yn').is(':checked') ) checked = 1; $.ajax({ type: 'POST', url: wc_checkout_params.ajax_url, data: { 'action': 'woo_get_ajax_data', 'billing_ups': checked, }, success: function (result) { $('body').trigger('update_checkout'); console.log('response: '+result); // just for testing }, error: function(error){ console.log(error); // just for testing } }); }); }); </script> <?php }
Viewing 2 replies - 1 through 2 (of 2 total)
Viewing 2 replies - 1 through 2 (of 2 total)
- The topic ‘Easiest way to double the rate in certain cases?’ is closed to new replies.