wc_update_coupon_usage_counts()WC 3.0.0

Update used coupon amount for each coupon within an order.

Return

null. Nothing (null).

Usage

wc_update_coupon_usage_counts( $order_id );
$order_id(int) (required)
Order ID.

Changelog

Since 3.0.0 Introduced.

wc_update_coupon_usage_counts() code WC 9.5.1

function wc_update_coupon_usage_counts( $order_id ) {
	$order = wc_get_order( $order_id );

	if ( ! $order ) {
		return;
	}

	$has_recorded     = $order->get_data_store()->get_recorded_coupon_usage_counts( $order );
	$invalid_statuses = array( 'cancelled', 'failed', 'trash' );

	/**
	 * Allow invalid order status filtering for updating coupon usage.
	 *
	 * @since 9.0.0
	 *
	 * @param array $invalid_statuses Array of statuses to consider invalid.
	 */
	$invalid_statuses = apply_filters(
		'woocommerce_update_coupon_usage_invalid_statuses',
		$invalid_statuses
	);

	if ( $order->has_status( $invalid_statuses ) && $has_recorded ) {
		$action = 'reduce';
		$order->get_data_store()->set_recorded_coupon_usage_counts( $order, false );
	} elseif ( ! $order->has_status( $invalid_statuses ) && ! $has_recorded ) {
		$action = 'increase';
		$order->get_data_store()->set_recorded_coupon_usage_counts( $order, true );
	} elseif ( $order->has_status( $invalid_statuses ) ) {
		$order->get_data_store()->release_held_coupons( $order, true );
		return;
	} else {
		return;
	}

	if ( count( $order->get_coupon_codes() ) > 0 ) {
		foreach ( $order->get_coupon_codes() as $code ) {
			if ( StringUtil::is_null_or_whitespace( $code ) ) {
				continue;
			}

			$coupon  = new WC_Coupon( $code );
			$used_by = $order->get_user_id();

			if ( ! $used_by ) {
				$used_by = $order->get_billing_email();
			}

			switch ( $action ) {
				case 'reduce':
					$coupon->decrease_usage_count( $used_by );
					break;
				case 'increase':
					$coupon->increase_usage_count( $used_by, $order );
					break;
			}
		}
		$order->get_data_store()->release_held_coupons( $order, true );
	}
}