在WooCommerce订单中获取优惠券折扣类型和金额

时间:2017-07-07 18:08:30

标签: php wordpress woocommerce orders coupon

我在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不起作用。

如何获得订单中使用的优惠券类型?
我怎样才能获得原始优惠券金额?。

由于

2 个答案:

答案 0 :(得分:15)

<强>更新

首先,您不能再访问WC对象属性,因为WooCommerce 3+并且您需要使用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_name ){

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

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

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

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

获取优惠券折扣金额(以及使用优惠券类型方法)的方法如下:

global $wpdb;
$order = wc_get_order( $order_id );

## GET THE ORDER LINE ITEMS
$table = $wpdb->prefix . "woocommerce_order_items";
$order_items = $wpdb->get_results( "SELECT  *  FROM  $table  WHERE  order_id = $order_id ");

print_r($order_items);

## GET THE COUPONS AMOUNTS IN THE ORDER
foreach( $order_items as $item_values ){

    // Targeting "coupon" order item type
    if( 'coupon' == $item_values->order_item_type ){

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

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

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

            // Get the corresponding Item ID
            $item_id = $item_values->order_item_id;

            // 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_obj->get_amount();
        }
    }
}
  

现在要获得 WC_Coupon 价格,只需使用 get_amount() 方法

答案 1 :(得分:0)

就我而言,如果使用特定优惠券并支付订单(因此,如果处理状态已启用),我需要将新订单更改为“预购”(系统中已添加自定义状态)。

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);