从 WooCommerce 订单中获取优惠券数据

Posted

技术标签:

【中文标题】从 WooCommerce 订单中获取优惠券数据【英文标题】:Get coupon data from WooCommerce orders 【发布时间】:2017-12-12 03:06:35 【问题描述】:

我在 WooCommerce 中创建了两种自定义优惠券类型:

function custom_discount_type( $discount_types ) 
    $discount_types['cash_back_fixed'] =__( 'Cash Back fixed discount', 'woocommerce' );
     $discount_types['cash_back_percentage'] =__( 'Cash Back Percentage discount', 'woocommerce' );
         return $discount_types;

     

add_filter( 'woocommerce_coupon_discount_types', 'custom_discount_type',10, 1);

我想在订单状态为“完成”后获取折扣类型,例如:

function wc_m_move_order_money_to_user( $order_id, $old_status, $new_status )

    if( $order->get_used_coupons() ) 
        if ($coupon->type == 'cash_back_fixed') 
           $coupons_amont =  ???
           ....

       
    

但是$coupon->type 不起作用。

如何获取订单中使用的优惠券类型? 以及如何获得原始优惠券金额?。

谢谢

【问题讨论】:

如何找到优惠券金额(不是订单中使用的优惠券金额) 感谢您对我的支持。现在删除了重复的问题。 【参考方案1】:

更新 3

从 WooCommerce 3.7 开始,您现在应该在 WC_Order 实例对象上使用 WC_Abstract 方法 get_coupon_codes() 从订单中获取已使用的优惠券,因为 get_used_coupons() 方法已弃用

所以你将在代码中替换:

foreach( $order->get_used_coupons() as $coupon_code )

作者:

foreach( $order->get_coupon_codes() as $coupon_code )

然后您可以获得优惠券详细信息,例如:

foreach( $order->get_coupon_codes() as $coupon_code ) 
    // Get the WC_Coupon object
    $coupon = new WC_Coupon($coupon_code);

    $discount_type = $coupon->get_discount_type(); // Get coupon discount type
    $coupon_amount = $coupon->get_amount(); // Get coupon amount


更新 2

首先,自 WooCommerce 3 以来,您无法再访问 WC 对象属性。

您现在应该使用 WC_Coupon getter methods 从 WC_Coupon 对象实例中获取优惠券详细信息...

在您的情况下,您必须使用get_discount_type() 方法或is_type( 'cash_back_fixed' ) 方法......

方法如下:

// Get an instance of WC_Order object
$order = wc_get_order( $order_id );

// Coupons used in the order LOOP (as they can be multiple)
foreach( $order->get_used_coupons() as $coupon_code )

    // Retrieving the coupon ID
    $coupon_post_obj = get_page_by_title($coupon_code, OBJECT, 'shop_coupon');
    $coupon_id       = $coupon_post_obj->ID;

    // Get an instance of WC_Coupon object in an array(necessary to use WC_Coupon methods)
    $coupon = new WC_Coupon($coupon_id);

    // Now you can get type in your condition
    if ( $coupon->get_discount_type() == 'cash_back_percentage' )
        // Get the coupon object amount
        $coupon_amount1 = $coupon->get_amount();
    

    // Or use this other conditional method for coupon type
    if( $coupon->is_type( 'cash_back_fixed' ) )
        // Get the coupon object amount
        $coupon_amount2 = $coupon->get_amount();
    


要获得优惠券折扣金额(也可以使用优惠券类型方法),方法如下:

$order = wc_get_order( $order_id );

// GET THE ORDER COUPON ITEMS
$order_items = $order->get_items('coupon');

// print_r($order_items); // For testing

// LOOP THROUGH ORDER COUPON ITEMS
foreach( $order_items as $item_id => $item )

    // Retrieving the coupon ID reference
    $coupon_post_obj = get_page_by_title( $item->get_name(), OBJECT, 'shop_coupon' );
    $coupon_id = $coupon_post_obj->ID;

    // Get an instance of WC_Coupon object (necessary to use WC_Coupon methods)
    $coupon = new WC_Coupon($coupon_id);

    ## Filtering with your coupon custom types
    if( $coupon->is_type( 'cash_back_fixed' ) || $coupon->is_type( 'cash_back_percentage' ) )

        // Get the Coupon discount amounts in the order
        $order_discount_amount = wc_get_order_item_meta( $item_id, 'discount_amount', true );
        $order_discount_tax_amount = wc_get_order_item_meta( $item_id, 'discount_amount_tax', true );

        ## Or get the coupon amount object
        $coupons_amount = $coupons->get_amount();
    


所以要获得优惠券价格,我们使用WC_Coupon get_amount()方法

【讨论】:

这太棒了!我们如何从购物车/会话而不是订单中获取此信息?【参考方案2】:

在我的情况下,如果使用了特定的优惠券并支付了订单(因此,如果处理状态参与),我需要将新订单更改为“预订”(系统中已添加自定义状态)。

function change_status_to_preorder($order_id) 
    
    $order          = new WC_Order($order_id);
    $coupon_codes   = $order->get_coupon_codes();
    
    if(in_array('MYCOUPON', $coupon_codes) && $order->get_status() == 'processing') 
        $order->update_status('wc-pre-order', 'AUTO: note to shop manager');
    

add_action('woocommerce_new_order', 'change_status_to_preorder', 1, 1);

【讨论】:

以上是关于从 WooCommerce 订单中获取优惠券数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Woocommerce 购物车页面中添加订单备注字段?

Woocommerce如何从订单对象中获取元值

隐藏 woocommerce 订单页面了解更多按钮

sql 从Woocommerce订单获取客户数据

Woocommerce Subscription 使用 API 从订单 id 获取 id

如何从 WooCommerce 中的订单密钥中获取订单 ID?