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

如何为WooCommerce店铺不同产品设置专属订单/发票号序列?

嘿,这个需求我之前帮客户做过,完全可以实现!分两种方案给你,看你更倾向哪种:


方案1:按产品类型生成独立前缀的自增订单号序列

这个是完全匹配你需求的方案——不同产品类型用独立的前缀+自增数字(比如AA001、BB002这种),核心是利用WooCommerce的woocommerce_order_number钩子,同时把每个前缀的自增计数存在WordPress的选项表里,保证每个序列独立递增。

实现代码(添加到主题的functions.php或自定义插件里)

add_filter('woocommerce_order_number', 'custom_order_number_by_product_type', 10, 2);
function custom_order_number_by_product_type($order_id, $order) {
    // 定义产品类型对应的前缀(把这里的slug换成你实际的产品分类/自定义属性值)
    $product_prefix_map = array(
        'aa-product' => 'AA', // 假设产品AA的分类slug是aa-product
        'bb-product' => 'BB'  // 产品BB的分类slug是bb-product
    );

    // 获取订单里的第一个产品(如果订单有多类产品,这里可以调整逻辑,比如取金额最高的)
    $items = $order->get_items();
    $first_item = reset($items);
    $product = $first_item->get_product();
    
    // 获取产品的分类(如果用的是自定义属性,改成get_attribute('pa_product-type')这种)
    $product_terms = wp_get_post_terms($product->get_id(), 'product_cat');
    $product_slug = $product_terms[0]->slug;

    // 如果匹配到前缀,生成对应订单号
    if (isset($product_prefix_map[$product_slug])) {
        $prefix = $product_prefix_map[$product_slug];
        // 获取当前前缀的自增计数,默认从1开始
        $count = get_option('wc_' . $prefix . '_order_count', 1);
        // 格式化订单号,补零到3位(可以改成你需要的位数)
        $order_number = $prefix . str_pad($count, 3, '0', STR_PAD_LEFT);
        // 更新计数,下次用的时候+1
        update_option('wc_' . $prefix . '_order_count', $count + 1);
        return $order_number;
    }

    // 如果没有匹配到,返回默认订单号
    return $order_id;
}

注意事项

  • 如果你用的是产品自定义属性(不是分类)来区分AA/BB,把代码里获取分类的部分改成$product->get_attribute('pa_你的属性名'),然后调整$product_prefix_map的键为属性值。
  • 如果订单包含多种产品,代码里默认取第一个产品的类型,你可以改成只允许单类产品下单(加个验证),或者按金额最高的产品来判断。
  • 初始计数可以在WordPress后台的wp_options表里手动修改,或者直接在get_option里改默认值。

方案2:给发票号添加自定义前缀(简化版)

如果觉得维护独立序列太麻烦,也可以给发票号加对应前缀,用原订单号的数字部分,不用单独维护计数。比如原订单号是123,AA产品的发票号就是AA123,BB的就是BB123。

实现代码

假设你用的是WooCommerce自带的发票功能(或者支持钩子的发票插件),用woocommerce_invoice_number钩子:

add_filter('woocommerce_invoice_number', 'custom_invoice_prefix_by_product', 10, 2);
function custom_invoice_prefix_by_product($invoice_number, $order) {
    $product_prefix_map = array(
        'aa-product' => 'AA',
        'bb-product' => 'BB'
    );

    $items = $order->get_items();
    $first_item = reset($items);
    $product = $first_item->get_product();
    $product_terms = wp_get_post_terms($product->get_id(), 'product_cat');
    $product_slug = $product_terms[0]->slug;

    if (isset($product_prefix_map[$product_slug])) {
        return $product_prefix_map[$product_slug] . $invoice_number;
    }

    return $invoice_number;
}

如果你的发票插件用的是其他钩子,比如wc_invoice_number,直接把钩子名换掉就行。


这两个方案都是纯代码实现,不用装额外插件,稳定性很高。如果调试的时候遇到计数不更新的问题,检查下是不是缓存影响了get_option的读取,或者产品类型的判断逻辑有没有错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:56:14