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

基于URL查询变量为WooCommerce购物车总额添加附加费的问题

问题分析与解决

核心问题1:错误使用esc_attr()做值匹配

你代码里用esc_attr($_GET['diet'])和'Nutritionist'做比较是错误的。esc_attr()是用来转义HTML属性的函数,并非清理URL查询参数的工具,即便当前值是纯文本,也可能因函数的转义逻辑导致匹配失败。正确的做法是用sanitize_text_field()处理$_GET变量,这个函数专门用于清理文本输入,适合验证URL参数值。

核心问题2:URL参数易在购物车操作后丢失

用户在购物车页面执行更新数量、修改商品等操作时,URL里的diet参数会被清空,后续计算费用时就获取不到参数,导致附加费失效。因此需要把参数值存入WooCommerce会话,确保跨页面操作时依然能读取到该值。

修正后的代码

// 捕获diet参数并存入会话
add_action('template_redirect', 'save_nutritionist_session');
function save_nutritionist_session() {
    if (isset($_GET['diet'])) {
        $diet_value = sanitize_text_field($_GET['diet']);
        WC()->session->set('diet_type', $diet_value);
    }
}

// 添加营养师附加费
add_action('woocommerce_cart_calculate_fees', 'custom_nutritionist_fee');
function custom_nutritionist_fee() {
    // 从会话读取diet值,替代直接读取URL参数
    $diet_type = WC()->session->get('diet_type');
    
    if ($diet_type === 'Nutritionist') {
        $percentage = 0.25;
        // 若需包含税费,可改用get_cart_total()替代当前合计逻辑
        $cart_total = WC()->cart->get_cart_contents_total() + WC()->cart->get_shipping_total();
        $percentage_fee = $cart_total * $percentage;
        
        WC()->cart->add_fee(__('Nutritionist Fees', 'txtdomain'), $percentage_fee);
    }
}

额外补充

  • 若只需在购物车或结算页触发参数保存,可在save_nutritionist_session里添加页面判断:if ((is_cart() || is_checkout()) && isset($_GET['diet']))。
  • 如需在用户清空购物车、移除商品时清除会话中的diet值,可添加钩子:
    add_action('woocommerce_cart_emptied', 'clear_nutritionist_session');
    add_action('woocommerce_remove_cart_item', 'clear_nutritionist_session');
    function clear_nutritionist_session() {
        WC()->session->__unset('diet_type');
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 21:17:01