Showing posts with label Shipping option update on cart and checkout page using ajax. Show all posts
Showing posts with label Shipping option update on cart and checkout page using ajax. Show all posts

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();

    }

}