基于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
相关产品推荐
相关产品推荐

