Update cart with WooCommerce ajax

38,198

Solution 1

You have forget this essential process:

add_action('wp_enqueue_scripts', 'add_my_ajax_scripts'); 

function add_my_ajax_scripts() {
    // Here you register your script located in a subfolder `js` of your active theme
    wp_enqueue_script( 'ajax-script', get_template_directory_uri().'/js/script.js', array('jquery'), '1.0', true );
    // Here you are going to make the bridge between php and js
    wp_localize_script( 'ajax-script', 'cart_ajax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
}

Then you will retrieve "ajaxurl" and "cart_ajax" in your javascript file in "url:":

$.ajax({
  url: cart_ajax.ajaxurl,
  ...
})

Your javascript function will not work. Here are some functional examples of what you need to do:

Solution 2

Since WooCommerce 2.6.0, released June 2016, WooCommerce cart page uses Ajax to update cart totals after clicking on Update cart button.

It's no longer needed to create your own Ajax call, the one assigned to Update cart button can be used.

I created a free plugin Ajax Cart AutoUpdate for WooCommerce which updates cart page and mini cart after changing product quantity and provides some customization options for this process.

The most important thing is to set update delay. If user changes quantity again during this delay, it will be reset to full duration. If it's not implemented and you change quantity from 1 to 10 by clicking on increment button, it will trigger 9 Ajax calls instead of 1.

JQuery code is below, I suggest placing it in js file and enqueuing in dependency with jQuery, then it works with jQuery deferred:

var timeout;

jQuery('div.woocommerce').on('change keyup mouseup', 'input.qty', function(){ // keyup and mouseup for Firefox support
    if (timeout != undefined) clearTimeout(timeout); //cancel previously scheduled event
    if (jQuery(this).val() == '') return; //qty empty, instead of removing item from cart, do nothing
    timeout = setTimeout(function() {
        jQuery('[name="update_cart"]').trigger('click');
    }, 1000 );
});
Share:
38,198
Stone
Author by

Stone

Updated on May 12, 2020

Comments

  • Stone
    Stone almost 4 years

    In my woocommerce website, I have changed the cart page, removed the button "update cart" and create 2 buttons to add and remove items of product like I show in this picture:

    enter image description here

    When I click on the quantity buttons I want to call the same function if I press the button to update the cart.

    For this I am using ajax but it doesn't do anything.

    First in my function.php file I have this:

      function update_my_cart() {
        // here update then cart
        var_dump("execute");
      }
      add_action( 'wp_ajax_update_my_cart', 'update_my_cart' );    // If called from admin panel
      add_action( 'wp_ajax_nopriv_update_my_cart', 'update_my_cart' );  
    
    
    
        add_action( 'wp_enqueue_scripts', 'rct_enqueue_scripts' );
    
        if ( ! function_exists( 'rct_enqueue_scripts' ) ) :
    
        function rct_enqueue_scripts() {
        wp_enqueue_script( 'rct-js', get_template_directory_uri() . '/js/themeCoffee.js', array(), '1.0', true );
        wp_localize_script('rct-js', 'ajax_object', array('ajax_url' => admin_url( 'admin-ajax.php' )));
        }
    
        endif;
    

    And in my jquery file I have this:

      updatecart = function(qty) {
        var currentVal, data, item_hash, request;
        currentVal = void 0;
        data = void 0;
        item_hash = void 0;
        currentVal = parseFloat(qty);
        request = $.ajax({
          url: 'ajax_object.ajax_url',
          method: 'POST',
          data: {
            quantity: currentVal,
            action: 'update_my_cart'
          },
          dataType: 'html'
        });
        request.done(function(msg) {
          alert('cart update ');
        });
        request.fail(function(jqXHR, textStatus) {
          alert('Request failed: ' + textStatus);
        });
      };   
    

    I obtain this error:

    Failed to load resource: the server responded with a status of 404 (Not Found)
    

    Because I try to load my_website/cart/ajax_object.ajax_url.

    Thanks in advance!

  • Gaurav
    Gaurav over 2 years
    this works only on the cart page and not on any other page if you built cart by your self