Monday 27 November 2023

Shipping option update on cart and checkout page using ajax

 


add_action( 'wp_footer', 'refresh_shipping_js' );

function refresh_shipping_js() {

    // Only on checkout

    if( is_checkout() && ! is_wc_endpoint_url() ):

    ?>

    <script type="text/javascript">

    jQuery( function($){

        if (typeof wc_checkout_params === 'undefined') 

            return false;


        var refresh = 'yes';


        $.ajax({

            type: "POST",

            url: wc_checkout_params.ajax_url,

            data: ({

                'action': 'updating_shipping',

                'refresh_shipping': refresh,


            }),

            success: function(response) {

                if( response === '1' ) {

                    $(document.body).trigger('update_checkout');

                    console.log('Success: '+response); // For testing (to be removed)

                } else {

                    console.log('Failled: '+response); // For testing (to be removed)

                }

            },

            error:function(error) {

                console.log('Error: '+error); // For testing (to be removed)

            }

        });

    });

    </script>

    <?php

    endif;

}


// function that gets the Ajax data

add_action( 'wp_ajax_updating_shipping', 'updating_shipping' );

add_action( 'wp_ajax_nopriv_updating_shipping', 'updating_shipping' );

function updating_shipping() {

    if ( isset($_POST['refresh_shipping']) && $_POST['refresh_shipping'] === 'yes' ){

        WC()->session->set('refresh_shipping', '1' );

    } else {

        WC()->session->set('refresh_shipping', '0' );

    }

    echo  WC()->session->get('refresh_shipping');

    die(); // Alway at the end (to avoid server error 500)

}


// Function that refresh session shipping methods data

add_action( 'woocommerce_checkout_update_order_review', 'refresh_shipping_methods', 10, 1 );

function refresh_shipping_methods( $post_data ){

    if ( WC()->session->get('refresh_shipping' ) === '1' ) {

        foreach ( WC()->cart->get_shipping_packages() as $package_key => $package ){

            WC()->session->set( 'shipping_for_package_' . $package_key, false );

        }

        WC()->cart->calculate_shipping();

    }

}