在多语言WooCommerce站点(Polylang)设置分国别年份前缀的连续订单号
Polylang+WooCommerce 按语言生成独立连续订单编号方案优化
你的现有代码只是给订单添加了固定的IT前缀,但存在两个核心问题:
- 不同语言站点会共用原生订单ID,无法实现各自的连续编号(比如IT和DE可能同时出现-05的编号)
- 没有针对不同语言环境动态切换前缀
下面是满足需求的完整实现方案:
核心思路
- 利用Polylang函数获取当前订单对应的语言代码,动态生成前缀(IT/DE等)
- 为每个语言+年份维护独立的计数器,存储在WordPress选项中,确保编号连续唯一
- 给订单添加自定义元数据存储生成后的编号,避免重复计算
完整代码实现
/** * 按语言生成独立连续订单编号 */ add_filter( 'woocommerce_order_number', 'polylang_custom_order_number', 10, 2 ); function polylang_custom_order_number( $order_id, $order ) { // 检查订单是否已生成自定义编号,避免重复计算 $custom_order_number = get_post_meta( $order_id, '_custom_order_number', true ); if ( ! empty( $custom_order_number ) ) { return $custom_order_number; } // 确保Polylang函数可用 if ( ! function_exists( 'pll_get_post_language' ) ) { return $order_id; } // 获取订单对应的语言代码(转大写) $lang_code = strtoupper( pll_get_post_language( $order_id ) ); if ( empty( $lang_code ) ) { $lang_code = 'IT'; // 默认前缀,可根据需求修改 } // 获取订单创建年份 $order_year = $order->get_date_created()->format( 'Y' ); // 构建计数器选项名 $counter_key = 'wc_order_counter_' . strtolower( $lang_code ) . '_' . $order_year; // 获取当前计数器值,不存在则初始化为1 $current_counter = get_option( $counter_key, 1 ); // 格式化编号:前缀-年份-两位数字编号 $custom_order_number = sprintf( '%s-%s-%02d', $lang_code, $order_year, $current_counter ); // 存储自定义编号到订单元数据 update_post_meta( $order_id, '_custom_order_number', $custom_order_number ); // 更新计数器(自增1) update_option( $counter_key, $current_counter + 1 ); return $custom_order_number; }
关键细节说明
- 语言获取:使用
pll_get_post_language($order_id)获取订单关联的语言,确保订单归属对应语言站点的编号序列 - 计数器存储:每个语言+年份单独维护计数器,比如
wc_order_counter_it_2024存储意大利语2024年的订单编号计数 - 编号格式化:用
%02d确保编号是两位数字(01、02...99),如果需要更多位数可改为%03d(001等) - 避免重复计算:通过自定义元数据
_custom_order_number存储生成的编号,编辑订单时不会重新生成
注意事项
- 确保Polylang已将WooCommerce订单(shop_order)设置为可翻译的自定义文章类型(在Polylang设置的「自定义文章类型」中勾选)
- 首次使用前,可手动在WordPress选项中初始化计数器(比如意大利语2024年已存在3个订单,就设置
wc_order_counter_it_2024的值为4) - 建议在测试环境先验证功能,避免影响线上订单
内容的提问来源于stack exchange,提问作者Luigi Maronese
相关产品推荐
相关产品推荐

