2017-10-15 48 views
1

我发现了一个函数,当物品的数量发生变化时它会自动更新购物车,并且它一直运行到WooCommerce的3.2.0更新(最新更新3.2.1)。我敢肯定,这东西代码内改变:WooCommerce Ajax购物车更新停止工作

add_action('woocommerce_cart_updated', 'wac_update'); 
function wac_update() { 
    // is_wac_ajax: flag defined on wooajaxcart.js 

    if (!empty($_POST['is_wac_ajax'])) { 
     $resp = array(); 
     $resp['update_label'] = __('Update Cart', 'woocommerce'); 
     $resp['price'] = 0; 

     // render the cart totals (cart-totals.php) 
     ob_start(); 
     do_action('woocommerce_after_cart_table'); 
     do_action('woocommerce_cart_collaterals'); 
     do_action('woocommerce_after_cart'); 
     $resp['html'] = ob_get_clean(); 

     // calculate the item price 
     if (!empty($_POST['cart_item_key'])) { 
      $items = WC()->cart->get_cart(); 
      $cart_item_key = $_POST['cart_item_key']; 

      if (array_key_exists($cart_item_key, $items)) { 
       $cart_item = $items[$cart_item_key]; 
       $_product = apply_filters('woocommerce_cart_item_product', $cart_item['data'], $cart_item, $cart_item_key); 
       $price = apply_filters('woocommerce_cart_item_subtotal', WC()->cart->get_product_subtotal($_product, $cart_item['quantity']), $cart_item, $cart_item_key); 
       $resp['price'] = $price; 
      } 
     } 

     echo json_encode($resp); 
     exit; 
    } 
} 

我的JavaScript仍在工作,但在这里是一个参考:

function refreshCart() { 
    jQuery('.cart-builder .qty').on('change', function(){ 
     var form = jQuery(this).closest('form'); 

     // emulates button Update cart click 
     jQuery("<input type='hidden' name='update_cart' id='update_cart' value='1'>").appendTo(form); 

     // plugin flag 
     jQuery("<input type='hidden' name='is_wac_ajax' id='is_wac_ajax' value='1'>").appendTo(form); 

     var el_qty = jQuery(this); 
     var matches = jQuery(this).attr('name').match(/cart\[(\w+)\]/); 
     var cart_item_key = matches[1]; 
     form.append(jQuery("<input type='hidden' name='cart_item_key' id='cart_item_key'>").val(cart_item_key)); 

     // get the form data before disable button... 
     var formData = form.serialize(); 

     jQuery("input[name='update_cart']").val('Updating...').prop('disabled', true); 

     jQuery.post(form.attr('action'), formData, function(resp) { 
       // ajax response 
       jQuery('.cart-collaterals').html(resp.html); 

       el_qty.closest('.cart_item').find('.product-subtotal').html(resp.price); 

       console.log(resp.test); 

       jQuery('#update_cart').remove(); 
       jQuery('#is_wac_ajax').remove(); 
       jQuery('#cart_item_key').remove(); 

       jQuery("input[name='update_cart']").val(resp.update_label).prop('disabled', false); 
      }, 
      'json' 
     ); 
    }); 
} 

我一直在寻找通过更改日志,https://github.com/woocommerce/woocommerce/blob/master/CHANGELOG.txt,但我找不到现在会发生什么冲突。就像我说的那样,在更新之前它完美地工作。

+0

您是否在控制台中看到任何javascript错误? –

+0

没有错误,并且我将每个响应添加到控制台日志中,并且所有内容都有工作属性。它只是似乎价格不更新 –

+0

这是在购物车页面是正确的吗?我正在研究它... –

回答

0

好的这里是一个更简单的解决方案,我只是将脚本附加到购物车页面的底部,但您也可以使用wp_enqueue_script函数对其进行排队,这是最好的方法。它所做的就是模拟按下更新购物车按钮。

function cart_update_qty_script() { 
    if (is_cart()) : 
     ?> 
     <script type="text/javascript"> 
      (function($){ 
       $(function(){ 
        $('div.woocommerce').on('change', '.qty', function(){ 
         $("[name='update_cart']").trigger('click'); 
        }); 
       }); 
      })(jQuery); 
     </script> 
     <?php 
    endif; 
} 

add_action('wp_footer', 'cart_update_qty_script'); 
+0

我不想使用此解决方案,因为正在使用的购物车模板不在实际购物车页面上,而是一个小部件。所以这样做会触发刷新而不是ajax。 –

相关问题