You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将指定SKU及属性的WooCommerce变体状态从outofstock改为onbackorder

如何将指定WooCommerce变体从缺货改为预售状态

需求:通过SKU、属性名及属性值,把Variable Product的指定Variation状态从outofstock改为onbackorder(支持预售),目标变体信息如下:

sku = 'TEST-001';
attribute_name = 'pa_size';
value = '35';

先看你提供的代码,逻辑方向是对的,但存在局限,下面详细说明:


你的代码问题分析

你用woocommerce_available_variation过滤器修改前端变体数据的思路没问题,但只设置$data['backorders'] = 'yes'不够:

  1. 仅修改前端显示,不会改动后台变体的实际设置,后台依然显示缺货状态;
  2. 缺少库存状态和购买权限的调整,前端可能还是显示缺货,用户无法下单。

修正方案

方案1:前端临时生效(不修改后台)

如果只是想让前端显示预售、允许用户下单,不改动后台设置,用下面的代码:

add_filter( 'woocommerce_available_variation', 'enable_backorders_for_variation', 10, 3 );
function enable_backorders_for_variation( $data, $product, $variation ) {
    $sku_to_find = 'TEST-001';
    $attribute_name = 'pa_size';
    $target_value = '35';

    // 同时匹配SKU和属性
    if ( $variation->get_sku() === $sku_to_find 
         && isset( $variation->get_attributes()[$attribute_name] ) 
         && $variation->get_attributes()[$attribute_name] === $target_value ) {
        // 开启预售
        $data['backorders'] = 'yes';
        // 标记为可售,允许用户购买
        $data['is_in_stock'] = true;
        $data['is_purchasable'] = true;
        // 替换库存提示文本为预售信息
        $data['availability_html'] = '<p class="stock onbackorder">预售中,下单后到货即发</p>';
    }
    return $data;
}

方案2:永久修改后台设置

如果需要让变体的预售状态在后台永久生效,用下面的代码(执行一次后删除,避免重复修改):

function update_variation_to_backorder() {
    $sku_to_find = 'TEST-001';
    $attribute_name = 'pa_size';
    $target_value = '35';

    // 通过SKU获取变体ID
    $variation_id = wc_get_product_id_by_sku( $sku_to_find );
    if ( !$variation_id ) return;

    $variation = wc_get_product( $variation_id );
    if ( !$variation || !$variation->is_type('variation') ) return;

    // 验证属性是否匹配
    $attributes = $variation->get_attributes();
    if ( isset( $attributes[$attribute_name] ) && $attributes[$attribute_name] === $target_value ) {
        // 设置允许预售
        $variation->set_backorders('yes');
        // 设置库存状态为预售
        $variation->set_stock_status('onbackorder');
        // 保存修改到数据库
        $variation->save();
    }
}
// 执行修改,刷新网站后删除这一行
update_variation_to_backorder();

关键注意事项

  • 代码里的$target_value要匹配属性的slug,不是后台显示的属性名称。比如后台属性显示"35",但slug可能是"size-35",需要去WooCommerce属性设置里确认;
  • 建议把代码添加到子主题的functions.php中,避免主题更新时丢失;
  • 永久修改的代码只需要执行一次,刷新网站后记得删除update_variation_to_backorder();这一行,不然每次加载页面都会重复执行修改。

内容的提问来源于stack exchange,提问作者Stan Law

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 15:32:38