WooCommerce样品站:价格为空时显示加入购物车按钮及数量字段
解决WooCommerce价格为空时显示加入购物车按钮及数量字段的方案
我完全懂你的需求——搭建一个只提供免费样品的WooCommerce站点,不想每次编辑产品都手动输入0价格,就想让价格字段空着的时候,自动显示数量选择器和加入购物车按钮,同时不用显示价格(毕竟是免费样品)。下面给你两个可行方案,优先推荐第一个直接改前端逻辑的方案:
优先方案:修改价格为空时的前端显示逻辑
WooCommerce默认会在价格为空时隐藏加购相关元素,我们可以通过几个钩子来覆盖这个判断,让系统把"空价格"当成"免费(0元)"处理,同时隐藏价格显示,直接上代码:
// 让空价格的产品变为可购买状态,触发加购按钮显示 add_filter( 'woocommerce_is_purchasable', 'make_empty_price_purchasable', 10, 2 ); function make_empty_price_purchasable( $purchasable, $product ) { if ( '' === $product->get_price() ) { $purchasable = true; } return $purchasable; } // 强制显示数量输入框(针对简单产品),还能限制领取数量 add_filter( 'woocommerce_quantity_input_args', 'show_quantity_input_for_empty_price', 10, 2 ); function show_quantity_input_for_empty_price( $args, $product ) { if ( '' === $product->get_price() ) { $args['min_value'] = 1; // 最少领1份 $args['max_value'] = 5; // 最多领5份,可按需调整 $args['input_value'] = 1; // 默认选中1份 } return $args; } // 隐藏默认价格显示,换成自定义的免费样品提示 add_action( 'woocommerce_single_product_summary', 'hide_price_for_empty_price_products', 1 ); function hide_price_for_empty_price_products() { global $product; if ( '' === $product->get_price() ) { remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 ); echo '<p class="free-sample-notice" style="color: #2ecc71; font-weight: bold;">✅ 免费样品,无需付费</p>'; } } // 后台自动将空价格转为0,确保购物车/结算流程无异常 add_filter( 'woocommerce_product_get_price', 'set_empty_price_to_zero', 10, 2 ); function set_empty_price_to_zero( $price, $product ) { if ( '' === $price ) { $price = 0; } return $price; }
代码说明:
- 第一个钩子
woocommerce_is_purchasable:告诉WooCommerce"空价格的产品是可以购买的",这样加购按钮就会显示出来 - 第二个钩子
woocommerce_quantity_input_args:强制显示数量输入框,还能限制用户最多领多少份样品,避免过度申请 - 第三个钩子:把默认的价格模块去掉,换成更友好的免费提示文本,样式可以自己调整
- 第四个钩子:在后台把空价格转换成0,确保购物车和结算环节不会出现价格异常
替代方案:后台自动给空价格产品填充0价格
如果你不想改前端逻辑,也可以让系统在你保存产品时,自动把空的价格和常规价格设为0,这样就利用WooCommerce原生的0价格显示逻辑,效果和手动输入0一样:
// 保存产品时自动将空价格设置为0 add_action( 'woocommerce_admin_process_product_object', 'auto_set_empty_price_to_zero' ); function auto_set_empty_price_to_zero( $product ) { if ( '' === $product->get_price() ) { $product->set_price( 0 ); $product->set_regular_price( 0 ); } }
注意事项:
- 代码建议放在子主题的
functions.php里,或者用Code Snippets这类自定义代码插件,别直接改父主题,不然主题更新会丢代码 - 如果你的样品是可变产品(比如有不同规格),需要调整代码针对每个变体处理,有需求的话可以再问我
- 所有参数都可以按需修改,比如数量限制、提示文本的样式和内容,完全适配你的站点风格
内容的提问来源于stack exchange,提问作者Jonathan Ryan Patterson
相关产品推荐
相关产品推荐

