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

Woocommerce结账页面动态自定义价格无法更新求助

WooCommerce结账页动态价格AJAX重置问题解决办法

问题根源

  1. AJAX请求被错误拦截:原代码里的if (is_admin() && defined('DOING_AJAX')) return;逻辑有问题——结账页的价格更新属于前台AJAX操作,不是后台的,但这个条件会让所有AJAX请求直接返回,导致AJAX触发时没重新设置价格,最终价格被重置为0。
  2. Session变量没做校验:直接用$_SESSION["total"],要是Session里没这个值或者值无效,价格就会变成0。
  3. Session在AJAX中可能未初始化:部分情况下,WooCommerce的AJAX请求没自动启动Session,导致读不到你存的动态价格。

解决步骤

1. 先确保Session全局可用

添加这段代码,让前台和AJAX请求都能正常访问Session:

add_action('init', 'init_custom_session');
function init_custom_session() {
    if (!session_id()) {
        session_start();
    }
}

2. 修改钩子函数的逻辑

调整判断条件,允许前台AJAX执行价格设置,同时给Session变量加校验:

add_action('woocommerce_before_calculate_totals', 'custom_product_quantity_discounter', 10, 1);
function custom_product_quantity_discounter($cart) {
    // 只拦截后台的AJAX请求,前台AJAX正常执行
    if (is_admin() && defined('DOING_AJAX') && DOING_AJAX) {
        return;
    }

    // 防止钩子重复执行引发问题
    if (did_action('woocommerce_before_calculate_totals') >= 2) {
        return;
    }

    // 校验Session值是否合法,不合法就不修改价格
    if (!isset($_SESSION["total"]) || !is_numeric($_SESSION["total"]) || $_SESSION["total"] < 0) {
        return;
    }

    $custom_price = (float)$_SESSION["total"];

    // 给购物车每个商品设置自定义价格
    foreach ($cart->get_cart() as $cart_item) {
        $cart_item['data']->set_price($custom_price);
    }
}

3. 额外要注意的点

  • 你得确保$_SESSION["total"]是在用户操作后正确设置的(比如表单提交、JS计算后通过AJAX写入Session),而且必须是合法的数字。
  • 如果网站开了页面缓存,要把结账页排除在缓存外,不然动态价格没法实时更新。
  • 测试结账页的各种AJAX操作(比如改数量、加优惠券、选配送方式),确认价格不会再被重置。

内容的提问来源于stack exchange,提问作者Bhaskar Garibidi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 02:52:33