函数 hide_payment_gateways_based_on_weight 的严重未捕获错误

CRITICAL Uncaught Error for function hide_payment_gateways_based_on_weight

尽管该功能在前端似乎完美运行,但在后端我有:

CRITICAL Uncaught Error: Call to a member function get_cart_contents_weight() on null in........

这是函数。

add_filter( 'woocommerce_available_payment_gateways', 'hide_payment_gateways_based_on_weight', 10, 1 );
    function hide_payment_gateways_based_on_weight( $available_gateways ) { 
        if ( is_admin() ) 
            return $available_gateways; 
    
        $total_weight = WC()->cart->get_cart_contents_weight();
        if ( $total_weight >= 2000 && isset ($available_gateways['cod']) )
            
            unset($available_gateways['cod']); // unset 'cod'
            return $available_gateways;         
     }

$WC_Cart = new WC_Cart();
$total_weight  = $WC_Cart->get_cart_contents_weight();

试试这样的重量。

第一个顺序问题是WC()->cart中的cart不是defined/null。在尝试获得重量之前,您应该检查是否已定义。为什么 cart 为 null 是一个二阶问题,我们无法使用此代码片段真正确定。这可能只是正常的未初始化情况或其他问题。

您的函数向管理员抛出严重错误的原因是因为 WC 管理员中没有购物车。使用 is_admin() 在 WC 管理员中不起作用,因此您的 $total_weight 声明会引发错误。

为确保您只在购物车或结账时显示网关,请使用这些条件。

另外,不管它值多少钱...WPCS 和 PHPCS 不喜欢内联控件。为了更清晰的可读性,您应该将 if 语句括在括号中。

add_filter( 'woocommerce_available_payment_gateways', 'hide_payment_gateways_based_on_weight', 10, 1 );
function hide_payment_gateways_based_on_weight( $available_gateways ) {
    // Check if it's the cart page or the checkout.
    if ( is_cart() || is_checkout() ) {
        $total_weight = WC()->cart->get_cart_contents_weight();
        if ( 2000 >= $total_weight && isset( $available_gateways['cod'] ) ) {
            unset( $available_gateways['cod'] ); // unset 'cod'.
        }
    }
    return $available_gateways;
}