WooCommerce Ajax购物车更新停止工作

时间:2017-10-15 23:17:49

标签: javascript php ajax wordpress woocommerce

我找到了一个功能,可以在项目数量发生变化时自动更新购物车,并且在WooCommerce的3.2.0更新(最新更新3.2.1)之前一直有效。我很确定在这段代码中发生了一些变化:

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,但我找不到现在会发生冲突的内容。就像我说的那样,它在更新之前完美运行。

1 个答案:

答案 0 :(得分:0)

好的,这是一个更简单的解决方案,我只是将一个脚本添加到购物车页面的底部,但您也可以使用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' ); 函数将其排队,这是最好的方法。它只是模拟按下更新购物车按钮。

$dbUser="root";
$dbPassword="root";
$dbServer="localhost:8889";
$dbName="test_database";

$connection = new mysqli($dbServer, $dbUser, $dbPassword, $dbName);


if($connection->connect_errno)
{
    exit("Database Connection Failed. Reason: ".$connection->connect_error);
}else{
    echo "Connection successful..;
}

$query = "SELECT id,first_name,last_name FROM Author where user_id= XXXX ";
$resultObj = $connection->query($query);

if ($resultObj->num_rows > 0) 
{
    while ($singleRowFromQuery = $resultObj->fetch_array()) 
    {
        print_r($singleRowFromQuery);
        echo "Author: ".$singleRowFromQuery['first_name'].PHP_EOL."<br>";
    }
}


$resultObj->close();
$connection->close();