You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WooCommerce woocommerce_add_to_cart_fragments返回错误片段 自定义购物车无法自动刷新

问题根因排查及修复方案

核心问题1:AJAX接口返回内容不符合要求

你当前的ajax_my_cart_qty方法在更新购物车数量后,直接输出了购物车短代码的完整HTML,没有返回WooCommerce要求的fragments和cart_hash结构,导致前端触发added_to_cart事件时拿不到你自定义的片段数据。

核心问题2:PHP短标签兼容问题

你的模板循环末尾用的是<? endforeach; ?>,部分PHP环境没有开启短标签支持,会导致片段渲染失败,建议统一用完整PHP标签。

核心问题3:默认片段优先级冲突

如果主题/其他插件也注册了迷你购物车片段,可能存在优先级覆盖,调高你自定义片段的钩子优先级即可解决。

修复后的完整代码

1. 替换functions.php中的ajax_my_cart_qty方法

function ajax_my_cart_qty() {
    $cart_item_key = $_POST['cart_item_key'];
    $quantity = $_POST['quantity'];

    $threeball_product_values = WC()->cart->get_cart_item( $cart_item_key );
    $threeball_product_quantity = apply_filters( 'woocommerce_stock_amount_cart_item', apply_filters( 'woocommerce_stock_amount', preg_replace( "/[^0-9\.]/", '', filter_var($_POST['quantity'], FILTER_SANITIZE_NUMBER_INT)) ), $cart_item_key );
    $passed_validation  = apply_filters( 'woocommerce_update_cart_validation', true, $cart_item_key, $threeball_product_values, $threeball_product_quantity );

    if ( $passed_validation ) {
        WC()->cart->set_quantity( $cart_item_key, $threeball_product_quantity, true );
    }

    // 新增:返回标准fragments结构
    $fragments = apply_filters( 'woocommerce_add_to_cart_fragments', array() );
    $cart_hash = WC()->cart->get_cart_hash();
    
    wp_send_json( array(
        'fragments' => $fragments,
        'cart_hash' => $cart_hash
    ) );

    die();
}

2. 调整ajaxify_components方法的兼容性和优先级

把钩子优先级从10调整为99,确保后执行覆盖默认片段,同时替换短标签:

// 优先级调整为99,避免被其他代码覆盖
add_filter( 'woocommerce_add_to_cart_fragments', 'ajaxify_components', 99, 1 );
function ajaxify_components( $fragments ) {
    ob_start();
?>
<div class="cart-items" id="cart-items">
    <?php foreach(WC()->cart->get_cart() as $cart_item_key => $cart_item) : ?>
    <div class="cart-item">
        <?php echo $cart_item['data']->get_image(); ?>
        <div>
            <h3><?php echo $cart_item['data']->get_title() ?></h3>
            <div class="quantity">
                <input type="number" class="input-text qty text" step="1" min="0" max=""
                    name="cart[<?php echo $cart_item_key ?>][qty]" value="<?php echo $cart_item['quantity']  ?>"
                    title="Qty" size="4" placeholder="" inputmode="numeric">
            </div>
            <div class="price"><?php echo $cart_item['data']->get_price_html() ?></div>
        </div>
    </div>
    <div class="divider"></div>
    <?php endforeach; ?> <!-- 替换为完整PHP标签 -->
</div>
<?php
    $fragments['#cart-items'] = ob_get_clean();
    return $fragments;
}

3. 可选JS优化(兼容响应解析)

如果你的AJAX请求没有指定返回JSON格式,建议在AJAX配置里加dataType: 'json',避免解析失败:

jQuery(function ($) {
  $(document).on("change", "input.qty", function () {
    var $thisbutton = $(this);
    var cart_item_key = $(this)
      .attr("name")
      .replace(/cart\[([\w]+)\]\[qty\]/g, "$1");
    var item_quantity = $(this).val();
    var currentVal = parseFloat(item_quantity);

    $.ajax({
      type: "POST",
      url: cart_qty_ajax.ajax_url,
      dataType: 'json', // 新增指定JSON返回格式
      data: {
        action: "my_cart_qty",
        cart_item_key: cart_item_key,
        quantity: currentVal,
      },
      success: function (response) {
        jQuery(document.body).trigger("added_to_cart", [response.fragments, response.cart_hash, $thisbutton]);
      },
    });
  });
});

内容的提问来源于stack exchange,提问作者Rasmus Lian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 05:00:04