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; }
使用说明
- 将代码添加到主题的
functions.php文件,或使用自定义代码插件(如Code Snippets)。 - 可自行修改
str_pad参数、分隔符等调整订单号格式。 - 多产品订单场景下,可修改逻辑(如按主产品生成订单号、生成组合格式订单号)。
内容的提问来源于stack exchange,提问作者asad wasim
相关产品推荐
相关产品推荐

