Get coupon data from WooCommerce orders
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 theWC_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 ITEMSforeach( $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
In my case, I needed to change new orders to "pre-order" (custom status already added in system) if specific coupon used and order paid (so, if processing status engaged).
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);