如何为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
相关产品推荐
相关产品推荐

