WooCommerce 父订单前缀
Posted
技术标签:
【中文标题】WooCommerce 父订单前缀【英文标题】:WooCommerce Parent Order Prefix 【发布时间】:2021-03-22 12:38:09 【问题描述】:我正在尝试在“父订单”和“子订单”之间实现订单前缀。目前我的订单前缀适用于特定类别的产品,因此“商品”类别和其中的产品具有订单号前缀“M”,“咖啡”中的类别和产品具有前缀“C”,这一切都很好,精彩地看到所附的图像。
我确实在商店中有订阅产品和单品,但我主要只是希望在主订单中显示一个“P”,而不管产品属于哪个类别。
我需要并且希望帮助为父订单添加一个“P”,以便我可以区分父订单和子订单,(请参阅附图)我一生都无法弄清楚这个功能目前我的代码是这个:
add_filter( 'woocommerce_order_number', 'change_woocommerce_order_number' );
function change_woocommerce_order_number( $order_id )
$order = wc_get_order( $order_id );
$category = array();
if ( ! empty($order) )
foreach ( $order->get_items() as $item_id => $item )
$product_id = $item['product_id'];
$terms = get_the_terms ( $product_id, 'product_cat' );
$parent_id = $order->get_parent_id( $parent, 'product_id' );
if ( ! empty($terms) )
foreach ( $terms as $term )
$category[] = $term->term_id;
if ( $parent )
$order_id = 'P - '. $order_id;
else
if ( in_array( 23, $category ) )
$order_id = 'M - '. $order_id;
else
if ( in_array( 16, $category ) )
$order_id = 'C - '. $order_id;
return $order_id;
“M”和“C”完美地工作......只是父订单“P”没有,而不是“P”,我在父订单部分有似乎是随机的 M 或 C。我所有的订单都按类别划分,这仍然按预期工作(请参见图片)。我主要只需要附图左侧的“P”主父订单
Parent Order Prefix 'P' Location
提前致谢。
【问题讨论】:
$parent
变量在$parent_id = $order->get_parent_id( $parent, 'product_id' );
行中没有设置或初始化。或许问题就出在于此。
嗨 Vincenzo 非常感谢您的输入,呃...所以我在这方面是全新的,而且我上面使用的大多数代码都是从这个网站重用的,我将如何设置或初始化 $parent 对象。我觉得我必须像我对 $parent_id 设置所做的那样做,你已经提到但为 $parent 做类似的事情?
你应该解释一下逻辑。什么时候应该分配“P”前缀?编辑您的问题和enter all the minimum information necessary,让其他人了解并解决您的问题。
你使用插件吗? WooCommerce 默认不处理子订单。
您好 Vincenzo,感谢您的回复,我确实使用了一个插件,它被称为“Multi Order for WooCommerce Pro”
【参考方案1】:
您目前仅在 else 语句中返回订单号。
应该总是在函数结束时返回一个值。
另外,$parent
变量未设置,并且您以错误的方式获取父 ID。
试试这个,希望它有效。
如果函数没有父顺序,get_parent_id()
方法返回 0
。
add_filter( 'woocommerce_order_number', 'change_woocommerce_order_number' );
function change_woocommerce_order_number( $order_id )
$order = wc_get_order( $order_id );
$category = array();
if ( ! empty($order) )
foreach ( $order->get_items() as $item_id => $item )
$product_id = $item['product_id'];
$terms = get_the_terms ( $product_id, 'product_cat' );
if ( ! empty($terms) )
foreach ( $terms as $term )
$category[] = $term->term_id;
$parent_id = $order->get_parent_id();
if ( $parent_id > 0 )
if ( in_array( 23, $category ) )
$order_id = 'M - '. $order_id;
else
if ( in_array( 16, $category ) )
$order_id = 'C - '. $order_id;
else
$order_id = 'P - '. $order_id;
return $order_id;
你也可以像这样优化函数:
// change the WooCommerce order number
add_filter( 'woocommerce_order_number', 'change_woocommerce_order_number' );
function change_woocommerce_order_number( $order_id )
$order = wc_get_order( $order_id );
$prefix = '';
$has_cat_id_23 = false;
$has_cat_id_16 = false;
// get the parent order id
$parent_id = $order->get_parent_id();
// if it does not have a parent order it returns the order number with the prefix "P - "
if ( $parent_id == 0 )
$prefix = 'P - ';
return $prefix . $order_id;
// otherwise set the prefix to the child orders
else
foreach ( $order->get_items() as $item_id => $item )
// if the product belongs to the product category with ID 23
if ( has_term( 23, 'product_cat', $item['product_id'] ) )
$has_cat_id_23 = true;
break;
// if the product belongs to the product category with ID 16
if ( has_term( 16, 'product_cat', $item['product_id'] ) )
$has_cat_id_16 = true;
break;
// if the product belongs to the product category with ID 23 set the prefix "M - "
if ( $has_cat_id_23 )
$prefix = 'M - ';
// if the product belongs to the product category with ID 16 set the prefix "C - "
if ( $has_cat_id_16 )
$prefix = 'C - ';
return $prefix . $order_id;
代码已经过测试并且可以运行(我没有安装插件,但实际上只使用了 Wordpress 和 WooCommerce 功能和方法)。结果将如下所示:
试试看,如果它也适合你,请告诉我。
【讨论】:
嗨 Vincenzo,非常感谢您提供的那段代码,我的意思是 P 正在显示,我自己无法工作,但是子订单是主要的块现在需要到位。无论类别如何,所有子订单(产品类别)也显示为 P。我不太确定如何在此评论中添加图片,但我也会使用您的代码,因为我对 P 很兴奋 :) 谢谢。 我设置的唯一控件是父订单ID。您能否确保子订单具有父订单 ID 并且大于零?否则我什么都不懂。还有你试过什么代码?以上是关于WooCommerce 父订单前缀的主要内容,如果未能解决你的问题,请参考以下文章
WooCommerce - 从 functions.php 文件发送新订单/客户发票电子邮件