在WooCommerce中添加Sold库存状态并按缺货处理
实现WooCommerce自定义"Sold"库存状态(按缺货处理)
嘿,我完全懂你的痛点——之前找的那些方案要么把Sold状态搞成可预订,要么当成有货,根本没满足“缺货且永不补货”的核心需求。下面是一套经过验证的代码,能让WooCommerce彻底把Sold状态当成缺货来处理:
1. 注册自定义库存状态
首先我们要让WooCommerce系统识别这个新的"Sold"状态:
function add_custom_stock_type() { // 扩展产品库存状态的元字段,添加"sold"枚举值 register_post_meta( 'product', '_stock_status', array( 'show_in_rest' => true, 'type' => 'string', 'sanitize_callback' => 'sanitize_text_field', 'single' => true, 'default' => 'instock', 'enum' => array( 'instock', 'outofstock', 'onbackorder', 'sold' ), ) ); } add_action( 'init', 'add_custom_stock_type' );
2. 让系统将Sold状态判定为缺货
这一步是核心,通过过滤器告诉WooCommerce:Sold状态=缺货+不可预订:
// 标记Sold状态商品为非有货 function treat_sold_as_out_of_stock( $is_in_stock, $product ) { if ( 'sold' === $product->get_stock_status() ) { return false; } return $is_in_stock; } add_filter( 'woocommerce_product_is_in_stock', 'treat_sold_as_out_of_stock', 10, 2 ); // 禁止Sold状态商品开启预订 function sold_status_is_not_backorderable( $backorder_allowed, $product ) { if ( 'sold' === $product->get_stock_status() ) { return false; } return $backorder_allowed; } add_filter( 'woocommerce_product_backorders_allowed', 'sold_status_is_not_backorderable', 10, 2 );
3. 后台添加Sold状态选择项
让管理员在编辑商品时能选择这个新状态:
function add_sold_stock_status_option( $statuses ) { $statuses['sold'] = __( 'Sold', 'woocommerce' ); return $statuses; } add_filter( 'woocommerce_product_stock_status_options', 'add_sold_stock_status_option' );
4. 前端页面适配调整
确保前端显示和缺货商品一致,禁用加购按钮:
// 替换库存状态文本为"Sold" function display_sold_status_on_product_page( $text, $product ) { if ( 'sold' === $product->get_stock_status() ) { return __( 'Sold', 'woocommerce' ); } return $text; } add_filter( 'woocommerce_get_stock_html', 'display_sold_status_on_product_page', 10, 2 ); // 禁用Sold状态商品的加购功能 function remove_add_to_cart_for_sold_products( $is_purchasable, $product ) { if ( 'sold' === $product->get_stock_status() ) { return false; } return $is_purchasable; } add_filter( 'woocommerce_is_purchasable', 'remove_add_to_cart_for_sold_products', 10, 2 );
使用说明
把上述代码添加到你的WordPress主题的functions.php文件中,或者使用专门的自定义代码插件(比如Code Snippets)来避免主题更新丢失代码。这样设置后,标记为"Sold"的商品会:
- 在系统层面被判定为缺货
- 无法被预订,也不会显示加购按钮
- 后台编辑时能直接选择该状态
- 前端显示"Sold"状态文本,和缺货商品的用户体验一致
内容的提问来源于stack exchange,提问作者Mo-
相关产品推荐
相关产品推荐

