请求实现:WooCommerce购物车含虚拟商品时隐藏配送方式
解决WooCommerce含虚拟商品即隐藏配送方式的问题
默认情况下,WooCommerce仅在购物车全为虚拟商品时才隐藏配送方式。要实现只要购物车包含至少一件虚拟商品(无论是否有实体商品)就隐藏配送方式,你之前的代码未生效是因为只修改了配送地址的需求判断,而配送方式的显示逻辑主要由woocommerce_cart_needs_shipping钩子控制。
以下是修正后的代码:
// 控制购物车是否需要配送 add_filter( 'woocommerce_cart_needs_shipping', 'hide_shipping_when_virtual_product_present' ); // 控制是否需要配送地址(配套修改,避免地址字段残留) add_filter( 'woocommerce_cart_needs_shipping_address', 'hide_shipping_when_virtual_product_present' ); function hide_shipping_when_virtual_product_present( $needs_shipping ) { // 遍历购物车所有商品 foreach ( WC()->cart->get_cart() as $cart_item ) { // 检查当前商品是否为虚拟商品 if ( $cart_item['data']->is_virtual() ) { return false; // 存在虚拟商品,返回不需要配送 } } return $needs_shipping; // 无虚拟商品,保留默认配送逻辑 }
代码说明
- 同时挂钩
woocommerce_cart_needs_shipping和woocommerce_cart_needs_shipping_address两个关键过滤器,确保配送方式和配送地址字段都被正确隐藏。 - 遍历购物车商品时,只要发现一件虚拟商品就立即返回
false,终止循环提升效率。 - 无虚拟商品时,保留WooCommerce原有的配送判断逻辑,正常显示配送方式。
注意事项
- 将代码添加到当前主题的
functions.php文件,或使用自定义代码插件(如Code Snippets),避免主题更新导致代码丢失。 - 测试前清空购物车并清除浏览器缓存,或使用无痕模式访问,避免WooCommerce购物车缓存影响测试结果。
- 若站点使用缓存插件,需先清除插件缓存再测试。
内容的提问来源于stack exchange,提问作者user15284871
相关产品推荐
相关产品推荐

