Get coupon data from WooCommerce orders

前端 未结 1 838
谎友^
谎友^ 2020-11-29 12:36

I have created in WooCommerce two custom coupon types:

function custom_discount_type( $discount_types ) {
    $discount_types[\'cash_back_fixed\'] =__( \'Cas         


        
相关标签:
1条回答
  • 2020-11-29 12:49

    Update 3

    Since WooCommerce 3.7, you should now use the WC_Abstract method get_coupon_codes() on the WC_Order instance object to get the used coupons from an order, as get_used_coupons() method is deprecated.

    So you will replace in the code:

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

    by:

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

    Then you can get coupon details like:

    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
    }
    

    Update 2

    First you can't access anymore WC objects properties since WooCommerce 3.

    You should now use WC_Coupon getter methods to get coupon details from the WC_Coupon Object instance…

    In your case you have to use get_discount_type() method or is_type( 'cash_back_fixed' ) method …

    Here is the way to do it:

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

    To get the coupons discount amounts (and to use also coupons types methods) here is the way:

    $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();
        }
    }
    

    So to get the coupon price, we use the WC_Coupon get_amount() method

    0 讨论(0)
提交回复
热议问题