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

