ajax 添加商品后,WooCommerce 购物迷你车未更新

时间:2021-06-24 08:48:36

标签: php ajax wordpress woocommerce

我使用 AJAX 将多个有数量的商品添加到购物车。 添加产品后,迷你购物车没有更新,但 WC_AJAX :: get_refreshed_fragments () 在 function.php 中被调用,我有一个钩子来更新购物车 woocommerce_add_to_cart_fragments。 如何强制更新迷你购物车或此代码中需要修复的内容。

JS

productsToAdd // array with id and quantity

$(document).on('click', '.buy-tovar', function (e) {
    e.preventDefault();         
    productsToAdd.forEach(function(item){
        var data = {
            action: 'woocommerce_ajax_add_to_cart',
            product_id: item['id'],
            quantity:  item['quantity']
        };
        $.ajax({
            type: 'post',
            url: wc_add_to_cart_params.ajax_url,
            data: data,
            async: false,
            success: function (response) {
                $('.buy-tovar').addClass("added");                      
            },
        });

    }); 
});

PHP

add_filter( 'woocommerce_add_to_cart_fragments', 'woocommerce_header_add_to_cart_fragment' );
function woocommerce_header_add_to_cart_fragment( $fragments ) {
    ob_start(); 
    ?>
    <a href="<?php echo wc_get_cart_url(); ?>" class="cart">
        <div class="img-block">
            <img src="<?php echo get_template_directory_uri();?>/image/cart.png" alt="">
            <span><?php echo count( WC()->cart->get_cart()); ?></span>
        </div>
    </a>
    <?php   
    $fragments['a.cart'] = ob_get_clean(); 
    
    return $fragments;
}

//AJAX 
add_action('wp_ajax_woocommerce_ajax_add_to_cart', 'woocommerce_ajax_add_to_cart');
add_action('wp_ajax_nopriv_woocommerce_ajax_add_to_cart', 'woocommerce_ajax_add_to_cart');

function woocommerce_ajax_add_to_cart() {
    
    $product_id = apply_filters('woocommerce_add_to_cart_product_id', absint($_POST['product_id']));
    $quantity = absint($_POST['quantity']);
    $passed_validation = apply_filters('woocommerce_add_to_cart_validation', true, $product_id, $quantity);
    $product_status = get_post_status($product_id);
    
    

    if ($passed_validation && WC()->cart->add_to_cart($product_id, $quantity) && 'publish' === $product_status) {

        do_action('woocommerce_ajax_added_to_cart', $product_id);

        if ('yes' === get_option('woocommerce_cart_redirect_after_add')) {
            wc_add_to_cart_message(array($product_id => $quantity), true);
        }
        
         WC_AJAX::get_refreshed_fragments();
    } else {

        $data = array(
            'error' => true,
            'product_url' => apply_filters('woocommerce_cart_redirect_after_error', get_permalink($product_id), $product_id));

        echo wp_send_json($data);
    }

    wp_die();
} 

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案,我在 JS 中添加了该行:

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

完整代码JS

document).on('click', '.buy-tovar', function (e) {
    e.preventDefault();         
    productsToAdd.forEach(function(item){
        var data = {
            action: 'woocommerce_ajax_add_to_cart',
            product_id: item['id'],
            quantity:  item['quantity']
        };
        $.ajax({
            type: 'post',
            url: wc_add_to_cart_params.ajax_url,
            data: data,
            async: false,
            success: function (response) {
                $('.buy-tovar').addClass("added");
                $(document.body).trigger('wc_fragment_refresh');
            },
        });

    }); 
});