• Resolved rikuksf

    (@rikuksf)


    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.