Woocommerce结账页面动态自定义价格无法更新求助
WooCommerce结账页动态价格AJAX重置问题解决办法
问题根源
- AJAX请求被错误拦截:原代码里的
if (is_admin() && defined('DOING_AJAX')) return;逻辑有问题——结账页的价格更新属于前台AJAX操作,不是后台的,但这个条件会让所有AJAX请求直接返回,导致AJAX触发时没重新设置价格,最终价格被重置为0。 - Session变量没做校验:直接用
$_SESSION["total"],要是Session里没这个值或者值无效,价格就会变成0。 - 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
相关产品推荐
相关产品推荐

