使用Cookie为WooCommerce购物车添加附加费 解决Cookie值不生效问题
问题排查解决步骤
1. 首先修复Cookie设置逻辑的缺陷
你当前的setcookie代码未指定路径、域名等参数,会导致Cookie仅在设置时的当前路径下生效,购物车/结算页路径不同自然无法读取。替换为如下代码:setcookie( "mileage", $distance_surcharge, time() + 36000, '/', $_SERVER['HTTP_HOST'], is_ssl() );
额外确认:setcookie执行前不能有任何HTML输出、空格等内容,否则会触发headers already sent错误,Cookie写入失败,可开启PHP debug模式排查该类错误。
2. 验证Cookie存储有效性
打开浏览器开发者工具-应用/存储面板,找到Cookie列表,确认:
- 存在名为
mileage的Cookie - 其值为纯数字,无多余空格、特殊字符
- 作用域、路径和你站点的购物车页匹配
- 过期时间未设置错误
3. 修正附加费计算逻辑的问题
$_COOKIE中取出的所有值默认都是字符串类型,WooCommerceadd_fee方法要求第二个参数为数值类型,直接传字符串会被解析为0导致不生效,同时可弃用过时的全局$woocommerce调用。替换你的函数代码如下:
add_action( 'woocommerce_cart_calculate_fees','gt21_add_mileage' ); function gt21_add_mileage() { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; if(isset($_COOKIE['mileage'])) { // 去除首尾空白后强制转换为浮点型,适配整数、小数两种费用格式 $fee = (float) trim($_COOKIE['mileage']); // 仅当费用大于0时添加,避免出现无效的0元附加费行 if ($fee > 0) { WC()->cart->add_fee( 'Extra Mileage Fee', $fee, true, 'standard' ); } } }
4. 排查缓存类影响
如果上述修改后仍不生效,检查站点是否开启了页面缓存、对象缓存、WooCommerce cart fragments缓存:
- 测试时先清空所有缓存,关闭缓存插件
- 可在附加费函数中增加日志输出,确认函数是否正常触发、读到的Cookie值具体是什么:
error_log('读取到的mileageCookie值:' . $_COOKIE['mileage'] . ',转换后费用:' . $fee);
输出内容可在PHP错误日志中查看,快速定位是Cookie读取失败还是值处理错误。
内容的提问来源于stack exchange,提问作者Eric Brockman
相关产品推荐
相关产品推荐

