COD支付方式额外费用前端不显示,仅管理员登录时生效
解决COD支付方式额外费用仅管理员生效的问题
问题原因分析
ICL_LANGUAGE_CODE变量未正确加载:该变量在前端未登录状态下可能未被WPML初始化,导致外层判断条件不成立,woocommerce_cart_calculate_fees钩子根本没被添加,费用计算逻辑无法执行。- Session变量访问不安全:直接访问
WC()->session->chosen_payment_method,在未登录用户Session未完全初始化时可能获取不到值。 - 代码结构不合理:将函数
cod_fee定义在if条件内部,可能引发函数加载优先级或重定义问题。
修复后的代码
// 添加COD支付方式额外费用 add_action( 'woocommerce_cart_calculate_fees', 'cod_fee' ); function cod_fee() { // 仅针对捷克语站点生效 if ( function_exists('wpml_get_current_language') && wpml_get_current_language() !== 'cs' ) { return; } // 后台非AJAX请求直接返回 if ( is_admin() && ! defined( 'DOING_AJAX' ) ) { return; } // 安全获取选中的支付方式 $chosen_gateway = WC()->session ? WC()->session->get('chosen_payment_method') : ''; $fee = 17; if ( $chosen_gateway === 'cod' ) { WC()->cart->add_fee( '配送费', $fee, false, '' ); } } // 切换支付方式时刷新结算页面 add_action( 'woocommerce_checkout_init', 'payment_methods_refresh_checkout' ); function payment_methods_refresh_checkout() { wc_enqueue_js( "jQuery( function($){ $('form.checkout').on('change', 'input[name=payment_method]', function(){ $(document.body).trigger('update_checkout'); }); });" ); }
关键修复点说明
- 替换语言检测方式:用
wpml_get_current_language()替代ICL_LANGUAGE_CODE,该函数在前端未登录状态下也能正确返回当前语言,同时增加function_exists检查避免WPML未启用时出错。 - 调整代码结构:将钩子注册与函数定义分离,确保钩子始终被注册,再在函数内部做语言判断,避免钩子未加载的问题。
- 安全访问Session:先检查
WC()->session是否存在,再用get()方法获取支付方式,避免未登录用户Session未初始化时出现错误。
内容的提问来源于stack exchange,提问作者Yordan Kostadinov
相关产品推荐
相关产品推荐

