WooCommerce:商品处于预售(backorder)状态时禁用加入购物车(Add to cart)按钮
解决WooCommerce预售商品禁用加入购物车按钮的问题
你的代码有两个关键问题导致它不起作用,我来帮你逐一修正:
问题1:错误调用属性而非方法
$product->is_on_backorder是错误写法——is_on_backorder()是WooCommerce产品对象的方法,必须加上括号才能正确调用它来判断商品是否处于预售状态。
问题2:钩子使用时机不当
你在自定义函数里动态添加woocommerce_is_purchasable过滤器,这个时机太晚了,过滤器可能已经执行完毕,所以不会生效。正确的做法是直接把判断逻辑挂到woocommerce_is_purchasable钩子上。
修正后的可用代码
function disable_add_to_cart_for_backorder( $purchasable, $product ) { // 检查当前商品是否处于预售状态 if ( $product->is_on_backorder() ) { $purchasable = false; } return $purchasable; } add_filter( 'woocommerce_is_purchasable', 'disable_add_to_cart_for_backorder', 10, 2 );
代码说明:
- 直接挂钩
woocommerce_is_purchasable过滤器,这个过滤器负责控制商品是否可购买,返回false就会自动禁用加入购物车按钮。 - 回调函数接收两个参数:
$purchasable(商品默认的可购买状态)和$product(当前产品对象)。 - 当检测到商品处于预售状态时,将
$purchasable设为false,从而关闭购买功能。
额外测试提示:
- 确保你的商品确实在WooCommerce后台开启了「允许预售」(在商品编辑页的「库存」选项中设置)。
- 如果使用了缓存插件,记得清除缓存后再测试效果。
- 若你有自定义产品模板,要确保模板使用了WooCommerce原生函数渲染加入购物车按钮,否则可能无法触发该逻辑。
内容的提问来源于stack exchange,提问作者Željko Ronta
相关产品推荐
相关产品推荐

