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 中的订单总额中删除运费总额

WooCommerce - 从 functions.php 文件发送新订单/客户发票电子邮件

如果订单包含来自特定产品类别的商品,则为 WooCommerce 订单号添加前缀

根据多个类别为 WooCommerce 订单号添加前缀

C#从mysql数据库获取锁定代码的关键部分

如何删除 WooCommerce 商店图片?