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

WooCommerce自定义订单号:SKU前缀及序列递增实现求助

WooCommerce按产品生成独立序列订单号的问题

我正在搭建WooCommerce网店,想要为不同产品生成不同系列的订单号/发票号。尝试了两段自定义代码后,结账页面均出现“网站发生严重错误”,无法正常使用,我完全不懂自定义编码。

第一次尝试的代码

add_filter( 'woocommerce_order_number', 'change_woocommerce_order_number' );

function change_woocommerce_order_number( $order_id ) {
    $order = new WC_Order( $order_id );
    foreach ( $order->get_items() as $item_key => $item )
    $product = $order->get_product_from_item( $item );
    $sku = $product->get_sku();
    $new_order_id = $sku . $order_id;
    return $new_order_id;
}

第二次尝试的代码

function change_woocommerce_order_number($order_id) {
    $order = new WC_Order($order_id);
    $items = $order->get_items();
    $first_item = $items[0];
    $product_id = $first_item->get_product_id();
    $product = new WC_Product($product_id);
    $sku = $product->get_sku();

    return $sku.$order_id;
}
add_filter('woocommerce_order_number', 'change_woocommerce_order_number');

补充说明

我找到一段可以实现需求的代码,它通过自定义字段作为计数器让订单号按序列递增,但需要为每个产品单独添加这段代码:

add_filter( 'woocommerce_order_number', 'custom_wc_order_number_increment_with_meta', 10, 2 );
function custom_wc_order_number_increment_with_meta( $order_id, $order ) {
    $item    = current( $order->get_items() ); // 获取第一个订单项
    $product = $item->get_product(); // 获取产品对象
    $product_id = $product->get_id(); // 获取产品ID
    $sku     = $product->get_sku(); // 获取产品SKU
    
    // 指定目标产品ID
    $target_product_id = 1234; // 替换为实际产品ID

    if ( $product_id == $target_product_id && $sku ) {
        // 从自定义字段获取当前订单号
        $current_order_number = get_post_meta( $product_id, '_custom_order_number', true );
        
        // 如果没有记录,从1开始
        if ( empty( $current_order_number ) ) {
            $current_order_number = 1;
        }

        // 自定义订单号格式:SKU-0001
        $custom_order_number = $sku . '-' . str_pad($current_order_number, 4, '0', STR_PAD_LEFT);

        // 计数器加1,用于下一次订单
        $new_order_number = $current_order_number + 1;

        // 更新产品的自定义字段记录
        update_post_meta( $product_id, '_custom_order_number', $new_order_number );

        return $custom_order_number;
    }

    return $order_id; // 非目标产品返回默认订单号
}

问题分析与优化方案

前两段代码报错原因

  • 第一段代码:foreach循环缺少大括号,逻辑混乱,仅第一行属于循环;且未处理订单无商品的情况,会直接调用$product->get_sku()引发致命错误。
  • 第二段代码:直接通过$items[0]获取订单项,若订单为空或get_items()返回对象而非数组时会报错;同时未处理产品不存在、SKU为空的边界情况。

通用优化代码(无需为每个产品单独添加)

以下代码自动为所有产品生成独立递增的订单号序列,无需重复编写:

add_filter( 'woocommerce_order_number', 'wc_per_product_unique_incrementing_order_number', 10, 2 );
function wc_per_product_unique_incrementing_order_number( $order_id, $order ) {
    // 获取第一个订单项(多产品订单可按需调整逻辑)
    $item = current( $order->get_items() );
    if ( !$item ) return $order_id;

    $product = $item->get_product();
    if ( !$product ) return $order_id;

    $product_id = $product->get_id();
    $sku = $product->get_sku() ?: $product_id; // SKU为空时用产品ID替代

    // 获取该产品的订单计数器,无记录则从1开始
    $counter = get_post_meta( $product_id, '_wc_product_order_counter', true );
    $counter = empty( $counter ) ? 1 : (int)$counter;

    // 自定义订单号格式,可按需调整位数、分隔符
    $custom_order_number = $sku . '-' . str_pad( $counter, 4, '0', STR_PAD_LEFT );

    // 更新计数器,供下一次订单使用
    update_post_meta( $product_id, '_wc_product_order_counter', $counter + 1 );

    return $custom_order_number;
}

使用说明

  1. 将代码添加到主题的functions.php文件,或使用自定义代码插件(如Code Snippets)。
  2. 可自行修改str_pad参数、分隔符等调整订单号格式。
  3. 多产品订单场景下,可修改逻辑(如按主产品生成订单号、生成组合格式订单号)。

内容的提问来源于stack exchange,提问作者asad wasim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 05:43:09