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

WooCommerce产品页数量变更时显示含折扣规则的总价

解决WooCommerce产品页适配动态定价规则的实时总价计算问题

你的核心问题是原有代码直接使用产品原价计算,无法适配「Advanced Dynamic Pricing for WooCommerce」这类插件的数量阶梯折扣规则。因为动态定价的折扣逻辑是后端处理的,前端无法直接获取,所以需要改用AJAX实时请求对应数量的折扣单价,再计算总价。

以下是完整的修复代码:

/* 适配动态定价规则的产品页实时总价计算 */

// 注册AJAX回调(支持前台未登录用户访问)
add_action('wp_ajax_get_dynamic_product_price', 'get_dynamic_product_price_callback');
add_action('wp_ajax_nopriv_get_dynamic_product_price', 'get_dynamic_product_price_callback');

function get_dynamic_product_price_callback() {
    // 校验请求参数
    if (!isset($_POST['product_id']) || !isset($_POST['quantity'])) {
        wp_send_json_error('参数缺失');
    }

    $product_id = intval($_POST['product_id']);
    $quantity = intval($_POST['quantity']);

    // 获取产品对象
    $product = wc_get_product($product_id);
    if (!$product) {
        wp_send_json_error('产品不存在');
    }

    // 获取对应数量的折扣单价(自动触发动态定价插件的规则计算)
    $dynamic_price = $product->get_price('edit', array('qty' => $quantity));

    wp_send_json_success(array(
        'price' => $dynamic_price,
        'currency' => get_woocommerce_currency_symbol()
    ));
}

// 在加入购物车按钮下方渲染总价容器
add_action('woocommerce_after_add_to_cart_button', 'display_dynamic_total_price');

function display_dynamic_total_price() {
    global $product;
    echo '<div id="dynamic-subtotal" style="margin-top: 12px; font-size: 16px;">总价: <span id="subtotal-value"></span></div>';

    wc_enqueue_js("
        // 防抖函数,减少频繁AJAX请求
        function debounce(func, delay) {
            let timer;
            return function() {
                clearTimeout(timer);
                timer = setTimeout(func, delay);
            };
        }

        const updateTotal = debounce(function() {
            const qty = $('[name=quantity]').val();
            const productId = " . esc_js($product->get_id()) . ";

            // 显示加载状态
            $('#subtotal-value').text('加载中...');

            // 发送AJAX请求获取折扣价
            $.ajax({
                url: '" . admin_url('admin-ajax.php') . "',
                type: 'POST',
                data: {
                    action: 'get_dynamic_product_price',
                    product_id: productId,
                    quantity: qty
                },
                success: function(res) {
                    if (res.success) {
                        const total = (res.data.price * qty).toFixed(2);
                        $('#subtotal-value').text(res.data.currency + total);
                    } else {
                        $('#subtotal-value').text('计算失败');
                    }
                },
                error: function() {
                    $('#subtotal-value').text('计算失败');
                }
            });
        }, 250);

        // 绑定数量变化事件,初始化时自动触发一次
        $('[name=quantity]').on('input change', updateTotal).trigger('change');
    ");
}

关键说明:

  • AJAX后端计算:动态定价规则由插件在后端处理,前端无法直接获取,所以通过AJAX请求让后端返回对应数量的实际售价,确保适配所有定价规则(阶梯折扣、买赠、会员价等)。
  • 防抖优化:加入防抖函数避免用户快速调整数量时发送大量请求,提升页面性能。
  • 错误处理:添加加载状态和错误提示,避免用户看到空白或错误数值。

测试注意事项:

  1. 确保「Advanced Dynamic Pricing for WooCommerce」插件已激活且定价规则配置正确。
  2. 测试不同数量对应的总价是否符合设置的折扣规则,比如购买3件打8折的情况,调整数量到3时总价应自动按折扣价计算。
  3. 如果使用其他动态定价插件,只需确保后端$product->get_price()能正确返回对应数量的折扣价即可,核心逻辑无需改动。

内容的提问来源于stack exchange,提问作者Aleksandar Simov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:05:22