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

WooCommerce预订类产品隐藏配送方式失败且触发致命错误求助

解决WooCommerce预订产品隐藏配送方式及致命错误问题

致命错误原因

你遇到的Uncaught Error: Call to a member function get_cart() on null错误,是因为后台页面不存在购物车(WC()->cart)对象,原来的代码没做前置判断,直接调用WC()->cart->get_cart()导致空对象报错。

修复后的完整代码

将以下代码替换你原来的片段,添加到子主题的functions.php文件中:

// 1. 移除购物车/结账页面的配送方式(仅当购物车全为预订产品时)
add_filter( 'woocommerce_package_rates', 'hide_shipping_for_booking_products', 10, 2 );
function hide_shipping_for_booking_products( $rates, $package ) {
    // 仅在前台购物车/结账页面执行,避免后台报错
    if ( ! is_cart() && ! is_checkout() ) {
        return $rates;
    }

    // 检查购物车是否全为预订产品
    $all_booking = true;
    foreach ( WC()->cart->get_cart() as $item ) {
        if ( $item['data']->get_type() !== 'booking' ) {
            $all_booking = false;
            break;
        }
    }

    // 如果全是预订产品,清空所有配送方式
    if ( $all_booking ) {
        return array();
    }

    return $rates;
}

// 2. 隐藏结账页面的配送信息区域
add_action( 'woocommerce_checkout_init', 'remove_checkout_shipping_section' );
function remove_checkout_shipping_section() {
    if ( ! WC()->cart ) return; // 提前判断购物车是否存在

    $all_booking = true;
    foreach ( WC()->cart->get_cart() as $item ) {
        if ( $item['data']->get_type() !== 'booking' ) {
            $all_booking = false;
            break;
        }
    }

    if ( $all_booking ) {
        remove_action( 'woocommerce_checkout_shipping', 'woocommerce_checkout_shipping' );
    }
}

// 3. 隐藏订单邮件中的配送信息
add_filter( 'woocommerce_email_order_meta_fields', 'remove_shipping_from_order_emails', 10, 3 );
function remove_shipping_from_order_emails( $fields, $sent_to_admin, $order ) {
    // 检查订单是否全为预订产品
    $all_booking = true;
    foreach ( $order->get_items() as $item ) {
        if ( $item->get_product()->get_type() !== 'booking' ) {
            $all_booking = false;
            break;
        }
    }

    if ( $all_booking ) {
        // 移除配送相关字段
        unset( $fields['_shipping_method'] );
        // 若有其他配送字段,可继续unset
    }

    return $fields;
}

代码说明

  • 所有操作都做了前置判断:仅在需要的场景(前台购物车/结账、订单邮件)执行,避免后台调用购物车对象导致报错。
  • 仅当购物车/订单**所有产品都是预订类型(booking)**时,才隐藏配送方式,兼容混合产品场景。
  • 覆盖了购物车页面、结账页面、订单邮件三个场景的配送信息隐藏需求。

注意事项

  • 若使用代码片段插件(如Code Snippets)添加代码,比直接修改functions.php更安全,避免主题更新丢失。
  • 添加代码后,需清空WooCommerce缓存(WooCommerce > 系统状态 > 工具 > 清除缓存),确保配送方式设置生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 04:55:17