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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:09:28